InnoDB est un moteur de stockage pour les systèmes de gestion de base de données MySQL et MariaDB.
Sur certaines versions du serveur MySQL toutes les bases de données sont stockées dans un seul et même fichier /var/lib/mysql/ibdata1. La taille de ce fichier augmente inexorablement et celui-ci ne peut être purgé. Il est pourtant possible de répartir le stockage dans plusieurs fichiers.

La solution suivante permet de paramétrer le serveur MySQL afin qu’il crée un fichier .ibd par table pour chacune des bases de données de /var/lib/mysql/. Chacun de ces fichiers pourra faire l’objet d’un nettoyage à chaud.

Mise en œuvre

La procédure s’applique uniquement aux modules EOLE 2.5. Sur les version 2.6 d’EOLE un fichier .ibd est créé par défaut pour chaque table.

Mise en œuvre à l’aide d’un script bash.

Pré-requis :

  • les valeurs innodb_log_file_size et innodb_buffer_pool_size doivent être adaptées au serveur ;
  • innodb_log_file_size doit être égal à 25% de la valeur du paramètre innodb_buffer_pool_size.
#!/bin/bash

innodb_log_file_size=500M
innodb_buffer_pool_size=2G

MYSQLPWD=$(pwgen -1)
mysql_pwd.py $MYSQLPWD

DATABASES=`mysql -u root -p$MYSQLPWD -e 'use mysql; select Db from db where Db NOT IN ("performance_schema", "mysql","information_schema");' |awk '!/Db/ {print $NF}'|sort|uniq`
mysqldump -hlocalhost -uroot -p$MYSQLPWD --databases $DATABASES > dump.sql
for database in $DATABASES;do
      mysql -u root -p$MYSQLPWD -e "drop database $database;"
done

service mysql stop

cat > /etc/mysql/conf.d/mysqld_innodb.cnf << EOF
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=${innodb_log_file_size}
innodb_buffer_pool_size=${innodb_buffer_pool_size}
EOF

rm -f /var/lib/mysql/{ibdata1,ib_logfile0,ib_logfile1}

service mysql start

mysql -uroot -p $MYSQLPWD < dump.sql

Le répertoire /var/lib/mysql/[BDD] doit contenir un fichier .ibd et un fichier .frm par table.

Le script est disponible dans l’espace de contribution EOLE 2.5 : http://eole.ac-dijon.fr/documentations/2.5/contributions/ibdata.sh

Nettoyage des tables

L’exécution de la commande OPTIMIZE TABLE mabdd.<nomDeLaTable> permet de réduire la taille du fichier .ibd correspondant.