Christophe Casalegno

Mysql / MariaDB : comment purger les logs binaires quand il n’y a plus de place sur le disque ?

Lorsque l’espace commence à manquer sur un serveur MySQL ou MariaDB vous pouvez vous retrouver dans le besoin de purger des logs binaires. Pour ce faire, vous devez simplement vous connecter sur le serveur et d’utiliser la commande PURGE BINARY LOGS :

 mysql> PURGE BINARY LOGS BEFORE 'yyyy-mm-dd hh:mm:ss'; 

Par exemple :

 mysql> PURGE BINARY LOGS BEFORE '2023-03-02 22:46:26'; 

Cette commande va purger tous les logs binaires datant d’avant la date indiquée. Une autre méthode consiste à se fonder sur le nom du fichier log. Par exemple :

 mysql> PURGE BINARY LOGS TO 'ns30XXXX-bin.009836';

 
Malgré tout, vous pouvez vous retrouver dans une situation plus grave : il n’y a plus l’espace suffisant sur votre stockage pour effectuer cette opération. Dans la plupart des cas, sur ext4, la commande tune2fs pourra vous sauver la vie. En effet, par défaut 5% de l’espace est réservé au root, et vous pouvez utiliser la commande tune2fs pour modifier cette valeur à la volée :

02:39:52-root@buster:~$ df -h |grep sda1
/dev/sda1        15G  4.9G  9.1G  36% /
02:39:54-root@buster:~$ tune2fs -m 1 /dev/sda1
tune2fs 1.44.5 (15-Dec-2018)
Setting reserved blocks percentage to 1% (39439 blocks)
02:40:02-root@buster:~$ df -h |grep sda1
/dev/sda1        15G  4.9G  9.7G  34% /
02:40:05-root@buster:~$

 
Cependant, si vous n’avez pas la possibilité de libérer de l’espace autrement, ou que pour une autre raison, vous ne pouvez pas vous loguer sur le serveur MySQL / MariaDB, vous allez devoir effacer manuellement les fichiers de logs binaires. Nous allons prendre comme postulat dans cet exemple, que vos fichiers logs se trouvent dans votre /var/lib/mysql : vous pouvez alors utiliser la méthode suivante pour résoudre votre problème.

Etape 1 : arrêter MySQL ou MariaDB (la syntaxe peut dépendre de la version de votre distribution linux). Exemple :

 service mysql stop 

 
Etape 2 : Effacer des fichiers logs binaires, et retirer leur nom de l’index des logs binaires MySQL ou MariaDB.
 
Vous êtes perdu ? Cette ligne de commande « sauvage » va compter et effacer 50% des fichiers logs binaires pour libérer de l’espace et les retirer de l’index des logs binaires MySQL ou MariaDB.

 cd /var/lib/mysql && a=$(ls | grep -v relay | grep bin.index) && b=$(wc -l < $a); c=$((b/2)); for file in $(head -n $c $a | cut -d "/" -f2); do rm "$file" ; done ; sed -i '1,'"$c"'d' $a  

 

Etape 3 : Démarrer MySQL ou MariaDB

 service mysql start 

 
Etape 4 : vérifiez qu’aucun problème n’existe

MariaDB [(none)]> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000013 |       365 |
| mysql-bin.000014 |       365 |
| mysql-bin.000015 |       365 |
| mysql-bin.000016 |       342 |
+------------------+-----------+
4 rows in set (0.000 sec)
MariaDB [(none)]> 

 
Si vous voyez un fichier avec une valeur à 0, c’est qu’il y a un problème : vous devrez arrêter MySQL à nouveau et retirer le fichier de l’index manuellement. Si tout est ok vous pouvez maintenant utiliser la commande « PURGE BINARY LOGS BEFORE » de manière standard pour effacer davantage de logs si besoin.
 
Enjoy !
 
Vous préférez ne pas effectuer la manip vous-même et/ou n’avez plus envie d’avoir à gérer ça de toute votre vie ? Contactez ScalarX ;)

Christophe Casalegno
Vous pouvez me suivre sur : Telegram | YouTube | Twitter | Facebook | LinkedIn | Twitch

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *