Aller au contenu

Utilisez les outils de Percona pour les grandes bases de données GLPI#

Qui est Percona ?#

Percona est l'un des principaux fournisseurs de solutions de bases de données open source impartiales, ils offrent une large gamme de produits (complète, du serveur de base de données/solution de clustering aux outils de surveillance ou d'administration).

Quel outil utiliser et pourquoi ?#

Pour les changements (modification des colonnes ou la migration des données) dans de grandes bases de données GLPI, basée sur MySQL / MariaDB, vous pouvez utiliser l'outil "pt-online-schema-change" qui est inclus dans le "percona-toolkit" développé par Percona, par exemple :

  • Convertir toutes les données du moteur MyISAM vers le moteur InnoDB.
  • Migrer toutes les colonnes de DATETIME vers le format TIMESTAMP (pour le support des fuseaux horaires)
  • Ajout / suppression / récupération d'un index sur la table glpi_logs.

Par "grande base de données", nous entendons celles dont la table glpi_logs dépasse 5 Go de données, mais il est bien sûr possible d'utiliser ces outils sur toutes les bases de données (quelle que soit leur taille).

pt-online-schema-change est plus efficace et plus sûr que les outils en ligne de commande (bin/console) fournis dans la version de base de GLPI (utile pour les bases de données moins importantes).

Documentation officielle#

Risques#

Comme indiqué dans la documentation officielle :

Percona Toolkit est mature, a fait ses preuves dans le monde réel et a été bien testé, mais tous les outils de base de données peuvent présenter un risque pour le système et le serveur de base de données (comme tous les autres outils sysadmin/DBA).

Attention

Avant d'utiliser cet outil, veuillez :

  • Lisez la documentation de l'outil
  • Passez en revue les "BUGS" connus de l'outil.
  • Testez l'outil sur un serveur de non-production
  • Sauvegarder votre serveur de production et vérifier les sauvegardes.

TECLIB ne peut être tenu responsable d'une mauvaise utilisation conduisant à une perte de données.

Avertissement sur l'utilisation du disque#

Le principe de pt-online-schema-change est de créer une table temporaire qui correspond au ALTER que vous voulez faire, puis de copier les données de l'ancienne table vers la nouvelle, et de supprimer l'ancienne table si tout est ok.

Faites donc attention à l'utilisation de l'espace disque : il va temporairement doubler (ou tripler), puis revenir à la normale (ou diminuer en cas d'"OPTIMIZE").

Espace disque

Si votre table glpi_logs (avant intervention) fait 25GB, nous recommandons d'avoir un espace disque libre d'au moins 50/75GB pour effectuer l'opération.

Avertissement sur le temps d'exécution#

Bien que grâce à cet outil, les migrations de données soient beaucoup plus rapides (qu'avec l'outil bin/console de GLPI), nous conseillons toujours (comme tout bon administrateur système Linux qui se respecte) d'exécuter toutes vos commandes dans un terminal virtuel ou un multiplexeur de terminal (comme : tmux ou screen).

Si pour une raison quelconque vous perdez la connexion/session SSH, étant dans un terminal virtuel l'exécution de votre commande continuera sans vous ! 😎

Exemple avec tmux

  • Sur Ubuntu 20.04 LTS : apt-get install tmux
  • Créez une nouvelle session tmux : tmux new -s innodb_migration
  • Exécutez vos commandes ...
  • Détachez sans fermer la session : CTRL+b puis dclé
  • Connectez-vous à la session existante : tmux attach -t innodb_migration
  • Quitter une session : exit

Migrer les données de MyISAM vers InnoDB#

Commande GLPI :

Commande pt-online-schema-change :

  • --alter "ENGINE=InnoDB"

Voici l'utilisation complète du client, vous pouvez tester avec --dry-run au lieu de --execute :

$ pt-online-schema-change \
    --alter "ENGINE=InnoDB" \
    --ask-pass \
    --execute \
    D=glpi,t=glpi_logs,u=root,h=localhost

Vous pouvez modifier les variables :

  • u comme base de données utilisateur
  • h comme base de données de l'hôte
  • D comme nom de la base de données
  • t comme table glpi à modifier

Utiliser le type de données timestamp#

Commande GLPI :

Commande pt-online-schema-change :

  • --alter "MODIFY COLUMN date_mod TIMESTAMP NULL DEFAULT NULL"

Voici l'utilisation complète du client, vous pouvez tester avec --dry-run au lieu de --execute :

$ pt-online-schema-change \
    --alter "MODIFY COLUMN date_mod TIMESTAMP NULL DEFAULT NULL" \
    --ask-pass \
    --execute \
    D=glpi,t=glpi_logs,u=root,h=localhost

Vous pouvez modifier les variables :

  • u comme base de données utilisateur
  • h comme base de données de l'hôte
  • D comme nom de la base de données
  • t comme table glpi à modifier

Réparer les INDEX corrompus#

Si par accident ou par erreur, les INDEX d'une de vos tables sont corrompus (vous l'avez découvert grâce à la commande MySQL CHECK), nous vous recommandons de réexécuter la commande --alter "ENGINE=InnoDB", vos INDEX de table seront reconstruits tout en gardant vos données en sécurité.

Récupérer de l'espace disque après avoir supprimé des données#

Après avoir fait beaucoup de nettoyage dans votre table glpi_logs (en supprimant des millions de lignes par exemple) vous vous rendez compte que l'espace disque utilisé n'a pas changé du côté du système de fichiers.

Sans entrer dans les détails du fonctionnement du moteur de stockage InnoDB, dites-vous que c'est normal : vous devez "OPTIMISER" votre table.

Pour ce faire, nous vous recommandons une nouvelle fois de relancer la commande --alter "ENGINE=InnoDB", votre table INDEXs sera reconstruite tout en gardant vos données en sécurité et en récupérant l'espace disque utilisé.

Exécution pour toutes les tables#

Voici un script pour modifier toutes les tables d'une base de données spécifique.

Assurez-vous d'adapter la commande ALTER_COMMAND avec la bonne action à effectuer (voir les chapitres précédents).

(vous pouvez tester avec --dry-run au lieu de --execute)

#!/bin/bash

DBNAME=glpi
DBUSER=root
DBPWD=password
DBHOST=localhost
ALTER_COMMAND="MODIFY COLUMN date_mod TIMESTAMP NULL DEFAULT NULL"

for TABLENAME in $(mysql -h$DBHOST -u$DBUSER -p$DBPWD --batch --column-names=false -e "show tables" $DBNAME);
do
    pt-online-schema-change \
        --alter $ALTER_COMMAND \
        --execute \
        D=$DBNAME,t=$TABLENAME,u=$DBUSER,p=$DBPWD,h=$DBHOST
done