# Sauvegarde MySQL

Ce guide vous aidera à effectuer une sauvegarde complète de votre base de données MySQL sans arrêter votre système. Il a été rédigé et testé par l'équipe devops de Navixy, vous pouvez donc lui faire confiance en tant que solution connue et fonctionnelle.

{% hint style="info" %}
Cette instruction est valable pour les versions MySQL 8.xx (inférieures ou égales à 8.0.29) et 5.xx. Elle est rédigée pour, testée et peut être appliquée sur les systèmes d'exploitation suivants :

* Ubuntu 18.04, 20.04
* Debian 9, 10, 11

Pour d'autres systèmes d'exploitation et versions de logiciels, elle peut être appliquée et adaptée à vos risques et périls.
{% endhint %}

Ce dont vous avez besoin pour effectuer une sauvegarde complète de votre base de données MySQL sans arrêter le système :

* Connecter un volume supplémentaire sur un disque séparé sur lequel la sauvegarde sera effectuée.
* Installer un logiciel supplémentaire - <https://www.percona.com/software/mysql-database/percona-xtrabackup>
* Obtenir les identifiants d'un utilisateur MySQL existant ou créer un utilisateur spécifiquement pour la sauvegarde
* Toutes les opérations doivent être effectuées en tant qu'utilisateur disposant de droits root, ou en utilisant sudo.

Ci-dessous, nous examinerons plus en détail les étapes que vous devez suivre.

## Création d'un utilisateur

À titre d'exemple, nous créerons l'utilisateur nommé `bkpuser` avec les droits minimums suffisants pour créer une sauvegarde complète et le mot de passe `s3cret`.

Tout d'abord, vous devez accéder à la console MySQL avec des droits administratifs, exemple :

```
mysql -uroot -p
```

Ensuite, dans la console MySQL, saisissez les commandes spécifiques aux différentes versions de MySQL :

**MySQL 5.xx**

```sql
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
CREATE USER 'bkpuser'@'%' IDENTIFIED BY 's3cret';
GRANT SELECT, RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
GRANT SELECT, RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'%';
FLUSH PRIVILEGES;
```

**MySQL 8.xx**

```sql
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
CREATE USER 'bkpuser'@'%' IDENTIFIED BY 's3cret';
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'%';
GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost';
GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'%';
GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'localhost';
GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'%';
FLUSH PRIVILEGES;
```

## Volume de sauvegarde

Nous devons maintenant calculer la taille du volume supplémentaire sur lequel la sauvegarde sera effectuée.

Afin de déterminer la taille du volume nécessaire pour la sauvegarde de la base de données, vous devez trouver la taille de votre base de données actuelle et la multiplier par 1,5.

Si votre base de données se trouve à l'emplacement par défaut défini lors de l'installation du serveur MySQL, vous devez exécuter la commande suivante avec les droits root :

```
du -sh /var/lib/mysql
```

Si vous avez un emplacement de base de données personnalisé, vous devez spécifier le chemin de la base de données en argument de la commande du, c.-à-d. :

```
du -sh /your_path_to_database
```

**Exemple de calcul**

![](https://866637922-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FkUnMmePH99SsdChtqqu7%2Fuploads%2Fgit-blob-52f629b44641169de37ee8780c75b282ba36c19d%2Fimage-20230810-134206.png?alt=media)

Dans la capture d'écran, nous pouvons voir que la taille actuelle de la base de données MySQL est de 181 Go. Par conséquent, la taille du volume pour sauvegarder cette base de données doit être d'au moins 181 \* 1,5 = 271,5 Go, arrondie à 272 Go

Le calcul s'applique à une seule copie de la base de données. Si vous prévoyez de conserver plus d'une copie de sauvegarde de la base de données, pensez à multiplier le résultat par le nombre de sauvegardes stockées.

## Logiciel de sauvegarde

Après avoir connecté le nouveau volume et créé un système de fichiers dessus, vous devez installer le logiciel requis pour la sauvegarde de la base de données. Ce logiciel s'appelle <https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html>. Envisagez de l'installer en utilisant les paquets d'installation prêts disponibles depuis les dépôts Percona XtraBackup.

L'installation se fait via le paquet contenant l'outil de configuration `percona-release` .

Tout d'abord, téléchargez ce paquet depuis les dépôts Percona XtraBackup avec la commande suivante :

```
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
```

L'étape suivante consiste à lancer l'installation du paquet téléchargé en utilisant l'utilitaire dpkg. Vous devez être *root* ou utiliser *sudo* pour exécuter cette commande :

```
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
```

Maintenant, définissez les dépôts nécessaires à cet effet :

```
percona-release enable-only tools
apt-get update
```

***

### Exception pour Debian 10

Sur Debian 10, l'étape ci-dessus renvoie une erreur :

![](https://866637922-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FkUnMmePH99SsdChtqqu7%2Fuploads%2Fgit-blob-3f734df5a924e41a600e83a7640ecd29bb1cb875%2Fimage-20230810-134240.png?alt=media)

Pour corriger cette erreur, vous devez éditer le fichier */etc/apt/sources.list*

Ouvrez ce fichier dans n'importe quel éditeur de texte, c.-à-d. :

```
root@debian10:~# nano /etc/apt/sources.list
```

Ajoutez la ligne suivante en haut de la liste :

```
deb http://ftp.de.debian.org/debian buster-backports main
```

Le contenu du fichier ressemblera à quelque chose comme ceci :

```bash
#
# deb cdrom:[Debian GNU/Linux 10.4.0 _Buster_ - Official amd64 NETINST 20200509-10:25]/ buster main

# deb cdrom:[Debian GNU/Linux 10.4.0 _Buster_ - Official amd64 NETINST 20200509-10:25]/ buster main
deb http://ftp.de.debian.org/debian buster-backports main

deb http://mirror.corbina.net/debian/ buster main
deb-src http://mirror.corbina.net/debian/ buster main

deb http://security.debian.org/debian-security buster/updates main
deb-src http://security.debian.org/debian-security buster/updates main

# buster-updates, précédemment connu sous le nom de 'volatile'
deb http://mirror.corbina.net/debian/ buster-updates main
deb-src http://mirror.corbina.net/debian/ buster-updates main

# Ce système a été installé en utilisant des médias amovibles de petite taille
# (par ex. netinst, live ou CD unique). Les entrées "deb cdrom" correspondantes
# ont été désactivées à la fin du processus d'installation.
# Pour des informations sur la configuration des sources de paquets apt,
# voir le manuel sources.list(5).
```

Enregistrez les modifications du fichier puis exécutez les commandes suivantes :

```bash
apt update
apt install curl/buster-backports
apt --fix-broken install
percona-release enable-only tools
apt-get update
```

***

Vous êtes maintenant prêt à installer l'utilitaire de sauvegarde. Pour ce faire, utilisez la commande suivante en tant que root ou avec sudo :

**pour la version MySQL 5.xx :**

```
sudo apt install percona-xtrabackup-24
```

**pour les versions MySQL 8.xx inférieures ou égales à 8.0.29 :**

```
sudo apt install percona-xtrabackup-80
```

Cela termine la procédure d'installation de l'utilitaire Percona XtraBackup.

## Création de la sauvegarde

Vous allez maintenant créer une sauvegarde complète de la base de données en utilisant Percona XtraBackup.

* la commande de sauvegarde s'exécute sur le même serveur où la base de données copiée est stockée
* dans l'exemple ci-dessous, le volume de sauvegarde supplémentaire monté dans `/mnt/backups` dossier
* un utilisateur pré-créé `bkpuser` avec un mot de passe `s3cret` est utilisé pour se connecter à la base de données

```
xtrabackup --user=bkpuser --password=s3cret --backup --target-dir=/mnt/backups/
```

Après avoir terminé la sauvegarde, vous devez préparer la base de données copiée pour qu'elle soit opérationnelle. Sans cette opération, la base de données restera inutilisable.

```
xtrabackup --prepare --target-dir=/mnt/backups/
```

Vous disposez désormais d'une copie de la base de données à jour au moment de sa création, réalisée sans arrêter le serveur et sans soulager sa charge de travail.

Cette copie de sauvegarde peut être utilisée pour restaurer votre base de données en cas d'urgence.
