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


2.11.3 MySQL のアップグレードプロセスの内容

新しいバージョンの MySQL をインストールするには、既存のインストールの次の部分をアップグレードする必要がある場合があります:

  • mysql システムスキーマ。MySQL サーバーの実行時に必要な情報を格納するテーブルが含まれています (セクション5.3「mysql システムスキーマ」 を参照)。mysql スキーマテーブルは、次の 2 つの広範なカテゴリに分類されます:

    • データディクショナリテーブル:データベースオブジェクトメタデータを格納します。

    • 他の操作目的で使用されるシステムテーブル (残りの非データディクショナリテーブル)。

  • その他のスキーマ。一部は組込みであり、サーバーによって owned とみなされる場合があります。その他のスキーマには、次のものはありません:

    • パフォーマンススキーマ、INFORMATION_SCHEMAndbinfo、および sys スキーマ。

    • ユーザースキーマ。

アップグレードが必要になる可能性があるインストールの各部分には、次の 2 つの異なるバージョン番号が関連付けられています:

  • データディクショナリのバージョン。 これはデータディクショナリテーブルに適用されます。

  • サーバーのバージョン (MySQL バージョンとも呼ばれます)。 これは、他のスキーマ内のシステムテーブルおよびオブジェクトに適用されます。

どちらの場合も、既存の MySQL インストールに適用可能な実際のバージョンがデータディクショナリに格納され、現在予想されているバージョンが新しいバージョンの MySQL にコンパイルされます。 実際のバージョンが現在予想されているバージョンより低い場合は、そのバージョンに関連付けられているインストールの一部を現在のバージョンにアップグレードする必要があります。 両方のバージョンでアップグレードが必要であることが示されている場合は、まずデータディクショナリのアップグレードを実行する必要があります。

前述の 2 つの異なるバージョンの反射として、アップグレードは次の 2 つのステップで実行されます:

  • ステップ 1: データディクショナリのアップグレード。

    このステップでは、次のアップグレードを行います:

    • mysql スキーマ内のデータディクショナリテーブル。 実際のデータディクショナリのバージョンが現在予想されているバージョンより低い場合、サーバーは、更新された定義を含むデータディクショナリテーブルを作成し、永続化されたメタデータを新しいテーブルにコピーし、古いテーブルを新しいテーブルに原子的に置き換え、データディクショナリを再初期化します。

    • パフォーマンススキーマ、INFORMATION_SCHEMA、および ndbinfo

  • ステップ 2: サーバーのアップグレード。

    このステップは、他のすべてのアップグレードタスクで構成されます。 既存の MySQL インストールのサーバーバージョンが、新しくインストールされた MySQL バージョンより低い場合は、他のすべてをアップグレードする必要があります:

    • mysql スキーマ内のシステムテーブル (残りの非データディクショナリテーブル)。

    • sys スキーマ。

    • ユーザースキーマ。

データディクショナリのアップグレード (ステップ 1) は、起動時に必要に応じてこのタスクを実行するサーバーの役割です。ただし、起動を妨げるオプションを指定して起動した場合は除きます。 このオプションは、MySQL 8.0.16、MySQL 8.0.16 より前の --no-dd-upgrade の時点での --upgrade=NONE です。

データディクショナリは期限切れだが、サーバーがアップグレードできない場合、サーバーは実行されず、かわりにエラーで終了します。 例:

[ERROR] [MY-013381] [Server] Server shutting down because upgrade is
required, yet prohibited by the command line option '--upgrade=NONE'.
[ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

ステップ 2 の職責に対するいくつかの変更は、MySQL 8.0.16 で発生しました:

  • MySQL 8.0.16 より前は、mysql_upgrade によって、パフォーマンススキーマ、INFORMATION_SCHEMA およびステップ 2 で説明したオブジェクトがアップグレードされます。 DBA は、サーバーの起動後に mysql_upgrade を手動で起動する必要があります。

  • MySQL 8.0.16 の時点で、サーバーは以前に mysql_upgrade によって処理されたすべてのタスクを実行します。 アップグレードは 2 ステップの操作のままですが、サーバーは両方を実行するため、プロセスが簡単になります。

アップグレード先の MySQL のバージョンに応じて、インプレースアップグレード および 論理アップグレード の手順は、サーバーがすべてのアップグレードタスクを実行するか、サーバーの起動後に mysql_upgrade も起動する必要があるかを示します。

注記

サーバーはパフォーマンススキーマ、INFORMATION_SCHEMA、および MySQL 8.0.16 の時点でステップ 2 で説明されているオブジェクトをアップグレードするため、mysql_upgrade は不要であり、そのバージョンでは非推奨になっています。将来のバージョンの MySQL で削除される予定です。

ステップ 2 で発生する処理のほとんどは、MySQL 8.0.16 の前と時点で同じですが、特定の効果を得るために異なるコマンドオプションが必要になる場合があります。

MySQL 8.0.16 の時点で、--upgrade サーバーオプションは、サーバーが起動時に自動アップグレードを実行するかどうか、およびその方法を制御します:

  • オプションを指定しない場合、または --upgrade=AUTO を指定した場合、サーバーは最新でないと判断したものをすべてアップグレードします (ステップ 1 および 2)。

  • --upgrade=NONE では、サーバーは何もアップグレードしません (ステップ 1 および 2 はスキップします)。ただし、データディクショナリをアップグレードする必要がある場合はエラーで終了します。 古いデータディクショナリを使用してサーバーを実行することはできません。サーバーはサーバーのアップグレードまたは終了を要求します。

  • --upgrade=MINIMAL を使用すると、サーバーは必要に応じてデータディクショナリ、パフォーマンススキーマおよび INFORMATION_SCHEMA をアップグレードします (ステップ 1)。 このオプションを使用したアップグレード後は、レプリケーション内部が依存するシステムテーブルは更新されず、他の領域でも機能が低下する可能性があるため、Group Replication を起動できないことに注意してください。

  • --upgrade=FORCE では、サーバーは必要に応じてデータディクショナリ、パフォーマンススキーマおよび INFORMATION_SCHEMA をアップグレードし (ステップ 1)、他のすべてのものを強制的にアップグレードします (ステップ 2)。 サーバーはすべてのスキーマ内のすべてのオブジェクトをチェックするため、このオプションではサーバーの起動に時間がかかります。

FORCE は、必要ないとサーバーが判断した場合に、ステップ 2 のアクションを強制的に実行する場合に役立ちます。 FORCEAUTO の違いの 1 つは、FORCE では、ヘルプテーブルやタイムゾーンテーブルが欠落している場合は、サーバーによってシステムテーブル (ヘルプテーブルやタイムゾーンテーブルなど) が再作成されることです。

次のリストは、MySQL 8.0.16 より前のアップグレードコマンドと、MySQL 8.0.16 以上の同等のコマンドを示しています:

  • 通常のアップグレードを実行します (必要に応じてステップ 1 および 2):

    • MySQL 8.0.16 より前: mysqld とそれに続く mysql_upgrade

    • MySQL 8.0.16 の時点: mysqld

  • 必要に応じて、ステップ 1 のみを実行します:

    • MySQL 8.0.16 より前: ステップ 2 で説明したアップグレードタスクを除外して、ステップ 1 で説明したすべてのアップグレードタスクを実行することはできません。 ただし、ユーザースキーマおよび sys スキーマのアップグレードは、mysqld の後に --upgrade-system-tables および --skip-sys-schema オプションを指定した mysql_upgrade を使用して回避できます。

    • MySQL 8.0.16 の時点: mysqld --upgrade=MINIMAL

  • 必要に応じてステップ 1 を実行し、ステップ 2 を強制します:

    • MySQL 8.0.16 より前: mysqld とそれに続く mysql_upgrade --force

    • MySQL 8.0.16 の時点: mysqld --upgrade=FORCE

MySQL 8.0.16 より前は、特定の mysql_upgrade オプションが実行するアクションに影響します。 次のテーブルに、同様の効果を得るために MySQL 8.0.16 の時点で使用するサーバー --upgrade オプションの値を示します。 (指定された --upgrade オプション値には追加の効果がある場合があるため、これらは必ずしも完全に同等であるとはかぎりません。)

mysql_upgrade オプション サーバーオプション
--skip-sys-schema --upgrade=NONE または --upgrade=MINIMAL
--upgrade-system-tables --upgrade=NONE または --upgrade=MINIMAL
--force --upgrade=FORCE

アップグレードステップ 2 で発生する処理に関する追加のノート:

  • ステップ 2 では、sys スキーマがインストールされていない場合はインストールし、インストールされていない場合は現在のバージョンにアップグレードします。 sys スキーマは存在するが version ビューがない場合、その存在しないという前提で、ユーザーが作成したスキーマがあるとエラーが発生します:

    A sys schema exists with no sys.version view. If
    you have a user created sys schema, this must be renamed for the
    upgrade to succeed.

    この場合にアップグレードするには、まず既存の sys スキーマを削除するか、名前を変更します。 その後、アップグレード手順を再度実行します。 (場合によっては、ステップ 2 を強制的に実行する必要があります。)

    sys スキーマチェックを防止するには:

    • MySQL 8.0.16 の時点: --upgrade=NONE または --upgrade=MINIMAL オプションを使用してサーバーを起動します。

    • MySQL 8.0.16 より前: --skip-sys-schema オプションを指定して mysql_upgrade を起動します。

  • ステップ 2 では、必要に応じてすべてのユーザースキーマのすべてのテーブルを処理します。 テーブルチェックの完了には時間がかかる場合があります。 各テーブルはロックされるため、処理中にほかのセッションで使用することはできません。 チェックと修復の処理には時間がかかることがあり、特に大きなテーブルでは長い時間を要する可能性があります。 テーブルチェックでは、CHECK TABLE ステートメントの FOR UPGRADE オプションを使用します。 このオプションに必要な内容の詳細は、セクション13.7.3.2「CHECK TABLE ステートメント」 を参照してください。

    テーブルチェックを防止するには:

    • MySQL 8.0.16 の時点: --upgrade=NONE または --upgrade=MINIMAL オプションを使用してサーバーを起動します。

    • MySQL 8.0.16 より前: --upgrade-system-tables オプションを指定して mysql_upgrade を起動します。

    テーブルチェックを強制するには:

    • MySQL 8.0.16 の時点: --upgrade=FORCE オプションを使用してサーバーを起動します。

    • MySQL 8.0.16 より前: --force オプションを指定して mysql_upgrade を起動します。

  • ステップ 2 では、MySQL のバージョン番号をデータディレクトリ内の mysql_upgrade_info という名前のファイルに保存します。

    mysql_upgrade_info ファイルを無視して、次のことに関係なくチェックを実行するには:

    • MySQL 8.0.16 の時点: --upgrade=FORCE オプションを使用してサーバーを起動します。

    • MySQL 8.0.16 より前: --force オプションを指定して mysql_upgrade を起動します。

    注記

    mysql_upgrade_info ファイルは非推奨です。将来のバージョンの MySQL で削除される予定です。

  • ステップ 2 では、チェックおよび修復されたすべてのテーブルに現在の MySQL バージョン番号を付けます。 これにより、同じバージョンのサーバーで次回のアップグレードチェックが行われるときに、特定のテーブルを再度チェックまたは修復する必要があるかどうかを判断できます。

  • ステップ 2 では、システムテーブルをアップグレードして、現在の構造になるようにします。 これは、サーバーと mysql_upgrade のどちらがこのステップを実行するかに関係なく当てはまります。 ヘルプテーブルおよびタイムゾーンテーブルの内容に関して、mysql_upgrade はどちらのタイプのテーブルもロードしませんが、サーバーはヘルプテーブルをロードしますが、タイムゾーンテーブルはロードしません。 (つまり、MySQL 8.0.16 より前では、サーバーはデータディレクトリの初期化時にのみヘルプテーブルをロードします。 MySQL 8.0.16 では、初期化およびアップグレード時にヘルプテーブルがロードされます。) タイムゾーンテーブルをロードする手順はプラットフォームによって異なり、DBA による決定が必要なため、自動的には実行できません。


関連キーワード:  インストール, サーバー, テーブル, ステップ, スキーマ, バージョン, 起動, 実行, sys, 時点