Bekannte Probleme beim direkten Upgrade der Hauptversion auf MySQL 8.0

Auf dieser Seite werden bekannte Probleme und Inkompatibilitäten beschrieben, die bei einem Upgrade der Hauptversion von Cloud SQL for MySQL 5.7 auf Cloud SQL for MySQL 8.0 auftreten können.

Weitere Informationen zum Upgrade der Hauptversion finden Sie unter Direkte Datenbankaktualisierung durchführen und Fehlerlogs ansehen.

Inkompatible SQL-Änderungen

In diesem Abschnitt werden SQL-Inkompatibilitäten in Cloud SQL 5.7 und Cloud SQL 8.0 aufgeführt, die beim Ausführen des Vorabprüfungstools und während des Upgrades auftreten können.

Reservierte Keywords

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

Warning: The following objects have names that conflict with new reserved
keywords. Ensure queries sent by your applications use `quotes` when referring
to them or they will result in errors.

Einige Keywords wie GROUPS, LEAD oder RANK werden in MySQL-Version 8.0 jetzt als reserviert eingestuft. Das bedeutet, dass einige Wörter, die zuvor als Kennungen verwendet wurden, jetzt als illegal gelten können. Um betroffene Anweisungen zu korrigieren, verwenden Sie Anführungszeichen für Bezeichner oder benennen Sie den Bezeichner um.

Eine vollständige Liste der Schlüsselwörter finden Sie unter Schlüsselwörter und reservierte Wörter.

ASC/DESC-Anweisung mit GROUP BY-Klausel entfernt

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-013235] [Server] Error in parsing Routine db_name.routine_name during
upgrade. You may have an error in your SQL syntax; check the manual that
corresponding to your MySQL server version for the right syntax to use near
'some_text'

Hier ein weiteres Beispiel für eine Fehlermeldung:

[ERROR] [MY-013235] [Server] Unknown trigger has an error in its body: 'You have
an error in you SQL syntax;
[ERROR] [MY-010198] [Server] Error in parsing Triggers from trigger_name.TRG file.

Abfragen, die zuvor auf der GROUP BY-Sortierung basierten, können Ergebnisse liefern, die sich von früheren MySQL-Versionen unterscheiden. Wenn Sie eine bestimmte Sortierreihenfolge beibehalten möchten, geben Sie eine ORDER BY-Klausel an.

Wenn eine gespeicherte Prozedur, ein Trigger oder eine Ereignisdefinition eine Abfrage enthält, in der ASC oder DESC mit der GROUP BY-Klausel verwendet wird, muss die Abfrage des Objekts eine ORDER BY-Klausel enthalten.

Weitere Informationen finden Sie unter Syntax für GROUP BY ASC und DESC entfernen.

Mix aus räumlichen Daten und anderen Typen als Schlüssel

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-013140] [Server] Incorrect prefix key; the used key part isn't a
string, the used length is longer than the key part, or the storage engine doesn't
support unique prefix keys
[ERROR] [MY-013140] [Server] Too many key parts specified; max 1 parts allowed

In MySQL ab Version 8.0 darf ein Index keine Mischung aus räumlichen und anderen Datentypen enthalten. Sie müssen den Schlüssel entfernen und einen neuen erstellen, der in MySQL-Version 8.0 oder höher unterstützt wird. Weitere Informationen finden Sie unter Räumliche Indexe. Verwenden Sie eine Abfrage wie die folgende, um räumliche Datenindexe zu ermitteln:

  SELECT
      s.TABLE_SCHEMA,
      s.TABLE_NAME,
      s.INDEX_NAME,
      s.COLUMN_NAME,
      s.INDEX_TYPE,
      c.DATA_TYPE
  FROM
      information_schema.STATISTICS s
  JOIN
      information_schema.COLUMNS c ON s.TABLE_SCHEMA = c.TABLE_SCHEMA
      AND s.TABLE_NAME = c.TABLE_NAME
      AND s.COLUMN_NAME = c.COLUMN_NAME
  WHERE
      c.DATA_TYPE IN (
          'geometry',
          'point',
          'linestring',
          'polygon',
          'multipoint',
          'multilinestring',
          'multipolygon',
          'geometrycollection'
      )
      AND s.INDEX_TYPE = 'BTREE';

Ungültige UTF-8-Zeichen

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-010765] [Server] Error in Creating DD entry for %s.%s
[ERROR] [MY-013140] [Server] Invalid utf8 character string: invalid_string

Wenn eine Tabellendefinition ungültige UTF-8-Zeichen enthält, kann die Konvertierung der Tabellendefinitionen in das Data Dictionary fehlschlagen. Um dieses Problem zu beheben, ersetzen Sie die ungültigen Zeichen entweder durch die entsprechenden UTF8-Zeichen oder entfernen Sie sie vollständig.

Mit einer Abfrage wie der folgenden können Sie ungültige Zeichen ermitteln und korrigieren:

SHOW CREATE TABLE table_name;

ALTER TABLE table_name MODIFY COLUMN column_name data_type comment='';
// removing invalid utf8 character from comment

Nicht zugesicherte XA-Transaktionen

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-013527] [Server] Upgrade cannot proceed due to an existing prepared XA transactions

Wenn nicht committete XA-Transaktionen vorhanden sind, schlägt das direkte Upgrade der Hauptversion fehl. Um dieses Problem zu beheben, führen Sie vor dem Upgrade die Anweisung XA RECOVER aus. Mit dieser Anweisung wird nach nicht committeten XA-Transaktionen gesucht. Wenn eine Antwort zurückgegeben wird, führen Sie entweder einen Commit der XA-Transaktionen mit der Anweisung XA COMMIT oder einen Rollback der XA-Transaktionen mit der Anweisung XA ROLLBACK durch. Um vorhandene XA-Transaktionen zu prüfen, können Sie einen Befehl wie den folgenden ausführen:

  mysql> XA RECOVER CONVERT xid;
  +----------+--------------+--------------+--------------------------
  | formatID | gtrid_length | bqual_length | data |
  +----------+--------------+--------------+--------------------------
  | 787611   | 9            | 9            | 0x787887111212345678812676152F12345678 |
  +----------+--------------+--------------+--------------------------
  1 row in set (0.00 sec)
  

In diesem Beispiel sehen wir, dass die Werte für gtrid und bqual im Hexadezimalformat angegeben, aber fälschlicherweise verkettet wurden. Um dieses Problem zu beheben, müssen Sie diese Werte manuell anhand der folgenden Felder erstellen:

  • gtrid = 0x787887111212345678
  • bqual = 0x812676152F12345678

Um diese XA-Transaktionen zu committen oder zurückzusetzen, können Sie mit einem Befehl wie dem folgenden eine xid aus diesen Informationen erstellen:

xid: gtrid [, bqual [, formatID ]]

mysql> XA ROLLBACK|COMMIT 0x787887111212345678,0x812676152F12345678,787611;

Maximale Schlüssellänge überschritten

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-013140] [Server] Specified key was too long; max key length is [INTEGER] bytes

Dieses Problem kann durch die sql_mode-Konfiguration verursacht werden. In MySQL-Version 5.7 konnten aufgrund des Fehlens von strengen Modi Indexe mit Einschränkungen für Präfix oder Indexlänge erstellt werden.

In MySQL 8.0 wurden jedoch strenge Modi wie STRICT_ALL_TABLES oder STRICT_TRANS_TABLES eingeführt, die strengere Regeln für die Indexlänge anwenden und diesen Fehler verursachen.

Um das Problem zu beheben, aktualisieren Sie die Länge des Indexpräfixes auf den in der Fehlermeldung angegebenen maximalen Wert in Byte. Beim Standardprotokoll UTFMB4 kann jedes Zeichen bis zu 4 Byte belegen. Die maximale Anzahl von Zeichen lässt sich also ermitteln, indem Sie die maximale Anzahl von Byte durch 4 teilen.

Nicht übereinstimmende Metadaten

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-012084] [InnoDB] Num of Indexes in InnoDB doesn't match with Indexes from server
[ERROR] [MY-012069] [InnoDB] table: TABLE_NAME has xx columns but InnoDB dictionary has yy columns

Hier ein weiteres Beispiel für eine Fehlermeldung:

[ERROR] [MY-010767] [Server] Error in fixing SE data for db_name.table_name

Wenn Sie versuchen, Tabellen mit nicht übereinstimmenden Metadaten zwischen der FRM-Datei und dem InnoDB-Wörterbuch zu aktualisieren, schlägt das Upgrade fehl. In diesem Fall ist die FRM-Datei möglicherweise beschädigt. Um das Problem zu beheben, müssen Sie die betroffenen Tabellen exportieren und wiederherstellen, bevor Sie versuchen, ein Upgrade durchzuführen.

Weitere Informationen finden Sie unter Versuch, Tabellen mit nicht übereinstimmenden Metadaten zu aktualisieren.

Um die betroffenen Tabellen zu exportieren und wiederherzustellen, können Sie einen Befehl wie den folgenden ausführen:

mysqldump --databases database_name --host=$host --user=$user --password=$password > database_dump.sql

mysql> source database_dump.sql;

Fremdschlüsselname mit mehr als 64 Zeichen

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-012054] [InnoDB] Foreign key name:key_name is too long

Dieser Fehler weist darauf hin, dass Namen von Fremdschlüsseleinschränkungen in Tabellen nicht länger als 64 Zeichen sein dürfen. Um Tabellen mit zu langen Einschränkungsnamen zu identifizieren, können Sie einen Befehl wie den folgenden verwenden:

SELECT CONSTRAINT_NAME, TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CHAR_LENGTH(CONSTRAINT_NAME) > 64;

Wenn eine Tabelle einen Einschränkungsnamen mit mehr als 64 Zeichen enthält, verwenden Sie den Befehl ALTER TABLE, um die Einschränkung umzubenennen und das Zeichenlimit einzuhalten:

ALTER TABLE your_table RENAME CONSTRAINT your_long_constraint_name TO your_new_constraint_name;

Nicht übereinstimmende Groß-/Kleinschreibung in Tabellennamen

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-013521] [Server] Table name 'SCHEMA_NAME.TABLE_NAME' containing upper case characters is not allowed with lower_case_table_names = 1.

Wenn für Instanzen mit MySQL-Version 5.7 Kleinbuchstaben für Tabellennamen erforderlich sind (lower_case_table_names=1), müssen alle Tabellennamen in Kleinbuchstaben konvertiert werden, bevor ein Upgrade auf MySQL-Version 8.0 erfolgt.

Alternativ können Sie die Anforderung (lower_case_table_names=0) deaktivieren und dann die Instanz aktualisieren. Wenn Sie den Wert des Felds lower_case_table_names von 1 in 0 ändern, können Sie den Wert in MySQL 8.0 nicht mehr zurückändern.

Von InnoDB erkannte Tabellen, die zu einer anderen Engine gehören

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

Error: Following tables are recognized by InnoDB engine while the SQL layer believes they belong to a different engine. Such situation may happen when one removed InnoDB files manually from the disk and creates a table with same name by using different engine.

Wenn es in der Datenbank Tabellen gibt, die von der InnoDB-Engine erkannt werden, aber nicht von der SQL-Ebene, schlägt das Upgrade fehl.

So finden Sie alle Tabellen in der Datenbank, die nicht das InnoDB-Speichermodul verwenden:

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE != 'InnoDB'

Führen Sie für jede erkannte Tabelle einen ALTER TABLE-Befehl aus, um das Speichermodul in InnoDB zu ändern.

ALTER TABLE db_name.table_name ENGINE='INNODB';

Unbekannte Partition der Speicher-Engine

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[System] [MY-011012] [Server] Starting upgrade of data directory. [ERROR] [MY-013140] [Server] Unknown storage engine 'partition'

In MySQL 8.0 sind keine Partitionen in der Engine außer InnoDB und ndbcluster zulässig. Sie müssen nach Tabellen mit Partitionen suchen, deren Engine nicht InnoDB ist. Führen Sie die folgende Abfrage aus, um diese Tabellen zu ermitteln:

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

Jede Tabelle, die von der Abfrage gemeldet wird, muss aktualisiert werden, damit sie InnoDB verwendet, oder so konfiguriert werden, dass sie nicht partitioniert ist. Führen Sie diese Anweisung aus, um das Speichermodul einer Tabelle in InnoDB zu ändern:

ALTER TABLE db_name.table_name ENGINE = INNODB;

MVU-Vorgang mit langer Ausführungszeit

Mit einem Upgrade auf eine Hauptversion sind zwei zugrunde liegende Aufgaben verbunden:

  • Vorabprüfung: Gibt einen Zeitüberschreitungsfehler zurück, wenn sie nicht innerhalb von drei Stunden abgeschlossen ist.
  • Upgradevorgang: Gibt einen Zeitüberschreitungsfehler zurück, wenn er nicht innerhalb von sechs Stunden abgeschlossen wird.

Wenn für die Instanz ein MAJOR_VERSION_UPGRADE-Vorgang länger als erwartet ausgeführt wird, können Sie die MySQL-Fehlerlogs untersuchen, um zu prüfen, ob der Vorgang bei einem Metadaten-Upgrade blockiert ist oder bei einem Vorabprüfungsschritt hängen bleibt. Die häufigsten Ursachen für dieses Problem sind:

  • Eine sehr große Anzahl von Tabellen, Ansichten oder Indexen
  • Unzureichende Ressourcen wie CPU oder Arbeitsspeicher
  • Wichtige Transaktionen verhindern das Herunterfahren von Datenbanken, damit der Aktualisierungsprozess beginnen kann. Sie können die Trusted Cloud by S3NS Console verwenden, um aktuelle Prozesse zu prüfen.

Zu viele geöffnete Dateien im System

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-012592] [InnoDB] Operating system error number 23 in a file operation
[ERROR] [MY-012596] [InnoDB] Error number 23 means 'Too many open files in system'

Wenn die Instanz mehr als 2 Millionen Tabellen enthält, erhalten Sie möglicherweise eine Fehlermeldung, die darauf hinweist, dass „zu viele Dateien im System geöffnet sind“. Möglicherweise müssen Sie die Anzahl der Tabellen vor dem Upgrade auf weniger als 2 Millionen reduzieren.

Fehler aufgrund fehlenden Speichers

Beim Upgrade von MySQL 5.7 auf 8.0 ist zusätzlicher Arbeitsspeicher erforderlich, um alte Metadaten in das neue Datenwörterbuch zu konvertieren. Damit beim Upgrade der Hauptversion kein Fehler vom Typ „out of memory“ auftritt, empfiehlt Cloud SQL, dass für jede Tabelle mindestens 100 KB Arbeitsspeicher zur Verfügung stehen.

Mit der folgenden Abfrage können Sie die Anzahl der Tabellen ermitteln:

SELECT table_schema AS 'Database Name', COUNT(*) AS 'Number of Tables' FROM information_schema.tables

Um das Problem zu beheben, können Sie den Arbeitsspeicher vor dem Start des Upgrades vorübergehend erhöhen, indem Sie den Maschinentyp ändern.

Für Instanzen mit gemeinsam genutztem Kern (z. B. Micro- oder Small-Kerne, einschließlich db-f1-micro, db-g1-small, HA db-f1-micro, HA db-g1-small) sollten Sie während des Upgrades auf eine Instanz mit dediziertem Kern umstellen, um potenzielle ressourcenbezogene Probleme zu vermeiden. Sie können es nach Abschluss des Upgrades wieder downgraden.

MySQL-Herunterfahrfehler

Hier sehen Sie ein Beispiel für eine Fehlermeldung:

[ERROR] [MY-012526] [InnoDB] Upgrade after a crash is not supported.

Cloud SQL führt vor dem Upgrade der Hauptversion ein sauberes Herunterfahren durch. Bei Instanzen mit hohen Arbeitslasten oder lang andauernden Transaktionen kann der Herunterfahrvorgang länger dauern, was möglicherweise zu einem Zeitlimit und einem fehlgeschlagenen Upgrade führt. Damit das Upgrade erfolgreich durchgeführt werden kann, sollten Sie es für einen Zeitraum mit geringem Traffic und ohne lang andauernde Transaktionen planen.

Nächste Schritte