Tables orphelines

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 :

  • Présence de fichiers de données InnoDB (.ibd) sans fichiers de définition correspondants (.frm), ou inversement.
  • Présence de tables intermédiaires issues d'instructions ALTER TABLE qui ne sont plus référencées ni utilisées par aucune logique d'application active.

Tables temporaires orphelines

Les noms de tables temporaires orphelines commencent par le préfixe #sql-, 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 problèmes :

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 de table DROP précédente ne fonctionne pas, il est possible que le fichier de définition (.frm) soit réutilisé par une autre opération ALTER TABLE. Dans ce cas, un fichier .frm d'espace réservé doit être créé sur le disque pour supprimer la table. Contactez l'assistance Cloud SQL pour obtenir de l'aide. Si vous n'avez pas de contrat d'assistance, consultez les méthodes en libre-service pour connaître les étapes de dépannage.

Tables intermédiaires orphelines

Les noms des 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 du fichier de définition des orphelins (.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 n'avez pas de contrat d'assistance, consultez les méthodes en libre-service pour connaître les étapes de dépannage.

Tables normales orphelines

Une table InnoDB orpheline se produit lorsque son fichier de données correspondant (fichier .ibd) reste dans le système de fichiers, mais que le dictionnaire de données ne fait plus référence au fichier de données correctement. 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 essayer de supprimer la table. En cas d'échec, il est probable que le fichier InnoDB (.ibd) doive ê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 n'avez pas de contrat d'assistance, consultez les méthodes en libre-service pour connaître les étapes de dépannage.

Dépannage en libre-service

Les méthodes de dépannage en libre-service suivantes consistent à supprimer ou à migrer l'intégralité 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 a souscrit 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 de sauvegarder l'intégralité de l'instance pour réduire le risque de perte de données.

  • Pour réduire la durée d'indisponibilité potentielle 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 un schéma à l'aide de la migration d'objet

La migration d'objets de base de données est un processus en plusieurs étapes qui permet de déplacer des objets de base de données, tels que des tables, vers un schéma temporaire :

  1. Sauvegardez les autres objets de base de données, y compris les procédures, les fonctions et les vues.
  2. Supprimez et recréez le schéma concerné.
  3. 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, etc.
  • Restauration de tous les objets de base de données dans le schéma d'origine.

Une fois ces scripts prêts, procédez comme suit :

  1. Créez un schéma temporaire (par exemple, fix_orphan_tables) sur la même instance.
  2. Arrêtez le trafic de l'application sur le schéma concerné.
  3. 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.
  4. 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.sql
    

    Effectuez 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'extrait de code de commande SHOW CREATE VIEW.

  5. Supprimez le schéma contenant les tables orphelines.

  6. Créez le schéma avec le nom d'origine.

  7. Vérifiez si la table orpheline a été supprimée :

    SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';
    

    Remplacez ORPHAN_TABLE_NAME par le nom de la table orpheline.

  8. 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.
  9. 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 < <var>DB_export.sql
    

    Effectuez 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'instruction CREATE VIEW.

  10. Reprenez le trafic d'application que vous avez arrêté précédemment.

Supprimer le schéma à l'aide de la sauvegarde et du 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, assurez-vous de préparer tous les scripts de sauvegarde et de restauration à l'avance.

Une fois ces scripts prêts, procédez comme suit :

  1. Arrêtez le trafic d'application sur le schéma concerné.
  2. 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.
  3. Supprimez le schéma.
  4. Recréez le schéma et restaurez le fichier de sauvegarde.
  5. Reprenez le trafic d'application arrêté à la première étape.

Vider et charger dans 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'une vidange 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 décrivent les deux méthodes.

Migrer des données vers une nouvelle instance à l'aide de Database Migration Service (DMS)

  1. Utilisez Database Migration Service pour créer une instance Cloud SQL pour MySQL.
  2. 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.
  3. Promouvez l'instance répliquée Cloud SQL pour MySQL.
  4. Modifiez toutes les connexions d'application pour qu'elles pointent vers l'instance Cloud SQL pour MySQL nouvellement promue, puis redémarrez les applications.

Sauvegarde et restauration manuelles

  1. Si vous créez une instance de base de données, veillez à ce qu'elle ait la même configuration que l'instance actuelle.
  2. Arrêtez tout le trafic d'application sur l'instance de base de données actuelle.
  3. Sauvegardez tous les schémas à l'aide de mysqldump ou d'un utilitaire similaire.
  4. Si vous utilisez la même instance, supprimez-la et recréez-la.
  5. À 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.
  6. Faites pointer vos applications vers la nouvelle instance ou vers la même instance recréée, puis reprenez les opérations de l'application.

Étapes suivantes

  1. Dépannage
  2. Mettre à niveau la version majeure de la base de données sur place