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-Datenwörterbüchern. Sie können in MySQL 5.6 oder MySQL 5.7 auftreten. In den folgenden Szenarien kann ein Upgrade der Hauptversion von MySQL 5.7 auf MySQL 8.0 blockiert werden:

  • Vorhandensein von InnoDB-Datendateien (.ibd) ohne entsprechende Definitionsdateien (.frm) oder umgekehrt.
  • Vorhandensein von Zwischentabellen, die von ALTER TABLE-Anweisungen übrig geblieben sind und nicht mehr von aktiver Anwendungslogik referenziert oder verwendet werden.

Verwaiste temporäre Tabellen

Namen verwaister temporärer Tabellen beginnen mit dem #sql- Präfix, z. B. #sql-123.

Verwenden Sie die folgende Abfrage, um verwaiste temporäre Tabellen zu identifizieren:

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. Dies ist in den meisten Fällen ausreichend:

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

Ersetzen Sie DB durch den Namen der Datenbank, die Sie verwenden möchten.

Ein Beispiel:

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

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

Verwaiste Zwischentabellen

Namen verwaister Zwischentabellen beginnen mit dem #sql-ib Präfix, zum Beispiel, #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%';

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

Wenn Sie Hilfe beim Entfernen verwaister Zwischentabellen benötigen, 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 tritt auf, wenn die entsprechende Datendatei (.ibd) im Dateisystem verbleibt, das Datenwörterbuch aber nicht mehr korrekt auf die Datendatei verweist. In diesem Fall ist ein manueller Eingriff erforderlich.

Wenden Sie sich an den Cloud SQL-Support, um dieses Problem zu beheben. Das Supportteam kann eine Platzhalterdatei .frm erstellen und dann mit dem Befehl DROP TABLE versuchen, die Tabelle zu entfernen. Wenn dies nicht gelingt, muss die InnoDB-Datei (.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. Dieser letzte Schritt kann zu Ausfallzeiten für Anwendungen führen, 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 Selfservice-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 mit Unterbrechungen verbunden. Wenn Ihre Organisation einen Supportvertrag hat, empfehlen wir Ihnen dringend, sich an das Cloud SQL-Supportteam zu wenden.

Wenn Sie verwaiste temporäre Tabellen entfernen möchten, folgen Sie zuerst der Anleitung unter Verwaiste temporäre Tabellen. Wenn der Befehl DROP TABLE nicht funktioniert, versuchen Sie es mit den folgenden Vorschlägen.

Hinweis

  • 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 Ihnen dringend, die Instanz zu klonen und die folgenden Migrationsschritte zu prüfen, bevor Sie sie in einer Produktionsumgebung ausführen.

    Weitere Informationen finden Sie unter Instanzen klonen.

Schema mit 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, bereiten Sie alle erforderlichen Skripts im Voraus vor. Ihre Skripts müssen beispielsweise Folgendes verarbeiten können:

  • Tabellen umbenennen und in ein temporäres Schema verschieben.
  • Andere Datenbankobjekte wie Prozeduren, Funktionen, Ansichten und alle anderen sichern.
  • Alle Datenbankobjekte im ursprünglichen Schema wiederherstellen.

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

  1. Erstellen Sie ein temporäres Schema (Beispiel: fix_orphan_tables) in derselben Instanz.
  2. Beenden 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 Name der Datenbank, die Sie verwenden möchten.
    • TABLE_NAME: Der Tabellenname.
  4. Sichern Sie Datenbankobjekte wie Ansichten, Routinen, gespeicherte Prozeduren, Trigger und Ereignisse. Eine Möglichkeit dazu 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 Name der Datenbank, die Sie verwenden möchten.

    Wir empfehlen Ihnen dringend, Ansichten manuell mit dem SHOW CREATE VIEW Befehlsschnipsel zu sichern.

  5. Löschen Sie das Schema mit den verwaisten Tabellen.

  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 Name der Datenbank, die Sie verwenden möchten.
  9. Kopieren Sie alle Datenbankobjekte aus der in Schritt 4 erstellten Sicherung.

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

    Ersetzen Sie die folgenden Werte:

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

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

  10. Setzen Sie den zuvor beendeten Anwendungstraffic fort.

Schema mit Dump und Laden in dieselbe Instanz löschen

Eine andere Möglichkeit, eine verwaiste Tabelle zu entfernen, 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 schneller und weniger komplex. Um Unterbrechungen zu minimieren, bereiten Sie alle Sicherungs- und Wiederherstellungsskripts im Voraus vor.

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

  1. Beenden Sie den Anwendungstraffic 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 neu und stellen Sie die Sicherungsdatei wieder her.
  5. Setzen Sie den Anwendungstraffic fort, der im ersten Schritt beendet wurde.

Dump und Laden in eine neue oder neu erstellte Instanz

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 mit einem logischen Dump und Laden neu erstellen. Beide Ansätze können zu Unterbrechungen der Anwendung führen und erfordern möglicherweise, dass Sie Ihre Anwendungen so konfigurieren, dass sie auf die neu erstellte oder neu erstellte Datenbankinstanz verweisen. In den folgenden Abschnitten werden beide Methoden behandelt.

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

  1. Erstellen Sie mit Database Migration Service eine neue Cloud SQL for MySQL-Instanz.
  2. Nachdem die Replikationsinstanz die Replikation der Daten für die neue Instanz abgeschlossen hat, beenden Sie alle Anwendungen, die eine Verbindung zur Quellinstanz herstellen.
  3. Stufen Sie die Cloud SQL for MySQL-Replikationsinstanz 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.

Manueller Dump und Wiederherstellung

  1. Wenn Sie eine neue Datenbankinstanz erstellen, erstellen Sie eine Instanz mit derselben Konfiguration wie die aktuelle Instanz.
  2. Beenden Sie den gesamten Anwendungstraffic 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 die Instanz und erstellen Sie sie neu.
  5. Stellen Sie mit der in Schritt 3 erstellten Sicherung die Sicherung in der neuen Instanz oder in derselben neu erstellten Instanz wieder her.
  6. Verweisen Sie Ihre Anwendungen auf die neue Instanz oder auf dieselbe neu erstellte Instanz und setzen Sie die Anwendungsvorgänge fort.

Nächste Schritte

  1. Fehlerbehebung
  2. Hauptversion der Datenbank direkt aktualisieren