Login Logout

Howto MySQL : mariabackup.

Vue d’ensemble

Mariabackup est un outil qui permet de faire un backup physique d’une instance mysql / mariadb avec les moteurs InnoDB / Aria et MyISAM. Pour InnoDB un backup “à chaud” est possible, qui a originellement été introduit dans Percona XtraBackup 2.3.8

MariaDB 10.1 a introduit des fonctionnalités exclusives à MariaDB telles que la compression des pages (InnoDB Page Compression) et le chiffrement des données (Data-at-Rest Encryption), ces fonctionnalités exclusives ne sont pas prise en charge par des autres solutions de backup, telles que Percona XtraBackup.

Mariabackup supporte toutes les fonctionnalités de Percona XtraBackup, et celles exclusives a MariaDB telles que :

  • Sauvegarde et restauration des tables utilisant Data-at-Rest Encryption.
  • Sauvegarde et restauration des tables utilisant InnoDB Page Compression.
  • mariabackup SST method avec un cluster Galera.
  • Sauvegarde et restauration des tables utilisant MyRocks comme moteur de stockage à partir de MariaDB 10.2.16 and MariaDB 10.3.8

Différences avec Percona XtraBackup

  • Percona XtraBackup copie ses fichiers de journalisation InnoDB dans le fichier xtrabackup_logfile, tandis que Mariabackup utilise le fichier ib_logfile0.
  • Il n’y a pas de lien symbolique entre mariabackup et innobackupex, comme pour xtrabackup. À la place, mariabackup a l’option de ligne de commande –innobackupex pour activer les options compatibles avec innobackupex.
  • Les options –compact et –rebuild_indexes de XtraBackup ne sont pas supportées.
  • L’utilitaire xbstream de XtraBackup a été renommé mbstream. Cependant, pour sélectionner ce format de sortie lors de la création d’une sauvegarde, l’option –stream de Mariabackup attend toujours la valeur xbstream.
  • Mariabackup ne supporte pas l’option lockless binlog d’XtraBackup.

Installer Mariabackup

L’exécutable mariabackup est inclus dans le paquet mariadb-client sur Debian 9.

# apt install mariadb-client

Sur Debian 10 mariabackup est présent dans le paquet mariadb-backup :

# apt install mariadb-backup

Un utilisateur spécifique a Mariabackup doit être créer, avec les droits RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT :

MariaDB > GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'mariabackup'@'localhost' IDENTIFIED BY 'foobarcorp';

Les informations du compte mariabackup peuvent être spécifié dans un groupe d’option client dans le fichier .my.cnf comme ceci :

[mariabackup]
user=mariabackup
password=foobarcorp

Sauvegarde complète (Full Backup)

Afin de sauvegarder la base de données, vous devez exécuter Mariabackup avec l’option –backup pour lui indiquer d’effectuer une sauvegarde et avec l’option –target-dir pour lui indiquer où placer les fichiers de sauvegarde. Lors d’une sauvegarde complète, le répertoire cible doit être vide ou ne pas exister.

Pour créer un backup, exécuter la commande suivante :

# mariabackup --backup --target-dir=/home/mariabackup/ --user=mariabackup --password=foobarcorp

Note : Les options –user et –password n’ont pas besoin d’être précisé si on les gères dans le .my.cnf

La durée de la sauvegarde dépend de la taille des bases de données ou des tables que vous sauvegardez. Vous pouvez annuler la sauvegarde si nécessaire, car le processus de sauvegarde ne modifie pas la base de données.

Sauvegarde compressé

On peux effectué une sauvegarde complète et compressé en passant l’option –stream=xbstream et en redirigeant la sortie vers un utilitaire de compression, comme gzip :

mariabackup --user=mariabackup --backup --stream=xbstream | gzip > backup.gz

Pour décompresser on utilisera la commande suivante :

gunzip -c backup.gz | mbstream -x

Cela décompresse l’archive dans le répertoire courant.

Il existe l’option –compress dans mariabackup, mais celle-ci va être déprécié.

Restauration complète

Préparation du backup

Les fichiers de données créés par Mariabackup dans le répertoire cible ne sont pas cohérents à un point dans le temps, étant donné que les fichiers de données sont copiés à différents moments de la sauvegarde.

Si vous essayez de restaurer à partir de ces fichiers, InnoDB remarque les incohérences et va planté pour protéger les bases de données contre la corruption.

Avant de pouvoir restaurer à partir d’une sauvegarde, vous devez d’abord la préparer pour rendre les fichiers de données cohérents. Vous pouvez le faire avec l’option –prepare :

# mariabackup --prepare --target-dir=/home/mariabackup/

Restauration du backup

Une fois la préparation de la sauvegarde terminée, vous pouvez la restaurer en utilisant les options –copy-back ou –move-back.

L’option –move-back déplace les fichiers de sauvegarde vers le datadir, ainsi les fichiers de la sauvegarde d’origine sont perdus.

Voici la provédure pour restauré un backup :

  • Tout d’abord, arrêtez le processus MariaDB Server.
  • Ensuite, assurez-vous que le datadir soit vide.
  • Ensuite, lancez Mariabackup avec l’une des options mentionnées ci-dessus:
# mariabackup --copy-back --target-dir=/home/mariabackup/
  • Ensuite, vous devrez peut-être corriger les droits des fichiers :
# chown -R mysql:mysql /var/lib/mysql/

Lorsque Mariabackup restaure une base de données, il conserve les privilèges de fichier et de répertoire de la sauvegarde. Cependant, il écrit les fichiers sur le disque en tant qu’utilisateur et groupe restaurant la base de données.

En tant que tel, après la restauration d’une sauvegarde, vous devrez peut-être ajuster le propriétaire du répertoire de données pour qu’il corresponde à l’utilisateur et au groupe du serveur MariaDB, généralement mysql pour les deux.

Sauvegarde incrémentielle avec Mariabackup

Lorsque vous utilisez Mariabackup, vous avez la possibilité d’effectuer une sauvegarde complète ou incrémentielle. Les sauvegardes complètes créent une copie complète dans un répertoire vide tandis que les sauvegardes incrémentielles mettent à jour une sauvegarde précédente avec de nouvelles données.

Les pages InnoDB contiennent des numéros de séquence de journal, ou LSN. Chaque fois que vous modifiez une ligne sur une table InnoDB de la base de données, le moteur de stockage incrémente ce nombre.

Lors de l’exécution d’une sauvegarde incrémentielle, Mariabackup vérifie la sauvegarde la plus récente du LSN par rapport aux LSN contenus dans la base de données. Il met ensuite à jour tous les fichiers de sauvegarde en retard.

Mise en place de la sauvegarde incrémentielle

Pour effectuer une sauvegarde incrémentielle, vous devez d’abord effectuer une sauvegarde complète, comme vu précédemment :

# mariabackup --backup --target-dir=/home/mariabackup/

Ceci sauvegarde toutes les bases de données dans le répertoire cible /home/mariabackup/ Si vous regardez dans ce répertoire dans le fichier xtrabackup_checkpoints, vous pouvez voir les données de LSN fournies par InnoDB :

# cat /home/mariabackup/xtrabackup_checkpoints

backup_type = full-prepared
from_lsn = 0
to_lsn = 6902092065
last_lsn = 6902092065
recover_binlog_info = 0

Une fois que vous avez créé une sauvegarde complète sur votre système, vous pouvez également sauvegarder les modifications incrémentielles aussi souvent que vous le souhaitez.

Pour effectuer une sauvegarde incrémentielle, vous devez exécuter Mariabackup avec l’option –backup pour lui indiquer d’effectuer une sauvegarde et avec l’option –target-dir pour lui indiquer où placer les modifications incrémentielles.

Le répertoire cible doit être vide. Vous devez également l’exécuter avec l’option –incremental-basedir pour lui indiquer le chemin d’accès à la sauvegarde complète effectuée ci-dessus :

mariabackup --backup --target-dir=/home/mariabackup/inc1/ --incremental-basedir=/home/mariabackup/

Cette commande crée une série de fichiers delta qui stockent les modifications incrémentielles dans /home/mariabackup/inc1/ Vous pouvez trouver un fichier xtrabackup_checkpoints similaire dans ce répertoire, avec les valeurs LSN mises à jour :

# cat /home/mariabackup/inc1/xtrabackup_checkpoints 

backup_type = incremental
from_lsn = 6902092065
to_lsn = 6909766286
last_lsn = 6909766286
recover_binlog_info = 0

Pour effectuer des sauvegardes incrémentielles supplémentaires, vous pouvez ensuite utiliser le répertoire de base incrémentiel de la sauvegarde incrémentielle précédente comme répertoire cible pour la prochaine sauvegarde incrémentielle :

# mariabackup --backup --target-dir=/home/mariabackup/inc2/ --incremental-basedir=/home/mariabackup/inc1/

Restauration d’un sauvegarde incrémentielle

En suivant les étapes ci-dessus, vous avez trois sauvegardes dans /home/mariabackup/ : la première est une sauvegarde complète, les autres sont incrémentées sur cette première sauvegarde.

Pour restaurer une sauvegarde dans la base de données, vous devez d’abord appliquer les sauvegardes incrémentielles à la sauvegarde complète de base. Ceci est fait en utilisant l’option de commande –prepare avec l’option –apply-log-only.

Premièrement, nous préparons le backup de base :

# mariabackup --prepare --apply-log-only --target-dir=/home/mariabackup/

Ensuite, appliquez les modifications incrémentielles à la sauvegarde complète de base :

# mariabackup --prepare --apply-log-only --target-dir=/home/mariabackup/ --incremental-dir=/home/mariabackup/inc1/

L’exécution de cette commande met la sauvegarde complète de base, c’est-à-dire /home/mariabackup/, en synchronisation avec les modifications contenues dans la première sauvegarde incrémentielle. Répétez l’étape ci-dessus pour appliquer les modifications de la sauvegarde /home/mariabackup/inc2/ à la base :

# mariabackup --prepare --apply-log-only --target-dir=/home/mariabackup/ --incremental-dir=/home/mariabackup/inc2/

Restauration du backup incrémentiel

Nous pouvons désormais restaurer le backup de la même manière que cité plus haut :

  • Arrêtez le processus MariaDB Server, assurez-vous que le datadir soit vide, lancez Mariabackup comme ceci :
# mariabackup --copy-back --target-dir=/home/mariabackup/

Assurez-vous que les droits de /var/lib/mysql/ soit correct.

Mise en place d’une réplication esclave avec Mariabackup

Mariabackup facilite la configuration d’un esclave de réplication à l’aide d’une sauvegarde complète.

La première étape consiste simplement à prendre et à préparer une nouvelle sauvegarde complète d’un serveur de base de données dans la topologie de réplication.

Si le serveur de base de données source est le maître de réplication souhaité, il n’est pas nécessaire d’ajouter d’autres options lors de la sauvegarde complète.

# mariabackup --backup --target-dir=/home/mariabackup/

Si le serveur de base de données source est un esclave de réplication nous devrions ajouter l’option –slave-info et éventuellement l’option –safe-slave-backup :

# mariabackup --backup --slave-info --safe-slave-backup --target-dir=/home/mariabackup/

Et puis nous préparons la sauvegarde comme vous le feriez normalement :

# mariabackup --prepare --target-dir=/home/mariabackup/

Copier le backup sur le nouveau serveur esclave

Une fois que le backup est terminé et préparé, nous pouvons le copier sur le nouveau serveur esclave :

rsync -avrP /home/mariabackup/ root@sql2:/home/mariabackup

Restauration du backup sur le nouveau serveur esclave

À ce stade, nous pouvons restaurer la sauvegarde dans le datadir, comme vous le feriez normalement :

# mariabackup --copy-back --target-dir=/home/mariabackup/

Note : il faut s’assurer que aucun processus mysql ne tourne sur le slave, et que le datadir soit vide_

Et ajuster les droits des fichiers, si nécessaire:

# chown -R mysql:mysql /var/lib/mysql/

Configuration du nouveau serveur slave

Il faut maintenant configuré correctement notre serveur slave, comme nous ne faisons d’habitude, c’est à dire, création de l’utilisateur mysql ‘repl’ et configuration du server-id :

MariaDB > CREATE USER 'repl'@'sql2' IDENTIFIED BY 'ReplPassWord';
MariaDB > GRANT REPLICATION SLAVE ON *.*  TO 'repl'@'sql2';
vim /etc/mysql/mariadb.conf.d/zzz-evolinux-custom.cnf

server-id = 3

Démarrer la réplication sur le nouveau serveur slave

À ce stade, nous devons obtenir les coordonnées de réplication du maître à partir du répertoire de sauvegarde d’origine.

Si nous prenons la sauvegarde sur le maître, les coordonnées seront dans le fichier xtrabackup_binlog_info.

Si nous prenons la sauvegarde sur un autre esclave et si nous fournissons l’option –slave-info, alors les coordonnées seront dans le fichier xtrabackup_slave_info.

cat /home/mariabackup/xtrabackup_binlog_info

mysql-bin.000002	327	0-1-2

Mariabackup vide les coordonnées de réplication sous deux formes: les coordonnées GTID, le fichier journal binaire et les coordonnées de position, comme celles que vous verriez normalement à partir de la sortie SHOW MASTER STATUS.

Nous pouvons choisir le jeu de coordonnées à utiliser pour configurer la réplication.

Quelles que soient les coordonnées utilisées, nous devrons configurer la connexion principale à l’aide de CHANGE MASTER TO, puis démarrer les threads de réplication avec START SLAVE

  • Par GTID : Si nous voulons utiliser des GTID, nous devons d’abord définir gtid_slave_pos sur les coordonnées GTID extraites de xtrabackup_binlog_info dans le répertoire de sauvegarde, puis MASTER_USE_GTID = slave_pos dans la commande CHANGE MASTER TO, comme ceci :
SET GLOBAL gtid_slave_pos = "0-1-2";
CHANGE MASTER TO 
   MASTER_HOST="sql1", 
   MASTER_PORT=3307, 
   MASTER_USER="repl",  
   MASTER_PASSWORD="ReplPassWord", 
   MASTER_USE_GTID=slave_pos;
START SLAVE;
  • Par fichier et position : Si nous voulons utiliser les binlogs et les coordonnées de position, nous définirions MASTER_LOG_FILE et MASTER_LOG_POS dans la commande CHANGE MASTER TO avec les coordonnées du binlog extraite de /home/mariabackup/xtrabackup_binlog_info ou de xtrabackup_slave_info dans le répertoire de sauvegarde, selon que la la sauvegarde a été effectuée auprès du maître ou d’un esclave du maître :
CHANGE MASTER TO 
   MASTER_HOST="sql1", 
   MASTER_PORT=3307, 
   MASTER_USER="repl",  
   MASTER_PASSWORD="ReplPassWord", 
   MASTER_LOG_FILE='mysql-bin.000002',
   MASTER_LOG_POS=327;
START SLAVE;

Fonctionnement de MariaBackup

Voici les différentes étapes du fonctionnement de MariaBackup lors d’un backup complet.

Phase d’initialisation

  • Connexion à l’instance mysqld, récupération des variables importantes comme datadir ,InnoDB pagesize, encryption keys, encryption plugin etc…
  • Scan du répertoire de la base de donnée, du datadir, recherche des tablespaces InnoDB et chargement des tablespaces.
  • Si –lock-ddl-per-table est utilisé : Des verrous MDL (Metadata Locking) sont fait pour les tablespaces InnoDB. Cela permet de s’assurer qu’il n’ya pas de table ALTER, RENAME, TRUNCATE ou DROP sur les tables que nous voulons copier.
  • Si –lock-ddl-per-table n’est pas utilisé : Mariabackup devra connaître toutes les tables créées ou modifiées au cours de la sauvegarde. Pour plus d’information voir https://jira.mariadb.org/browse/MDEV-16791

Manipulation des Redo Log.

Un thread dédié à mariabackup est démarré pour copier le journal de restauration InnoDB (ib_logfile *).

  • Cela est nécessaire pour enregistrer toutes les modifications effectuées pendant l’exécution de la sauvegarde.
  • Le journal est également utilisé pour détecter si des TRUNCATE ou ONLINE ALTER TABLE sont effectués.
  • On présume que le processus de copie est capable de rattraper les informations du serveur, pendant la copie, si le Redo Log est assez gros.

Phase de copie des Tablespaces InnoDB

  • Copie des Tablespaces InnoDB sélectionné, fichier par fichier, dans les threads dédiés de Mariabackup, sans impliquer le serveur mysqld.
  • Il s’agit d’une copie “sécurisé”, elle vérifié la cohérence des données avec la somme de contrôle.
  • Les fichiers ne sont pas cohérent dans un point dans le temps (point-in-time consistent), car les données peuvent être modifié pendant la copie.
  • L’idée est que la récupération d’InnoDB, notament avec les redo log, le rendrait cohérent a un moment précis dans le temps.

Création d’un point de sauvegarde cohérent

  • Exécution de FLUSH TABLE WITH READ LOCK. Ceci est effectué par défaut, si l’option –no-lock n’est pas passé. La raison pour laquelle FLUSH est nécessaire est de s’assurer que toutes les tables sont dans un état cohérent exactement au même moment, indépendamment du moteur de stockage.

  • Si –lock-ddl-per-table est utilisé et qu’une requête utilisateur est en attente de MDL (Metadata Locking) la requête utilisateur sera supprimée pour résoudre un blocage. Notez que ce ne sont que des requêtes de type ALTER, DROP, TRUNCATE ou RENAME TABLE qui empêche le backup de se faire correctement.

Dernière phase de copie

  • Copie des fichiers .frm, MyISAM, Aria et d’autres moteurs de stockage.
  • Copie des tables crées pendant la sauvegarde et renommage des fichiers modifiés pendant la sauvegarde
  • Copie du reste du journal de restauration InnoDB, arrêt du thread de copie des Redo Log.
  • Ecriture des métadonnées (position du binlog, par exemple)

Déverrouillage

  • Si FLUSH TABLE WITH READ LOCK est terminé, exécution de UNLOCK TABLES
  • Si –lock-ddl-per-table est terminé, exécution de COMMIT

Si FLUSH TABLE WITH READ LOCK n’est pas utilisé, seules les tables InnoDB sont cohérentes (pas les tables dans la base de donnée mysql, ni les binlogs) Le point de sauvegarde dépends du contenu des Redo logs dans le backup lui-même.