Convertir les tables MyISAM vers InnoDB d’une base MySQL / MariaDB

I. Présentation

Dans ce tutoriel, nous allons voir comment convertir les tables MyISAM vers InnoDB d'une base de données sous MySQL ou MariaDB.

MyISAM et InnoDB correspondent à des moteurs de bases de données, que l'on peut appliquer au niveau de chaque table d'une base de données. Le moteur MyISAM est utilisé sur les versions plus anciennes de MySQL tandis que sur les versions plus récentes, c'est le moteur InnoDB qui est défini par défaut.

Si votre base de données existe depuis plusieurs années, il y a des chances qu'elle s'appuie sur le moteur MyISAM si vous n'avez pas fait le changement. Dans certains cas, par exemple avec WordPress, les extensions peuvent modifier le moteur de base de données lors d'une mise à jour (pour passer de MyISAM à InnoDB), mais les tables correspondantes au cœur de WordPress peuvent rester en MyISAM.

Pourquoi passer de MyISAM à InnoDB ? Je ne suis pas un expert en bases de données, mais InnoDB est plus performant (le temps d'exécution de certaines requêtes peut fortement diminuer), moins sujet à la corruption de données grâce à la gestion de transactions, et au niveau du verrouillage, InnoDB est capable de verrouiller une seule ligne d'une table tandis que MyISAM verrouille la table complète (ce qui peut engendrer des dysfonctionnements). Par contre, le moteur InnoDB consomme plus d'espace disque.

Avant de réaliser cette opération, prenez vos précautions : effectuez une sauvegarde de votre base de données, avec mysqldump ou PhpMyAdmin par exemple, ou avec votre extension de sauvegarde si vous utilisez un CMS comme WordPress.

II. Lister les tables avec le moteur MyISAM

Pour ce tutoriel, je ne vais pas manipuler avec PhpMyAdmin, mais directement avec la console MySQL / MariaDB (pour rappel, c'est un fork open source de MySQL).

Connectez-vous à votre serveur et ouvrez la console :

mysql -u root -p

Saisissez le mot de passe "root" de votre instance MySQL, et voilà, vous avez accès à la console.

Ensuite, on va lister les tables de notre base de données qui utilisent le moteur "MyISAM". Voici un exemple pour une table nommée "dbwordpress" (nom à remplacer) :

SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'dbwordpress' and ENGINE = 'myISAM';

Vous allez obtenir un tableau comme résultat. Ce tableau aura deux colonnes : TABLE_NAME (le nom de la table) et ENGINE (le nom du moteur). Si vous obtenez un résultat vide, c'est que vous n'avez pas de tables en MyISAM !

D'ailleurs, vous pouvez faire l'inverse et lister vos tables en InnoDB :

SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'dbwordpress' and ENGINE = 'InnoDB';

Une fois que vous avez votre liste de tables en MyISAM, copier-coller cette liste dans un fichier texte pour la garder de côté. Pour ma part, j'ai obtenu plusieurs tables : abcd_comments, abcd_users, etc...

III. Passer de MyISAM à InnoDB

Maintenant que nous avons la liste des tables à modifier, il va falloir agir sur chacune de ces tables pour changer le moteur de base de données.

Remarque : pour effectuer cette opération, je pense qu'il vaut mieux couper les accès par la base de données. Si c'est sur un serveur Web, vous pouvez simplement arrêter le service Apache2 (systemctl stop apache2) et il faudra le démarrer à la fin de l'opération (systemctl start apache2).

Pour modifier le moteur de base de données, on va utiliser la requête SQL "ALTER TABLE". Pour chacune des tables MyISAM, il va falloir exécuter une requête sous cette forme :

ALTER TABLE dbwordpress.<nom-table> ENGINE=InnoDB;

Ce qui va donner la requête SQL suivante pour la table "abcd_comments" :

ALTER TABLE dbwordpress.abcd_comments ENGINE=InnoDB;

Une requête à répéter pour chaque table, en adaptant le nom de la table à chaque fois. Pour ma part, je préfère réaliser l'action table par table, sans envoyer toutes les requêtes d'un coup, pour être sûr que tout se passe bien et vérifier au fur et à mesure.

L'opération peut prendre moins d'une seconde comme 5 secondes, en fonction du nombre de lignes à traiter dans la table. À chaque fois, la requête ALTER TABLE va indiquer s'il y a eu une erreur ou non.

À vous de jouer et pensez à réaliser une sauvegarde avant la modification.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5471.Voir tous les posts

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.