MySQL 8.0 へのインプレース メジャー バージョン アップグレードのトラブルシューティング

このページでは、Cloud SQL for MySQL 5.7 から Cloud SQL for MySQL 8.0 へのメジャー バージョンのアップグレードを実行する際に、事前チェック オペレーションで発生する可能性がある既知の問題と非互換性について説明します。

メジャー バージョンのアップグレードの詳細については、データベースのメジャー バージョンをインプレースでアップグレードするエラーログを表示するをご覧ください。

互換性のない SQL の変更

このセクションでは、事前チェック ユーティリティの実行時またはアップグレード時に発生する可能性がある Cloud SQL 5.7 と Cloud SQL 8.0 の SQL の非互換性について説明し、それぞれのエラーの修正方法について説明します。

予約済みキーワード

予約済みのキーワードを使用しようとすると、次のエラーが発生します。

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.

このエラーは、MySQL バージョン 8.0 で予約済みとして分類されるようになったキーワード(次のようなキーワード)を使用しようとすると発生します。

  • GROUPS
  • LEAD
  • RANK

つまり、以前は識別子として使用されていた一部のキーワードが、現在は不正と見なされる可能性があります。この問題を解決するには、識別子の引用符を使用するか、識別子の名前を変更して、影響を受けるステートメントを修正します。

キーワードの完全なリストについては、キーワードと予約語をご覧ください。

GROUP BY 句で ASC / DESC が削除されている

GROUP BY 句で ASC/DESC を使用しようとすると、次のエラーが発生します。

[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'

この場合、次のエラー メッセージが表示されることもあります。

[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.

GROUP BY を使用してクエリを並べ替えようとすると、このエラーが発生します。

以前に GROUP BY ソートに依存していたクエリでは、以前の MySQL バージョンとは異なる結果が生成される可能性があります。特定の並べ替え順序を保持するには、ORDER BY 句を指定します。

この問題を解決するには、ORDER BY 句を使用します。たとえば、ストアド プロシージャ、トリガー、イベント定義に GROUP BY 句で ASC または DESC を使用するクエリが含まれている場合、そのオブジェクトのクエリには ORDER BY 句が必要です。

詳細については、GROUP BY ASC と DESC の構文を削除するをご覧ください。

キーとして空間データ型と他のデータ型が混在している

間違った接頭辞キーを使用すると、次のエラーが発生します。

[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

このエラーは、キーとして空間データ型と他のデータ型が混在している場合、発生します。

MySQL バージョン 8.0 以降では、インデックスに空間データ型と他のデータ型を混在させることはできません。鍵を削除して、MySQL バージョン 8.0 以降でサポートされている新しい鍵を作成する必要があります。詳細については、空間インデックスをご覧ください。

この問題を解決するには、次のようなクエリを使用して空間データ インデックスを特定します。

  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';

無効な UTF8 文字

無効な UTF8 文字列を使用すると、次のエラーが発生します。

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

このエラーは、コマンドに無効な UTF8 文字が含まれている場合に発生します。たとえば、テーブル定義に無効な UTF8 文字が含まれている場合、テーブル定義をデータ ディクショナリに変換できないことがあります。

この問題を解決するには、無効な文字を対応する UTF8 文字に置き換えるか、完全に削除します。

無効な文字を特定して対処するには、次のようなクエリを使用します。

SHOW CREATE TABLE table_name;

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

commit されていない XA トランザクション

準備済みの XA トランザクションが存在する場合、次のエラーが発生します。

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

このエラーは、commit されていない XA トランザクションがあり、インプレース メジャー バージョン アップグレードが失敗した場合に発生します。

この問題を解決するには、アップグレードを完了する前に XA RECOVER ステートメントを実行します。このステートメントは、commit されていない XA トランザクションを確認します。

レスポンスが返された場合は、XA COMMIT を発行して XA トランザクションを commit するか、XA ROLLBACK ステートメントを発行して XA トランザクションをロールバックします。

既存の XA トランザクションを確認するには、次のようなコマンドを実行します。

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

この例では、gtridbqual の値が 16 進数形式で指定されていますが、誤って連結されています。この問題を解決するには、次のフィールドを使用してこれらの値を手動で作成する必要があります。

  • gtrid = 0x787887111212345678
  • bqual = 0x812676152F12345678

これらの XA トランザクションを commit またはロールバックするには、次のようなコマンドを使用して、この情報から xid を作成します。

xid: gtrid [, bqual [, formatID ]]

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

キーの最大長を超えている

指定されたキーが長すぎると、次のエラーが発生します。

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

このエラーは、指定された鍵の長さが許容される上限を超えている場合に発生します。

この問題は、sql_mode 構成が原因で発生する可能性があります。MySQL バージョン 5.7 では、厳密モードがないため、接頭辞またはインデックスの長さに制限を付けてインデックスを作成できました。

ただし、MySQL バージョン 8.0 では、STRICT_ALL_TABLESSTRICT_TRANS_TABLES などの厳格モードが導入され、インデックスの長さに厳しいルールが適用されるため、このエラーが発生します。

この問題を解決するには、インデックス接頭辞の長さをエラー メッセージに示されている最大バイト数以内に更新します。デフォルトのプロトコルである UTFMB4 では、各文字が最大 4 バイトを占有します。つまり、最大文字数は最大バイト数を 4 で割ることで決定できます。

メタデータ情報が一致しない

メタデータが一致しない場合、次のエラーが発生します。

[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

この場合、次のエラー メッセージが表示されることもあります。

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

このエラーは、メタデータが一致しないテーブルをアップグレードしようとすると発生します。

たとえば、FRM ファイルと InnoDB データ ディクショナリの間でメタデータが一致しないテーブルをアップグレードしようとすると、アップグレードは失敗します。この場合、FRM ファイルが破損している可能性があります。この問題を解決するには、アップグレードを試みる前に、影響を受けるテーブルをダンプして復元する必要があります。

詳細については、メタデータが一致しないテーブルのアップグレードを試みるをご覧ください。

影響を受けたテーブルをダンプして復元するには、次のようなコマンドを実行します。

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

mysql> source database_dump.sql;

外部キー名が 64 文字を超えている

外部キー制約名が長すぎると、次のエラーが発生します。

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

このエラーは、外部キー名が 64 文字を超えている場合に発生します。

この問題を解決するには、次のようなコマンドを使用して、制約名が長すぎるテーブルを特定します。

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

テーブルに 64 文字を超える制約名が含まれている場合は、ALTER TABLE コマンドを使用して、この文字数制限内で制約名を変更します。

ALTER TABLE your_table RENAME CONSTRAINT your_long_constraint_name TO your_new_constraint_name;

テーブル名の大文字と小文字が一致しない

正確なテーブル名を使用しないと、次のエラーが発生します。

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

このエラーは、テーブル名の大文字と小文字が一致しない場合に発生します。

この問題を解決するには、MySQL バージョン 5.7 のインスタンスで小文字のテーブル名(lower_case_table_names=1)が必要な場合は、MySQL バージョン 8.0 にアップグレードする前に、すべてのテーブル名を小文字に変換する必要があります。

または、要件(lower_case_table_names=0)を無効にしてから、インスタンスをアップグレードすることもできます。lower_case_table_names フィールドの値を 1 から 0 に変更すると、MySQL バージョン 8.0 で値を元に戻すことはできません。

テーブルが別のエンジンに属する InnoDB で認識される

テーブルが InnoDB で認識されているが、実際には別のエンジンに属している場合、次のエラーが発生します。

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.

このエラーは、テーブルを削除してから、別のエンジンを使用して同じ名前の新しいテーブルを作成すると発生します。

InnoDB エンジンが認識するが SQL レイヤが認識しないテーブルがデータベースにある場合、アップグレードは失敗します。

この問題を解決するには、InnoDB ストレージ エンジンを使用していないすべてのテーブルをデータベース内で検索します。

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

特定されたテーブルごとに、ALTER TABLE コマンドを実行して、ストレージ エンジンを InnoDB に変更します。

ALTER TABLE db_name.table_name ENGINE='INNODB';

不明なストレージ エンジン partition

不明なストレージ エンジンを使用しようとすると、次のエラーが発生します。

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

このエラーは、エンジンにサポートされていないパーティションがある場合に発生します。

MySQL バージョン 8.0 では、ストレージ エンジンで次のパーティションのみが許可されます。

  • InnoDB
  • ndbcluster

この問題を解決するには、パーティションがあり、エンジンが InnoDB ではないテーブルを確認する必要があります。

これらのテーブルを特定するには、次のクエリを使用します。

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

クエリで報告されたテーブルは、InnoDB を使用するように更新するか、パーティション分割されないように構成する必要があります。テーブルのストレージ エンジンを InnoDB に変更するには、次のステートメントを実行します。

ALTER TABLE db_name.table_name ENGINE = INNODB;

MVU オペレーションの実行時間が長い

メジャー バージョンのアップグレードに関連する基盤となるタスクは 2 つあります。

  • 事前チェック オペレーション: 3 時間以内に完了しない場合は、タイムアウト エラーを返します。
  • アップグレード オペレーション: 6 時間以内に完了しない場合は、タイムアウト エラーを返します。

インスタンスで進行中の MAJOR_VERSION_UPGRADE オペレーションが予想よりも長い時間実行されている場合は、MySQL エラーログを調べて、メタデータのアップグレードでブロックされているか、事前チェックのステップで停止しているかを確認できます。この問題の最も一般的な原因は次のとおりです。

  • テーブル、ビュー、インデックスの数が非常に多い
  • CPU やメモリなどのリソースの不足
  • 主要なトランザクションで、アップグレード プロセスを開始するためのデータベースのシャットダウンがブロックされている。 Google Cloud コンソールを使用して、現在のプロセスを確認できます。

システムで開いているファイルが多すぎる

システムで開いているファイルが多すぎると、次のエラーが発生します。

[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'

このエラーは、たとえば、インスタンスに 200 万個を超えるテーブルが含まれている場合に発生します。この場合、「システムで開いているファイルが多すぎます」というエラーが表示されることがあります。

この問題を解決するには、アップグレードする前にテーブルの数を減らします。

メモリ不足エラー

メモリが不足すると、次のエラーが発生します。

Out of memory

このエラーは、テーブルに十分なメモリが割り当てられていない場合に発生します。

MySQL 5.7 から 8.0 にアップグレードする場合は、古いメタデータを新しいデータ ディクショナリに変換するため、追加のメモリが必要になります。

この問題を解決するには、テーブルごとに少なくとも 100 KB のメモリを用意することをおすすめします。

テーブルの数を確認するには、次のクエリを使用します。

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

アップグレードを開始する前に、マシンタイプを変更してメモリを一時的に増やすことができます。

共有コア インスタンス(db-f1-microdb-g1-smallHA db-f1-microHA db-g1-small などのmicro または small コア)の場合は、アップグレード オペレーション中に専用コア インスタンスにアップグレードして、リソース関連の問題を回避します。アップグレード オペレーションが完了したら、ダウングレードできます。

MySQL のシャットダウン エラー

クラッシュ後にアップグレードしようとすると、次のエラーが発生します。

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

このエラーは、以前のシャットダウンが予想以上に時間がかかった場合に発生します。

Cloud SQL は、メジャー バージョンのアップグレードの前にクリーン シャットダウンを実行します。ワークロードの負荷が高いインスタンスやトランザクションの実行時間が長いインスタンスでは、シャットダウン プロセスが長くなる可能性があり、タイムアウトが発生してアップグレードが失敗する可能性があります。

この問題を解決し、アップグレードを確実に成功させるには、長時間実行されるトランザクションがなく、トラフィックが少ない時間帯にアップグレードを計画します。

次のステップ