Cette page présente les problèmes connus liés aux tables orphelines dans MySQL.
Que sont les tables orphelines ?
Les tables orphelines sont des tables dont les définitions sont déconnectées dans les dictionnaires de données MySQL. Elles peuvent se produire dans MySQL 5.6 ou MySQL 5.7. L'un des scénarios suivants peut bloquer une mise à niveau de version majeure (MVU) de MySQL 5.7 vers MySQL 8.0 :
- La présence de fichiers de données
InnoDB(.ibd) sans fichiers de définition correspondants (.frm), ou inversement. - La présence de tables intermédiaires laissées par des instructions
ALTER TABLEqui ne sont plus référencées ni utilisées par une logique d'application active.
Tables temporaires orphelines
Les noms de tables temporaires orphelines commencent par le #sql- préfixe, par exemple #sql-123.
Utilisez la requête suivante pour identifier les tables temporaires orphelines :
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';
Vous pouvez utiliser la commande DROP TABLE pour supprimer les tables temporaires orphelines sans aucune autre étape supplémentaire. Cela résout la plupart des cas :
DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;
Remplacez DB par le nom de la base de données que vous souhaitez utiliser.
Voici un exemple :
DROP TABLE `testdb`.`#mysql50##sql-1234`;
Si la commande DROP précédente ne fonctionne pas, le fichier de définition (.frm) peut être réutilisé par une autre opération ALTER TABLE. Dans ce cas, vous devez créer un fichier .frm espace réservé sur le disque pour supprimer la table. Contactez l'
assistance Cloud SQL pour obtenir de l'aide.
Si vous ne disposez pas d'un contrat d'assistance, consultez Méthodes en libre-service
pour les étapes de dépannage.
Tables intermédiaires orphelines
Les noms de tables intermédiaires orphelines commencent par le préfixe #sql-ib, par
exemple, #sql-ib23-343224.
Utilisez la requête suivante pour identifier les tables intermédiaires orphelines :
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';
Pour supprimer les tables orphelines intermédiaires, commencez par modifier le nom de fichier de définition orphelin (.frm) pour qu'il corresponde au nom de la table, puis supprimez la table à partir de la ligne de commande.
Pour supprimer les tables orphelines intermédiaires, contactez l'équipe d'assistance Cloud SQL pour obtenir de l'aide. Si vous ne disposez pas d'un contrat d'assistance, consultez Méthodes en libre-service pour les étapes de dépannage.
Tables normales orphelines
Une table InnoDB orpheline se produit lorsque son fichier de données (.ibd) correspondant reste dans le système de fichiers, mais que le dictionnaire de données ne référence plus correctement le fichier de données. Ce scénario nécessite une intervention manuelle.
Pour résoudre ce problème, contactez l'assistance Cloud SQL. L'équipe d'assistance peut créer un fichier .frm espace réservé, puis utiliser une commande DROP TABLE pour tenter de supprimer la table. En cas d'échec, le fichier InnoDB (.ibd) devra probablement être supprimé manuellement du répertoire de données.
Une fois le fichier supprimé manuellement, vous pouvez sauvegarder toutes les tables et structures de base de données.
Supprimez une base de données à l'aide de DROP DATABASE et créez-en une à l'aide de CREATE DATABASE. Cette dernière étape peut nécessiter un temps d'arrêt pour les applications connectées à la base de données concernée.
Si vous ne disposez pas d'un contrat d'assistance, consultez Méthodes en libre-service pour les étapes de dépannage.
Dépannage en libre-service
Les méthodes de dépannage en libre-service suivantes impliquent la suppression ou la migration de l'ensemble de la base de données pour supprimer les tables orphelines lorsque la suppression d'une table individuelle ne fonctionne pas. Cette méthode est perturbatrice. Si votre organisation dispose d'un contrat d'assistance, nous vous recommandons vivement de contacter l'équipe d'assistance Cloud SQL pour obtenir de l'aide.
Pour supprimer les tables temporaires orphelines, veillez d'abord à suivre les étapes décrites dans
Tables temporaires orphelines. Si la commande DROP TABLE échoue, essayez les suggestions suivantes.
Avant de commencer
Nous vous recommandons vivement d'effectuer une sauvegarde complète de l'instance pour réduire le risque de perte de données.
Pour réduire la durée d'un éventuel temps d'arrêt de l'application, nous vous recommandons vivement de cloner l'instance et de vérifier les étapes de migration suivantes avant de les effectuer dans un environnement de production.
Pour en savoir plus, consultez Cloner des instances.
Supprimer le schéma à l'aide de la migration d'objets
La migration d'objets de base de données est un processus en plusieurs étapes qui consiste à déplacer des objets de base de données, tels que des tables, vers un schéma temporaire :
- Sauvegardez d'autres objets de base de données, y compris les procédures, les fonctions et les vues.
- Supprimez et recréez le schéma concerné.
- Réimportez les objets sauvegardés dans le schéma d'origine.
Cette méthode de migration entraîne généralement un temps d'arrêt de l'application. Pour minimiser les interruptions, préparez tous les scripts nécessaires à l'avance. Par exemple, assurez-vous que vos scripts sont prêts à gérer les éléments suivants :
- Renommer les tables et les déplacer vers un schéma temporaire.
- Sauvegarder d'autres objets de base de données, tels que des procédures, des fonctions, des vues et d'autres éléments.
- Restaurer tous les objets de base de données dans le schéma d'origine.
Une fois ces scripts prêts, procédez comme suit :
- Créez un schéma temporaire (par exemple,
fix_orphan_tables) sur la même instance. - Arrêtez le trafic de l'application sur le schéma concerné.
Déplacez toutes les tables vers le schéma temporaire à l'aide de
RENAME TABLE:RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;Effectuez les remplacements suivants :
DB: nom de la base de données que vous souhaitez utiliser.TABLE_NAME: nom de la table.
Sauvegardez les objets de base de données, tels que les vues, les routines, les procédures stockées, les déclencheurs et les événements. Pour ce faire, vous pouvez utiliser
mysqldump:mysqldump -u USER --password=PASSWORD \ -h HOST_IP --set-gtid-purged=OFF --no-data --no-create-db \ --no-create-info --routines --triggers --skip-opt --events \ DB > DB_export.sqlEffectuez les remplacements suivants :
USER: nom d'utilisateur.PASSWORD: mot de passe de la base de données.HOST_IP: adresse IP de l'hôte.DB: nom de la base de données que vous souhaitez utiliser.
Nous vous recommandons vivement de sauvegarder manuellement les vues à l'aide de l'
SHOW CREATE VIEWextrait de code de commande.Supprimez le schéma contenant les tables orphelines.
Créez le schéma avec le nom d'origine.
Vérifiez si la table orpheline est supprimée :
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';Remplacez
ORPHAN_TABLE_NAMEpar le nom de la table orpheline.Copiez les tables dans le schéma d'origine :
RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;Effectuez les remplacements suivants :
TABLE_NAME: nom de la table.DB: nom de la base de données que vous souhaitez utiliser.
Copiez tous les objets de base de données à partir de la sauvegarde effectuée à l'étape 4.
mysql -u USER \ --password=PASSWORD \ -h <var>HOST_IP \ -D<var>DB < >varDB_export.sqlEffectuez les remplacements suivants :
USER: nom d'utilisateur.PASSWORD: mot de passe de la base de données.HOST_IP: adresse IP de l'hôte.DB: nom de la base de données que vous souhaitez utiliser.
Nous vous recommandons vivement de restaurer manuellement les vues en les recréant à l'aide de l'
CREATE VIEWinstruction.Reprenez le trafic de l'application que vous avez arrêté précédemment.
Supprimer le schéma à l'aide d'un vidage et d'un chargement sur la même instance
Une autre façon de supprimer une table orpheline consiste à effectuer un vidage complet du schéma concerné, à supprimer et à recréer le schéma, puis à restaurer le vidage. Dans certains cas, cette méthode peut être plus rapide et moins complexe. Pour minimiser les interruptions, veillez à préparer tous les scripts de sauvegarde et de restauration à l'avance.
Une fois ces scripts prêts, procédez comme suit :
- Arrêtez le trafic de l'application sur le schéma concerné.
- Sauvegardez le schéma dans lequel se trouve la table orpheline, y compris toutes les procédures stockées, les déclencheurs, les vues et les événements à l'aide de
mysqldump. - Supprimez le schéma.
- Recréez le schéma et restaurez le fichier de sauvegarde.
- Reprenez le trafic de l'application arrêté à la première étape.
Vider et charger sur une instance nouvelle ou recréée
Dans certaines conditions, le schéma contenant la table orpheline ne peut pas être supprimé. Dans ce cas, vous devez migrer vers une nouvelle instance ou recréer l'instance existante à l'aide d'un vidage et d'un chargement logiques. Les deux approches peuvent entraîner des interruptions d'application et peuvent nécessiter de reconfigurer vos applications pour qu'elles pointent vers l'instance de base de données nouvellement créée ou recréée. Les sections suivantes couvrent les deux méthodes.
Migrer des données vers une nouvelle instance à l'aide de Database Migration Service (DMS)
- Utilisez Database Migration Service pour créer une instance Cloud SQL pour MySQL.
- Une fois que l'instance répliquée a terminé de répliquer les données associées à la nouvelle instance, arrêtez toutes les applications qui se connectent à l'instance source.
- Promouvez l'instance répliquée Cloud SQL pour MySQL.
- Modifiez toutes les connexions d'application pour qu'elles pointent vers l'instance Cloud SQL pour MySQL nouvellement promue, puis redémarrez les applications.
Vidage et restauration manuels
- Si vous créez une instance de base de données, créez-en une avec la même configuration que l'instance actuelle.
- Arrêtez tout le trafic de l'application sur l'instance de base de données actuelle.
- Sauvegardez tous les schémas à l'aide de
mysqldumpou d'un utilitaire similaire. - Si vous utilisez la même instance, supprimez-la et recréez-la.
- À l'aide de la sauvegarde que vous avez créée à la troisième étape, restaurez la sauvegarde sur la nouvelle instance ou sur la même instance recréée.
- Faites pointer vos applications vers la nouvelle instance ou vers la même instance recréée, puis reprenez les opérations de l'application.