MySQL 8.0 リファレンスマニュアル


2.11.5 アップグレード用のインストールの準備

最新の MySQL 8.0 リリースにアップグレードする前に、次に説明する事前チェックを実行して、現在の MySQL 5.7 または MySQL 8.0 サーバーインスタンスのアップグレード準備状況を確認します。 そうしないと、アップグレードプロセスが失敗する可能性があります。

ヒント

MySQL サーバーインスタンスのアップグレード準備ができているかどうかを確認できる MySQL Shell upgrade checker utility の使用を検討してください。 MySQL Server 8.0.11 から現在の MySQL Shell リリース番号と一致する MySQL Server リリース番号まで、アップグレード先のターゲット MySQL Server リリースを選択できます。 アップグレードチェッカユーティリティは、指定されたターゲットリリースに関連する自動チェックを実行し、手動で行う必要がある関連チェックをさらにアドバイスします。 アップグレードチェッカは、MySQL 5.7 および 8.0 のすべての GA リリースで機能します。 MySQL Shell のインストール手順は、here にあります。

予備チェック:

  1. 次の問題は存在してはいけません:

    • 廃止されたデータ型または関数を使用するテーブルは存在しない必要があります。

      テーブルに 5.6.4 より前の形式 (TIMEDATETIME および TIMESTAMP カラムで小数秒精度がサポートされていない) の古い時間カラムが含まれている場合、MySQL 8.0 へのインプレースアップグレードはサポートされません。 テーブルで古い一時カラム形式を使用している場合は、MySQL 8.0 へのインプレースアップグレードを試行する前に、REPAIR TABLE を使用してそれらをアップグレードします。 詳細は、MySQL 5.7 Reference ManualServer Changes を参照してください。

    • 孤立した .frm ファイルは存在できません。

    • トリガーには、欠落している定義者、空の定義者、または無効な作成コンテキスト (SHOW TRIGGERS または INFORMATION_SCHEMA TRIGGERS テーブルで表示される character_set_client, collation_connection, Database Collation 属性で示される) を指定できません。 このようなトリガーをダンプしてリストアし、問題を修正する必要があります。

    これらの問題を確認するには、次のコマンドを実行します:

    mysqlcheck -u root -p --all-databases --check-upgrade

    mysqlcheck からエラーが報告された場合は、問題を修正します。

  2. ネイティブパーティション化がサポートされていないストレージエンジンを使用するパーティションテーブルは存在しない必要があります。 このようなテーブルを識別するには、次のクエリーを実行します:

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

    クエリーによってレポートされるテーブルは、InnoDB を使用するように変更するか、非パーティション化する必要があります。 テーブルストレージエンジンを InnoDB に変更するには、次のステートメントを実行します:

    ALTER TABLE table_name ENGINE = INNODB;

    MyISAM テーブルの InnoDB への変換の詳細は、セクション15.6.1.5「MyISAM から InnoDB へのテーブルの変換」 を参照してください。

    パーティションテーブルを非パーティションテーブルにするには、次のステートメントを実行します:

    ALTER TABLE table_name REMOVE PARTITIONING;
  3. 一部のキーワードは、以前に予約されていない MySQL 8.0 で予約されている場合があります。 セクション9.3「キーワードと予約語」を参照してください。 これにより、以前に識別子として使用された単語が不正になる可能性があります。 影響を受けるステートメントを修正するには、識別子の引用符を使用します。 セクション9.2「スキーマオブジェクト名」を参照してください。

  4. MySQL 5.7 mysql システムデータベースには、MySQL 8.0 データディクショナリで使用されるテーブルと同じ名前のテーブルは存在しない必要があります。 これらの名前を持つテーブルを識別するには、次のクエリーを実行します:

    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE LOWER(TABLE_SCHEMA) = 'mysql'
    and LOWER(TABLE_NAME) IN
    (
    'catalogs',
    'character_sets',
    'check_constraints',
    'collations',
    'column_statistics',
    'column_type_elements',
    'columns',
    'dd_properties',
    'events',
    'foreign_key_column_usage',
    'foreign_keys',
    'index_column_usage',
    'index_partitions',
    'index_stats',
    'indexes',
    'parameter_type_elements',
    'parameters',
    'resource_groups',
    'routines',
    'schemata',
    'st_spatial_reference_systems',
    'table_partition_values',
    'table_partitions',
    'table_stats',
    'tables',
    'tablespace_files',
    'tablespaces',
    'triggers',
    'view_routine_usage',
    'view_table_usage'
    );

    クエリーによってレポートされたテーブルは、削除または名前変更する必要があります (RENAME TABLE を使用)。 これには、影響を受けるテーブルを使用するアプリケーションへの変更が含まれる場合もあります。

  5. 64 文字を超える外部キー制約名を持つテーブルは使用できません。 制約名が長すぎるテーブルを識別するには、次のクエリーを使用します:

    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME IN
      (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1),
                   INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1)
       FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN
       WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);

    制約名が 64 文字を超えるテーブルの場合は、制約を削除し、64 文字を超えない制約名で追加しなおします (ALTER TABLE を使用)。

  6. sql_mode システム変数で定義されている廃止された SQL モードは使用できません。 廃止された SQL モードを使用しようとすると、MySQL 8.0 が起動しなくなります。 廃止された SQL モードを使用するアプリケーションは、回避するために修正する必要があります。 MySQL 8.0 で削除された SQL モードの詳細は、サーバーの変更 を参照してください。

  7. 明示的に定義されたカラム名が 64 文字を超えるビューは存在しない必要があります (MySQL 5.7 では、カラム名が 255 文字以内のビューが許可されていました)。 アップグレードエラーを回避するには、アップグレード前にこのようなビューを変更する必要があります。 現在、カラム名が 64 文字を超えるビューを識別する唯一の方法は、SHOW CREATE VIEW を使用してビュー定義を検査することです。 INFORMATION_SCHEMA.VIEWS テーブルをクエリーすることで、ビュー定義を検査することもできます。

  8. 個々の ENUM または SET カラム要素の長さが 255 文字または 1020 バイトを超えるテーブルまたはストアドプロシージャは使用できません。 MySQL 8.0 より前は、ENUM または SET のカラム要素の最大長は 64K でした。 MySQL 8.0 では、個々の ENUM または SET カラム要素の最大文字長は 255 文字で、最大バイト長は 1020 バイトです。 (1020 バイトの制限では、マルチバイト文字セットがサポートされます)。 MySQL 8.0 にアップグレードする前に、新しい制限を超える ENUM または SET のカラム要素を変更します。 そうしないと、アップグレードはエラーで失敗します。

  9. MySQL 8.0.13 以上にアップグレードする前に、システムテーブルスペースおよび一般テーブルスペースを含む共有 InnoDB テーブルスペースにテーブルパーティションが存在していない必要があります。 INFORMATION_SCHEMA をクエリーして、共有テーブルスペースのテーブルパーティションを識別します:

    MySQL 5.7 からアップグレードする場合は、次のクエリーを実行します:

    SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
      WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';

    以前の MySQL 8.0 リリースからアップグレードする場合は、次のクエリーを実行します:

    SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLES
      WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';

    ALTER TABLE ... REORGANIZE PARTITION を使用して、テーブルパーティションを共有テーブルスペースから file-per-table テーブルスペースに移動します:

    ALTER TABLE table_name REORGANIZE PARTITION partition_name
      INTO (partition_definition TABLESPACE=innodb_file_per_table);
  10. GROUP BY 句に ASC または DESC 修飾子を使用する MySQL 8.0.12 以下のクエリーおよびストアドプログラム定義は使用できません。 そうしないと、MySQL 8.0.13 以上のレプリカサーバーにレプリケートされる可能性があるため、MySQL 8.0.13 以上へのアップグレードが失敗することがあります。 追加の詳細については、SQL の変更を参照してください。

  11. MySQL 5.7 インストールでは、MySQL 8.0 でサポートされていない機能を使用しないでください。 ここでの変更はインストール固有である必要がありますが、次の例は検索する内容の種類を示しています:

    一部のサーバー起動オプションおよびシステム変数は、MySQL 8.0 で削除されました。 Features Removed in MySQL 8.0およびServer and Status Variables and Options Added, Deprecated, or Removed in MySQL 8.0を参照してください。 これらのいずれかを使用する場合、アップグレードには構成の変更が必要です。

    例: データディクショナリはデータベースオブジェクトに関する情報を提供するため、サーバーはデータディレクトリ内のディレクトリ名をチェックしてデータベースを検索しなくなりました。 したがって、--ignore-db-dir オプションは無関係であり、削除されています。 これを処理するには、起動構成から --ignore-db-dir のインスタンスを削除します。 また、MySQL 8.0 にアップグレードする前に、名前付きデータディレクトリのサブディレクトリを削除または移動します。 (または、8.0 サーバーでこれらのディレクトリをデータベースとしてデータディクショナリに追加し、DROP DATABASE を使用してこれらの各データベースを削除します。)

  12. アップグレード時に lower_case_table_names 設定を 1 に変更する場合は、アップグレード前にスキーマ名とテーブル名が小文字であることを確認してください。 そうしないと、スキーマ名またはテーブル名の大文字と小文字の不一致が原因で障害が発生する可能性があります。 次のクエリーを使用して、大文字を含むスキーマおよびテーブル名を確認できます:

    mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != LOWER(TABLE_NAME) AND TABLE_TYPE = 'BASE TABLE';
    mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME != LOWER(SCHEMA_NAME);

    MySQL 8.0.19 では、lower_case_table_names=1 の場合、アップグレードプロセスによってテーブル名およびスキーマ名がチェックされ、すべての文字が小文字であることが確認されます。 テーブル名またはスキーマ名に大文字が含まれていることが判明した場合、アップグレードプロセスはエラーで失敗します。

    注記

    アップグレード時に lower_case_table_names 設定を変更することはお薦めしません。

前述のいずれかの問題が原因で MySQL 8.0 へのアップグレードが失敗した場合、サーバーはすべての変更をデータディレクトリに戻します。 この場合は、すべての redo ログファイルを削除し、既存のデータディレクトリで MySQL 5.7 サーバーを再起動してエラーに対処します。 redo ログファイル (ib_logfile*) は、デフォルトでは MySQL データディレクトリにあります。 エラーが修正されたら、アップグレードを再試行する前に、(innodb_fast_shutdown=0 を設定して) 低速な停止を実行します。


関連キーワード:  インストール, テーブル, TABLE, SCHEMA, NAME, サーバー, 変更, INFORMATION, 確認, 文字