Développement et bases de données
Convertir une base de données MyISAM en InnoDB : changer de moteur de stockage
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
- Arrêter des requêtes MySQL en cours d'exécution Listez les requêtes MySQL encore ouvertes et arrêtez-les avec KILL QUERY depuis le terminal, avec my...
- Cloner une base de données Dupliquez une base MySQL en créant d'abord la destination et ses privilèges dans cPanel, puis en cop...
- Connexion distante et sécurisée au serveur MySQL Protégez une connexion MySQL distante grâce à un tunnel SSH et configurez séparément les identifiant...
- Créer des bases de données MySQL, des utilisateurs et des privilèges dans cPanel Créez une base de données MySQL dans cPanel, ajoutez son utilisateur, attribuez-lui tous les privilè...
Quelque chose cloche ou a changé ? Racontez-nous et nous le vérifions.