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.

