Verwaiste Tabellen

Auf dieser Seite werden bekannte Probleme mit verwaisten Tabellen in MySQL behandelt.

Was sind verwaiste Tabellen?

Verwaiste Tabellen sind Tabellen mit nicht verbundenen Definitionen in MySQL-Datendictionaries und können in MySQL 5.6 oder MySQL 5.7 auftreten. Eines der folgenden Szenarien kann ein Hauptversions-Upgrade (MVU) von MySQL 5.7 auf MySQL 8.0 verhindern:

  • Das Vorhandensein von InnoDB-Datendateien (.ibd) ohne entsprechende Definitionsdateien (.frm) oder umgekehrt.
  • Das Vorhandensein von Zwischentabellen, die von ALTER TABLE-Anweisungen übrig geblieben sind, auf die nicht mehr verwiesen wird oder die von keiner aktiven Anwendungslogik verwendet werden.

Verwaiste temporäre Tabellen

Verwaiste temporäre Tabellennamen beginnen mit dem Präfix #sql-, z. B. #sql-123.

Mit der folgenden Abfrage können Sie verwaiste temporäre Tabellen ermitteln:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';

Mit dem Befehl DROP TABLE können Sie verwaiste temporäre Tabellen ohne weitere zusätzliche Schritte löschen. Das ist in den meisten Fällen ausreichend:

DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;

Ersetzen Sie DB durch den gewünschten Datenbanknamen.

Ein Beispiel könnte so aussehen:

DROP TABLE `testdb`.`#mysql50##sql-1234`;

Wenn der vorherige Tabellenbefehl DROP nicht funktioniert, wird die Definitionsdatei (.frm) möglicherweise von einem anderen ALTER TABLE-Vorgang wiederverwendet. In solchen Fällen muss eine .frm-Platzhalterdatei auf dem Laufwerk erstellt werden, um die Tabelle zu entfernen. Wenden Sie sich an den Cloud SQL-Support, um Unterstützung zu erhalten. Wenn Sie keinen Supportvertrag haben, finden Sie unter Selfservice-Methoden Schritte zur Fehlerbehebung.

Verwaiste Zwischentabellen

Namen verwaister Zwischentabellen beginnen mit dem Präfix #sql-ib, z. B. #sql-ib23-343224.

Verwenden Sie die folgende Abfrage, um verwaiste Zwischentabellen zu identifizieren:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';

Wenn Sie zwischenzeitliche verwaiste Tabellen entfernen möchten, ändern Sie zuerst den Dateinamen der verwaisten Definition (.frm) so, dass er mit dem Tabellennamen übereinstimmt, und löschen Sie die Tabelle dann über die Befehlszeile.

Wenn Sie zwischengeschaltete verwaiste Tabellen entfernen möchten, wenden Sie sich an das Cloud SQL-Supportteam. Wenn Sie keinen Supportvertrag haben, finden Sie unter Selfservice-Methoden Schritte zur Fehlerbehebung.

Verwaiste normale Tabellen

Eine verwaiste InnoDB-Tabelle entsteht, wenn die zugehörige Datendatei (.ibd) im Dateisystem verbleibt, das Data Dictionary aber nicht mehr korrekt auf die Datendatei verweist. Dieses Szenario erfordert manuelles Eingreifen.

Wenden Sie sich an den Cloud SQL-Support, um dieses Problem zu beheben. Das Supportteam kann eine Platzhalterdatei .frm erstellen und dann versuchen, die Tabelle mit einem DROP TABLE-Befehl zu entfernen. Wenn dies nicht gelingt, muss die Datei InnoDB (.ibd) wahrscheinlich manuell aus dem Datenverzeichnis entfernt werden.

Nachdem die Datei manuell entfernt wurde, können Sie alle Tabellen und Datenbankstrukturen sichern.

Löschen Sie eine Datenbank mit DROP DATABASE und erstellen Sie eine Datenbank mit CREATE DATABASE. Für diesen letzten Schritt ist möglicherweise eine Ausfallzeit für Anwendungen erforderlich, die mit der betroffenen Datenbank verbunden sind.

Wenn Sie keinen Supportvertrag haben, finden Sie unter Selfservice-Methoden Schritte zur Fehlerbehebung.

Selfservice-Fehlerbehebung

Bei den folgenden Self-Service-Methoden zur Fehlerbehebung wird die gesamte Datenbank gelöscht oder migriert, um die verwaisten Tabellen zu entfernen, wenn das Löschen einer einzelnen Tabelle nicht funktioniert. Diese Methode ist störend. Wenn Ihre Organisation einen Supportvertrag hat, empfehlen wir dringend, sich an das Cloud SQL-Supportteam zu wenden.

Wenn Sie verwaiste temporäre Tabellen entfernen möchten, müssen Sie zuerst die Schritte unter Verwaiste temporäre Tabellen ausführen. Wenn der Befehl DROP TABLE nicht funktioniert, probieren Sie die folgenden Vorschläge aus.

Hinweise

  • Wir empfehlen Ihnen dringend, eine vollständige Instanzsicherung zu erstellen, um das Risiko von Datenverlust zu verringern.

  • Um die Dauer möglicher Ausfallzeiten der Anwendung zu verkürzen, empfehlen wir dringend, die Instanz zu klonen und die folgenden Migrationsschritte zu überprüfen, bevor Sie sie in einer Produktionsumgebung ausführen.

    Weitere Informationen finden Sie unter Instanzen klonen.

Schema mithilfe der Objektmigration löschen

Die Migration von Datenbankobjekten ist ein mehrstufiger Prozess, bei dem Datenbankobjekte wie Tabellen in ein temporäres Schema verschoben werden:

  1. Sichern Sie andere Datenbankobjekte, einschließlich Prozeduren, Funktionen und Ansichten.
  2. Löschen Sie das betroffene Schema und erstellen Sie es neu.
  3. Importieren Sie die gesicherten Objekte wieder in das ursprüngliche Schema.

Diese Migrationsmethode führt in der Regel zu Ausfallzeiten der Anwendung. Um Unterbrechungen zu minimieren, sollten Sie alle erforderlichen Skripts im Voraus vorbereiten. Ihre Scripts müssen beispielsweise Folgendes berücksichtigen:

  • Tabellen umbenennen und in ein temporäres Schema verschieben
  • Sichern anderer Datenbankobjekte wie Prozeduren, Funktionen, Ansichten und anderer Objekte.
  • Alle Datenbankobjekte werden im ursprünglichen Schema wiederhergestellt.

Wenn die Skripts fertig sind, führen Sie die folgenden Schritte aus:

  1. Erstellen Sie auf derselben Instanz ein temporäres Schema (z. B. fix_orphan_tables).
  2. Stoppen Sie den Anwendungstraffic für das betroffene Schema.
  3. Verschieben Sie alle Tabellen mit RENAME TABLE in das temporäre Schema:

    RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;
    

    Ersetzen Sie die folgenden Werte:

    • DB: der Datenbankname, den Sie verwenden möchten.
    • TABLE_NAME: Der Tabellenname.
  4. Sichern Sie Datenbankobjekte wie Ansichten, Routinen, gespeicherte Prozeduren, Trigger und Ereignisse. Eine Möglichkeit hierfür ist die Verwendung von 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
    

    Ersetzen Sie die folgenden Werte:

    • USER: der Nutzername.
    • PASSWORD: Das Datenbankpasswort.
    • HOST_IP: Die IP-Adresse des Hosts.
    • DB: Der Datenbankname, den Sie verwenden möchten.

    Wir empfehlen dringend, Ansichten manuell mit dem Befehls-Snippet SHOW CREATE VIEW zu sichern.

  5. Löschen Sie das Schema, das verwaiste Tabellen enthält.

  6. Erstellen Sie das Schema mit dem ursprünglichen Namen.

  7. Prüfen Sie, ob die verwaiste Tabelle entfernt wurde:

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

    Ersetzen Sie ORPHAN_TABLE_NAME durch den Namen der verwaisten Tabelle.

  8. Kopieren Sie die Tabellen zurück in das ursprüngliche Schema:

    RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;
    

    Ersetzen Sie die folgenden Werte:

    • TABLE_NAME: Der Tabellenname.
    • DB: Der Datenbankname, den Sie verwenden möchten.
  9. Kopieren Sie alle Datenbankobjekte aus der Sicherung, die Sie in Schritt 4 erstellt haben.

    mysql -u USER \
      --password=PASSWORD \
      -h <var>HOST_IP \
      -D<var>DB < <var>DB_export.sql
    

    Ersetzen Sie die folgenden Werte:

    • USER: der Nutzername.
    • PASSWORD: Das Datenbankpasswort.
    • HOST_IP: Die IP-Adresse des Hosts.
    • DB: der Datenbankname, den Sie verwenden möchten.

    Wir empfehlen Ihnen dringend, Ansichten manuell wiederherzustellen, indem Sie sie mit der Anweisung CREATE VIEW neu erstellen.

  10. Setzen Sie alle zuvor gestoppten Anwendungszugriffe fort.

Schema mit Dump und Load in derselben Instanz löschen

Eine weitere Möglichkeit zum Entfernen einer verwaisten Tabelle besteht darin, einen vollständigen Dump des betroffenen Schemas durchzuführen, das Schema zu löschen und neu zu erstellen und dann den Dump wiederherzustellen. In einigen Fällen ist diese Methode möglicherweise schneller und weniger komplex. Um Unterbrechungen zu minimieren, sollten Sie alle Sicherungs- und Wiederherstellungsskripts im Voraus vorbereiten.

Wenn die Skripts fertig sind, führen Sie die folgenden Schritte aus:

  1. Stoppen Sie den Anwendungs-Traffic für das betroffene Schema.
  2. Sichern Sie das Schema, in dem sich die verwaiste Tabelle befindet, einschließlich aller gespeicherten Prozeduren, Trigger, Ansichten und Ereignisse mit mysqldump.
  3. Löschen Sie das Schema.
  4. Erstellen Sie das Schema noch einmal und stellen Sie die Sicherungsdatei wieder her.
  5. Setzen Sie den Anwendungs-Traffic fort, der im ersten Schritt gestoppt wurde.

Daten in eine neue oder neu erstellte Instanz exportieren und importieren

Unter bestimmten Umständen kann das Schema mit der verwaisten Tabelle nicht gelöscht werden. In diesen Fällen müssen Sie entweder zu einer neuen Instanz migrieren oder die vorhandene Instanz mithilfe eines logischen Dumps und Loads neu erstellen. Beide Ansätze können zu Unterbrechungen der Anwendung führen und erfordern möglicherweise eine Neukonfiguration Ihrer Anwendungen, damit sie auf die neu erstellte oder neu erstellte Datenbankinstanz verweisen. In den folgenden Abschnitten werden beide Methoden beschrieben.

Daten mit Database Migration Service (DMS) zu einer neuen Instanz migrieren

  1. Verwenden Sie Database Migration Service, um eine neue Cloud SQL for MySQL-Instanz zu erstellen.
  2. Nachdem die Replikatinz die Daten der neuen Instanz repliziert hat, beenden Sie alle Anwendungen, die eine Verbindung zur Quellinstanz herstellen.
  3. Stufen Sie das Replikat der Cloud SQL for MySQL-Instanz hoch.
  4. Ändern Sie alle Anwendungsverbindungen so, dass sie auf die neu hochgestufte Cloud SQL for MySQL-Instanz verweisen, und starten Sie die Anwendungen neu.

Manuelles Sichern und Wiederherstellen

  1. Wenn Sie eine neue Datenbankinstanz erstellen, muss diese dieselbe Konfiguration wie die aktuelle Instanz haben.
  2. Beenden Sie den gesamten Anwendungs-Traffic für die aktuelle Datenbankinstanz.
  3. Sichern Sie alle Schemas mit mysqldump oder einem ähnlichen Dienstprogramm.
  4. Wenn Sie dieselbe Instanz verwenden, löschen Sie sie und erstellen Sie sie neu.
  5. Stellen Sie die im dritten Schritt erstellte Sicherung in der neuen Instanz oder in der neu erstellten Instanz wieder her.
  6. Lassen Sie Ihre Anwendungen auf die neue Instanz oder auf dieselbe neu erstellte Instanz verweisen und setzen Sie den Anwendungsbetrieb fort.

Nächste Schritte

  1. Fehlerbehebung
  2. Direkte Datenbankaktualisierung durchführen