Développement et bases de données

Convertir une base de données MyISAM en InnoDB : changer de moteur de stockage

Vérifié le 5 min de lecture MySQL conversion

Une application peut exiger de convertir des tables MyISAM en InnoDB. Ne remplacez pas du texte globalement dans le dump et ne videz pas la base de production : le changement doit être testé sur une copie indépendante, en conservant l'original pour revenir en arrière.

1. Créer et vérifier une copie protégée

Travaillez depuis un dossier privé en dehors de public_html, avec un nouveau nom de dump. Arrêtez temporairement les écritures et générez un dump. L'option -p demande le mot de passe sans l'inclure dans la commande :

umask 077
mysqldump --routines --triggers -u USUARIO_MYSQL -p BASE_DE_DATOS > base-antes-innodb.sql &&
test -s base-antes-innodb.sql &&
sha256sum base-antes-innodb.sql > base-antes-innodb.sql.sha256 &&
chmod 400 base-antes-innodb.sql base-antes-innodb.sql.sha256 &&
sha256sum -c base-antes-innodb.sql.sha256

Si mysqldump renvoie une erreur, ne continuez pas et ne considérez pas le fichier partiel comme valide. L'export des routines exige des privilèges ; s'il échoue, vérifiez de quels objets l'application a besoin avant de les omettre. Les événements, s'il y en a, doivent aussi être inventoriés et exportés avec les options et privilèges adéquats. La somme de contrôle détecte les modifications ultérieures du fichier, mais ne prouve pas que la copie est complète. Les permissions en lecture seule ne la rendent pas non plus immuable.

Téléchargez le dump et sa somme de contrôle vers un autre stockage. Ne modifiez pas ces fichiers.

2. Restaurer et vérifier un clone

Créez une nouvelle base et un nouvel utilisateur, restaurez la copie et configurez-y un clone de l'application. Désactivez ses e-mails, paiements, webhooks et tâches automatiques pour ne pas dupliquer des actions de production :

mysql -u USUARIO_NUEVO -p BASE_NUEVA < base-antes-innodb.sql

Affichez au préalable les tables MyISAM et leur taille :

SELECT TABLE_NAME, ENGINE, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND ENGINE = 'MyISAM';

Vérifiez les clés primaires, les index (y compris FULLTEXT), les formats de ligne et la compatibilité de l'application avec le changement de moteur. Confirmez l'espace libre à la fois pour le clone et pour reconstruire ses tables. La conversion peut verrouiller des tables et nécessiter de l'espace supplémentaire.

3. Convertir uniquement les tables vérifiées

Générez une liste d'instructions exactes, vérifiez-la et exécutez chacune uniquement sur le clone :

SELECT CONCAT('ALTER TABLE `', REPLACE(TABLE_SCHEMA, '`', '``'),
              '`.`', REPLACE(TABLE_NAME, '`', '``'), '` ENGINE=InnoDB;') AS sentencia_a_revisar
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND ENGINE = 'MyISAM';

N'utilisez pas de remplacement global dans le .sql : il pourrait altérer des données d'utilisateurs, des commentaires ou des configurations contenant le mot MyISAM.

4. Valider et basculer

Utilisez COUNT(*) pour des décomptes exacts : TABLE_ROWS peut être une estimation, surtout après la conversion en InnoDB. Comparez le schéma, les index et le nombre de lignes de toutes les tables entre la base d'origine et le clone. Testez l'accès, les recherches, l'écriture, les tâches planifiées et les opérations critiques de l'application.

Seulement après avoir validé le clone, arrêtez de nouveau les écritures, synchronisez les dernières modifications le cas échéant et changez les identifiants de l'application pour utiliser BASE_NUEVA. Gardez la base d'origine intacte et sans écritures pendant la période d'observation.

Retour en arrière

Si une vérification ultérieure échoue, arrêtez les écritures. Avant de rétablir les anciens identifiants, identifiez et conservez les opérations reçues dans la nouvelle base ; revenir sans les réconcilier ferait perdre ces modifications. Une fois ce point réglé, revenez à la base d'origine. Conservez à la fois cette base et le dump vérifié jusqu'à confirmer que la conversion est stable.

Si vous ne pouvez pas disposer d'un clone ou calculer l'espace nécessaire, contactez l'assistance avant de convertir les tables.

Cela peut aussi vous aider

Quelque chose cloche ou a changé ? Racontez-nous et nous le vérifions.