Présentation de MariaDB Backup
MariaDB Backup est un outil open source fourni par MariaDB pour exécuter des sauvegardes physiques online.
Contrairement aux sauvegardes logiques réalisées à partir de mysqldump, il permet des sauvegardes et des restaurations plus rapides, avec peu d’impact sur la base de données qui reste accessible pour les applications.
Cet outil de sauvegarde est apparu avec la release 10.1.23 de MariaDB.
C’est en fait un fork de l’outil XtraBackup de Percona, adapté par les équipes de MariaDB pour s’assurer de la compatibilité avec les nouvelles fonctionnalités de MariaDB :
- compression et/ou chiffrage des données en base
- prise en charge des différents Storage Engine : InnoDB, XtraDB, MyRocks et Spider (release 10.2.6+)
- sauvegarde incrémentale, option de compression et parallélisme
- Utilisation pour la synchronisation des nœuds d’une configuration Galera Cluster
- Indépendance vis à vis de MySQL (Oracle) et des outils liés
MariaDB indique que Percona Xtrabackup est non compatible avec MariaDB à partir de la release 10.2.
Pour information, la solution de sauvegarde de MySQL est MySQL Enterprise Backup, avec des fonctionnalités similaires.
Installation et configuration
Actuellement, les rpm mariaDB-server n’intègre pas mariaDB Backup, et il faut installer un rpm spécifique.
Ex pour RH/CentOS :
sudo yum install MariaDB-backup
Pour Debian, Ubuntu :
sudo apt-get install mariadb-backup-10.2
Ensuite, nous créons un user spécifique pour la gestion des sauvegardes/restaurations, avec les droits/privilèges RELOAD, LOCK TABLES, and REPLICATION CLIENT :
mysql -u root -pXXX <<EOF CREATE USER 'backup'@'localhost' IDENTIFIED BY 'backup'; GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* to 'backup'@'localhost' ; exit; EOF
Ce user est soit utilisé en paramètre de la commande de sauvegarde, soit configuré directement dans la configuration mariaDB (*.cnf). L’entête est celle du produit xtrabackup :
[xtrabackup] user=backup password=backup
La commande pour lancer les sauvegardes est :
mariabackup (parametres)
Commandes de sauvegarde/restauration
Les commandes de sauvegardes nécessitent au minimum le paramètre « –backup » (indique une sauvegarde) et le paramètre –target-dir (destination de la sauvegarde).
Save Full
La sauvegarde Full copiera la globalité des fichiers databases, iblogfile, et certaines informations de la DB (uuid, version, type de sauvegarde, configuration nécessaire en cas de restore, etc.)
Elle pose un lock ddl sur la structure des tables (consistance durant la sauvegarde en cas de drop de table).
Une condition à respecter : le répertoire de destination doit être vide, sinon erreur lors de la copie des ibdata.
Un exemple de commande de sauvegarde Full :
# chargement env $DBAHOME/env.mysql DATSAVE=`date +"%Y%m%d"` mariabackup --backup --target-dir $MYSAVE/backup/ \ --user backup --password backup --galera-info > $MYLOG/mbackup_full_$DATSAVE.log 2>&1
Les paramètres –user –password servent en cas d’authentification en ligne de commande (paramétrage dans les *.cnf conseillé, avec restriction des droits de lecture pour sécuriser).
L’option --galera-info
est facultative, utilisée pour une configuration GaleraCluster.
Le répertoire destination contient après sauvegarde les fichiers suivant :
ls -lart total 77872 drwxrwxr-x 7 mysql mysql 79 Sep 16 16:42 .. -rw-r----- 1 mysql mysql 79691776 Sep 16 16:42 ibdata1 drwx------ 2 mysql mysql 4096 Sep 16 16:42 mysql drwx------ 2 mysql mysql 20 Sep 16 16:42 test drwx------ 2 mysql mysql 20 Sep 16 16:42 performance_schema drwx------ 2 mysql mysql 20 Sep 16 16:42 galera drwx------ 2 mysql mysql 4096 Sep 16 16:42 sakila drwx------ 2 mysql mysql 20 Sep 16 16:42 save -rw-r----- 1 mysql mysql 52 Sep 16 16:42 aria_log_control -rw-r----- 1 mysql mysql 16384 Sep 16 16:42 aria_log.00000001 -rw-r----- 1 mysql mysql 41 Sep 16 16:42 xtrabackup_galera_info -rw-r----- 1 mysql mysql 2560 Sep 16 16:42 ib_logfile0 -rw-r----- 1 mysql mysql 103 Sep 16 16:42 xtrabackup_checkpoints -rw-r----- 1 mysql mysql 0 Sep 16 16:42 ib_buffer_pool -rw-r----- 1 mysql mysql 298 Sep 16 16:42 backup-my.cnf -rw-r----- 1 mysql mysql 484 Sep 16 16:42 xtrabackup_info
L’ensemble des databases sont présentes, et le fichier xtrabackup_info contient les informations du contexte de la sauvegarde :
uuid = 2c8b8b93-b99e-11e8-81ce-525400ad3b43 name = tool_name = mariabackup tool_command = --backup --target-dir /var/lib/mysql/save/backup/ --user backup --password=... backup --galera-info tool_version = 10.2.13-MariaDB ibbackup_version = 10.2.13-MariaDB server_version = 10.2.13-MariaDB start_time = 2018-09-16 16:42:20 end_time = 2018-09-16 16:42:25 lock_time = 0 binlog_pos = innodb_from_lsn = 0 innodb_to_lsn = 10091444 partial = N incremental = N format = file compressed = N
Save Incrémentale
Les sauvegardes complètes sont consommatrices en terme de ressources cpu/io (exécution) ou disque (rétention).
MariaDB Backup offre la possibilité de sauvegarde(s) incrémentale(s), pouvant compléter une sauvegarde Full hebdomadaire.
La sauvegarde incrémentale permet de ne sauvegarder que l’ensemble des modifications apportées depuis une précédente sauvegarde Full. Elle offre un gain en terme de ressource, et une rapidité lors de la restauration.
Commande de sauvegarde incrémentale :
mariabackup --backup --target-dir $MYSAVE/inc1/ --incremental-basedir $MYSAVE/backup/ \ --user backup --password backup > $MYLOG/mbackup_inc_$DATSAVE.log 2>&1
La durée de la sauvegarde est forcément très rapide, car elle dépend du nombre d’opérations dml sur les données de la base depuis la date de sauvegarde full.
Résultat de la sauvegarde incrémentale :
mariadb01:mysql:/var/lib/mysql/save/inc1::ls -lart total 628 -rw-r----- 1 mysql mysql 45 Sep 16 09:48 ibdata1.meta -rw-r----- 1 mysql mysql 589824 Sep 16 09:48 ibdata1.delta drwx------ 2 mysql mysql 4096 Sep 16 09:48 mysql drwx------ 2 mysql mysql 20 Sep 16 09:48 test ........ -rw-r----- 1 mysql mysql 525 Sep 16 09:48 xtrabackup_info
Le fichier de données copié est de taille réduite, 600 Ko, par rapport à la sauvegarde full (80 Mo).
Restauration d’une sauvegarde
Lors de la sauvegarde Full de la base, la copie des données se fait table par table. Il y a donc un déphasage sur les données et la première action est de retrouver un point de cohérence.
La première phase est de préparer les fichiers avant de les restorer (action de recover à partir des binlog) avec l’option --prepare
:
mariabackup --prepare --target-dir $MYSAVE/backup/ \ --user backup --password backup
Ensuite, nous pouvons restaurer les fichiers de la sauvegarde.
La base doit être arrêtée, et le répertoire de la base vidé auparavant (ou utilisation de l’option --force-non-empty-directories
)
mariabackup --copy-back --target-dir $MYSAVE/backup/ \ --user backup --password backup # si user diff de mysql chown -R mysql:mysql /var/lib/mysql/
Cette commande effectue une copie des fichiers, il est également possible d’utiliser les commandes cp ou rsync.
En cas de sauvegarde incrémentale, la procédure de recover diffère car nous devons appliquer également les journaux de la sauvegarde incrémentale. Nous utiliserons l’option –apply-log-only pour appliquer les logbin jusqu’à l’avant-dernière sauvegarde incrémentale.
Dans ce cas (1 seule sauvegarde incrémentale), nous avons 2 étapes pour le recover :
mariabackup --prepare --target-dir $MYSAVE/backup/ \ --user backup --password backup --apply-log-only mariabackup --prepare --target-dir $MYSAVE/backup/ \ --user backup --password backup \ --incremental-dir $MYSAVE/inc1
Puis, nous pouvons recopier les fichiers avec la commande « mariabackup –copy-back ».
Dans un prochain article, nous approfondirons les cas plus complexes de restauration et les options avancées de MariaDB Backup.
Documentation sur les sauvegardes MariaDB : https://mariadb.com/kb/en/library/backing-up-and-restoring-databases/