Premiers pas avec MariaDB Backup

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/