このページは機械翻訳したものです。
MySQL 8.0 にアップグレードする前に、このセクションで説明されている変更を確認して、現在の MySQL インストールおよびアプリケーションに適用される変更を特定します。 推奨されるアクションを実行します。
互換性のない変更としてマークされた変更は、以前のバージョンの MySQL との互換性がないため、アップグレード前に注意する必要がある場合があります。 弊社の目的はそれらの変更を避けることですが、各リリースの間の非適合性よりもさらに深刻な問題を修正するために必要である場合もあります。 インストールに適用可能なアップグレードの問題に互換性がない場合は、説明に示されている手順に従ってください。
MySQL Server 8.0 には、トランザクションテーブルのデータベースオブジェクトに関する情報を含むグローバルデータディクショナリが組み込まれています。 以前の MySQL シリーズでは、ディクショナリデータはメタデータファイルおよび非トランザクションシステムテーブルに格納されていました。 そのため、アップグレード手順では、特定の前提条件を確認して、インストールのアップグレード準備状況を確認する必要があります。 詳細は、セクション2.11.5「アップグレード用のインストールの準備」を参照してください。 データディクショナリ対応サーバーには、一般的な操作上の違いがいくつかあります。セクション14.7「データディクショナリの使用方法の違い」 を参照してください。
caching_sha2_password および sha256_password 認証プラグインは、mysql_native_password プラグインよりもセキュアなパスワード暗号化を提供し、caching_sha2_password は sha256_password よりも優れたパフォーマンスを提供します。 caching_sha2_password のこれらの優れたセキュリティおよびパフォーマンス特性のため、MySQL 8.0 が優先認証プラグインであり、mysql_native_password ではなくデフォルトの認証プラグインでもあります。 この変更は、サーバーと libmysqlclient クライアントライブラリの両方に影響します:
-
サーバーの場合、
default_authentication_pluginシステム変数のデフォルト値がmysql_native_passwordからcaching_sha2_passwordに変更されます。この変更は、MySQL 8.0 以上のインストールまたはアップグレード後に作成された新しいアカウントにのみ適用されます。 アップグレードインストールにすでに存在するアカウントの場合、認証プラグインは変更されません。
caching_sha2_passwordに切り替える既存のユーザーは、ALTER USERステートメントを使用してこれを実行できます:ALTER USER user IDENTIFIED WITH caching_sha2_password BY 'password'; libmysqlclientライブラリは、caching_sha2_passwordをmysql_native_passwordではなくデフォルトの認証プラグインとして扱います。
次の各セクションでは、caching_sha2_password のより有望なロールの影響について説明します:
caching_sha2_password の互換性の問題および解決策
MySQL インストールで 8.0 より前のクライアントを提供する必要があり、MySQL 8.0 以上へのアップグレード後に互換性の問題が発生した場合、これらの問題に対処して 8.0 より前の互換性をリストアする最も簡単な方法は、以前のデフォルトの認証プラグイン (mysql_native_password) に戻すようにサーバーを再構成することです。 たとえば、サーバーオプションファイルで次の行を使用します:
[mysqld]
default_authentication_plugin=mysql_native_password
この設定により、インストールで使用されているクライアントおよびコネクタが caching_sha2_password を認識するようにアップグレードされるまで、8.0 より前のクライアントが 8.0 サーバーに接続できるようになります。 ただし、この設定は、長期または永続的なソリューションとしてではなく、一時的なものとして表示する必要があります。これは、この設定を有効にして作成された新しいアカウントが、caching_sha2_password によって提供される改善された認証セキュリティを予測するためです。
caching_sha2_password を使用すると、mysql_native_password よりもセキュアなパスワードハッシュが提供されます (その結果、クライアント接続認証が改善されます)。 ただし、既存の MySQL インストールに影響する可能性がある互換性の影響もあります:
-
caching_sha2_passwordについて知るために更新されていないクライアントおよびコネクタでは、caching_sha2_passwordで認証されないアカウントを使用する場合でも、caching_sha2_passwordでデフォルトの認証プラグインとして構成された MySQL 8.0 サーバーへの接続に問題が発生する可能性があります。 この問題は、サーバーがデフォルトの認証プラグインの名前をクライアントに指定しているために発生します。 クライアントまたはコネクタが、認識されないデフォルト認証プラグインを正常に処理しないクライアント/サーバープロトコル実装に基づいている場合、次のいずれかのエラーで失敗する可能性があります:Authentication plugin 'caching_sha2_password' is not supportedAuthentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not foundWarning: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password]不明なデフォルト認証プラグインに対するサーバーからのリクエストを正常に処理するコネクタの記述の詳細は、認証プラグインコネクタ - 書込みに関する考慮事項 を参照してください。
caching_sha2_passwordで認証されるアカウントを使用するクライアントは、セキュアな接続 (TLS/SSL 資格証明、Unix ソケットファイルまたは共有メモリーを使用して TCP を使用して確立) または RSA キーペアを使用したパスワード交換をサポートする暗号化されていない接続を使用する必要があります。 このセキュリティ要件はmysql_native_passswordには適用されないため、caching_sha2_passwordへの切替えには追加の構成が必要になる場合があります (セクション6.4.1.2「SHA-2 プラガブル認証のキャッシュ」 を参照)。 ただし、MySQL 8.0 のクライアント接続では、デフォルトで TLS/SSL を使用することをお薦めします。そのため、そのプリファレンスにすでに準拠しているクライアントでは、追加の構成が必要ない場合があります。caching_sha2_passwordについて知るために更新されていないクライアントおよびコネクタは、このプラグインが有効であると認識されないため、caching_sha2_passwordで認証されるアカウントに接続できません。 (これは、認証プラグインクライアント/サーバーの互換性 で説明されているように、クライアント/サーバー認証プラグインの互換性要件が適用される方法の特定のインスタンスです。) この問題を回避するには、MySQL 8.0 以上からlibmysqlclientに対してクライアントを再リンクするか、caching_sha2_passwordを認識する更新済コネクタを取得します。caching_sha2_passwordはlibmysqlclientクライアントライブラリのデフォルトの認証プラグインでもあるため、クライアントプログラムが--default-auth=mysql_native_passwordオプションで呼び出されないかぎり、MySQL 8.0 クライアントからmysql_native_password(以前のデフォルトの認証プラグイン) を使用するアカウントへの接続には、クライアント/サーバープロトコルで追加のラウンドトリップが必要になります。
8.0 MySQL より前のバージョンの libmysqlclient クライアントライブラリは、MySQL 8.0 サーバー (caching_sha2_password で認証されるアカウントを除く) に接続できます。 つまり、libmysqlclient に基づく 8.0 より前のクライアントも接続できる必要があります。 例:
mysql や mysqladmin などの標準 MySQL クライアントは
libmysqlclientベースです。Perl DBI 用の DBD::mysql ドライバは
libmysqlclientベースです。MySQL Connector/Python には、
libmysqlclientベースの C 拡張モジュールがあります。 これを使用するには、接続時にuse_pure=Falseオプションを含めます。
既存の MySQL 8.0 インストールを MySQL 8.0.4 以上にアップグレードする場合、一部の古い libmysqlclient ベースのクライアントは、アップグレードによってインストールされた新しいクライアントライブラリを使用するため、動的にリンクされていれば「「自動」」をアップグレードできます。 たとえば、Perl DBI 用の DBD::mysql ドライバで動的リンクが使用されている場合、MySQL 8.0.4 以上へのアップグレード後に libmysqlclient を使用できます。その結果は次のようになります:
アップグレードの前に、DBD::mysql を使用する DBI スクリプトは、
caching_sha2_passwordで認証されるアカウントを除き、MySQL 8.0 サーバーに接続できます。アップグレード後、同じスクリプトで
caching_sha2_passwordアカウントも使用できるようになります。
ただし、8.0.4 より前の MySQL 8.0 インストールの libmysqlclient インスタンスにはバイナリ互換性があるため、前述の結果になります: どちらの場合も、共有ライブラリのメジャーバージョン番号 21 が使用されます。 MySQL 5.7 以前から libmysqlclient にリンクされているクライアントの場合、バイナリ互換性のない異なるバージョン番号を持つ共有ライブラリにリンクします。 この場合、MySQL 8.0 サーバーおよび caching_sha2_password アカウントとの完全な互換性を確保するために、8.0.4 以上の libmysqlclient に対してクライアントを再コンパイルする必要があります。
MySQL Connector/J 5.1 は 8.0.8 を介して MySQL 8.0 サーバーに接続できますが、caching_sha2_password で認証されるアカウントは例外です。(Connector/J 8.0.9 以上が caching_sha2_password アカウントに接続するために必要です。)
libmysqlclient 以外のクライアント/サーバープロトコルの実装を使用するクライアントは、新しい認証プラグインを認識する新しいバージョンにアップグレードする必要がある場合があります。 たとえば、PHP では、MySQL の接続性は通常、mysqlnd に基づいており、caching_sha2_password については現在認識されていません。 更新されたバージョンの mysqlnd が使用可能になるまで、PHP クライアントが MySQL 8.0 に接続できるようにするには、前述のように、mysql_native_password にデフォルトの認証プラグインとして戻すようにサーバーを再構成します。
クライアントまたはコネクタがデフォルトの認証プラグインを明示的に指定するオプションをサポートしている場合は、それを使用して caching_sha2_password 以外のプラグインに名前を付けます。 例:
一部の MySQL クライアントは、
--default-authオプションをサポートしています。 (mysql や mysqladmin などの標準 MySQL クライアントはこのオプションをサポートしていますが、それを使用せずに 8.0 サーバーに正常に接続できます。 ただし、他のクライアントも同様のオプションをサポートする場合があります。 その場合は、試行する価値があります。)libmysqlclientC API を使用するプログラムでは、MYSQL_DEFAULT_AUTHオプションを指定してmysql_options()関数をコールできます。クライアント/サーバープロトコルのネイティブ Python 実装を使用する MySQL Connector/Python スクリプトでは、
auth_plugin接続オプションを指定できます。 (または、auth_pluginを必要とせずに MySQL 8.0 サーバーに接続できる Connector/Python C 拡張機能を使用します。)
caching_sha2_password-Compatible クライアントおよびコネクタ
caching_sha2_password について知るために更新されたクライアントまたはコネクタが使用可能な場合は、caching_sha2_password をデフォルトの認証プラグインとして構成された MySQL 8.0 サーバーに接続するときに互換性を確保するための最善の方法です。
次のクライアントおよびコネクタは、caching_sha2_password をサポートするようにアップグレードされています:
MySQL 8.0 (8.0.4 以上) の
libmysqlclientクライアントライブラリ。 mysql や mysqladmin などの標準 MySQL クライアントはlibmysqlclientベースであるため、互換性もあります。MySQL 5.7 (5.7.23 以上) の
libmysqlclientクライアントライブラリ。 mysql や mysqladmin などの標準 MySQL クライアントはlibmysqlclientベースであるため、互換性もあります。MySQL Connector/C++ 1.1.11 以上または 8.0.7 以上。
MySQL Connector/J 8.0.9 以上。
MySQL Connector/NET 8.0.10 以上 (クラシック MySQL プロトコルを使用)。
MySQL Connector/Node.js 8.0.9 以上。
-
PHP: X DevAPI PHP 拡張機能 (mysql_xdevapi) は、
caching_sha2_passwordをサポートしています。PHP: PDO_MySQL および ext/mysqli 拡張機能は
caching_sha2_passwordをサポートしていません。 また、7.2.4 より前の 7.1.16 および PHP 7.2 より前の PHP バージョンで使用すると、caching_sha2_passwordが使用されていない場合でもdefault_authentication_plugin=caching_sha2_passwordとの接続に失敗します。
caching_sha2_password および root 管理アカウント
MySQL 8.0 へのアップグレードの場合、'root'@'localhost'管理アカウントのプラグインを含め、認証プラグインの既存のアカウントは変更されません。
MySQL 8.0 の新規インストールでは、(セクション2.10.1「データディレクトリの初期化」 の手順を使用して) データディレクトリを初期化すると、'root'@'localhost'アカウントが作成され、そのアカウントはデフォルトで caching_sha2_password を使用します。 したがって、データディレクトリの初期化後にサーバーに接続するには、caching_sha2_password をサポートするクライアントまたはコネクタを使用する必要があります。 これを実行できるが、インストール後に root アカウントで mysql_native_password を使用する場合は、MySQL をインストールし、通常どおりにデータディレクトリを初期化します。 次に、root としてサーバーに接続し、次のように ALTER USER を使用してアカウント認証プラグインおよびパスワードを変更します:
ALTER USER 'root'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'password';
使用するクライアントまたはコネクタが caching_sha2_password をまだサポートしていない場合は、アカウントが作成されるとすぐに root アカウントを mysql_native_password に関連付ける変更済データディレクトリ初期化プロシージャを使用できます。 これを行うには、次のいずれかの方法を使用します:
--initializeまたは--initialize-insecureとともに--default-authentication-plugin=mysql_native_passwordオプションを指定します。オプションファイルで
default_authentication_pluginをmysql_native_passwordに設定し、--initializeまたは--initialize-insecureとともに--defaults-fileオプションを使用してそのオプションファイルに名前を付けます。 (この場合、後続のサーバー起動にそのオプションファイルを引き続き使用すると、default_authentication_plugin設定をオプションファイルから削除しないかぎり、caching_sha2_passwordではなくmysql_native_passwordで新しいアカウントが作成されます。)
caching_sha2_password とレプリケーション
すべてのサーバーが MySQL 8.0.4 以上にアップグレードされているレプリケーションシナリオでは、ソースサーバーへのレプリカ接続で、caching_sha2_password で認証されるアカウントを使用できます。 このような接続の場合、caching_sha2_password で認証されるアカウントを使用する他のクライアントと同じ要件が適用されます: セキュアな接続または RSA ベースのパスワード交換を使用します。
ソース/レプリカレプリケーションのために caching_sha2_password アカウントに接続するには:
-
次の
CHANGE MASTER TOオプションのいずれかを使用します:MASTER_SSL = 1 GET_MASTER_PUBLIC_KEY = 1 MASTER_PUBLIC_KEY_PATH='path to RSA public key file' または、サーバーの起動時に必要なキーが指定されている場合は、RSA 公開キー関連オプションを使用できます。
グループレプリケーション用の caching_sha2_password アカウントに接続するには:
-
OpenSSL を使用して構築された MySQL の場合は、次のいずれかのシステム変数を設定します:
SET GLOBAL group_replication_recovery_use_ssl = ON; SET GLOBAL group_replication_recovery_get_public_key = 1; SET GLOBAL group_replication_recovery_public_key_path = 'path to RSA public key file'; または、サーバーの起動時に必要なキーが指定されている場合は、RSA 公開キー関連オプションを使用できます。
-
互換性のない変更: MySQL ストレージエンジンは独自のパーティショニングハンドラを提供する役割を果たし、MySQL サーバーは一般的なパーティショニングサポートを提供しなくなりました。 MySQL 8.0 でサポートされているネイティブパーティショニングハンドラを提供するストレージエンジンは、
InnoDBおよびNDBのみです。 ほかのストレージエンジンを使用するパーティション化されたテーブルは、InnoDBまたはNDBに変換するか、サーバーをアップグレードする前にパーティション化を削除するために変更する必要があります。それ以外の場合は、あとで使用できません。MyISAMテーブルのInnoDBへの変換の詳細は、セクション15.6.1.5「MyISAM から InnoDB へのテーブルの変換」 を参照してください。このようなサポートがないストレージエンジンを使用してパーティション化されたテーブルになるテーブル作成ステートメントは、MySQL 8.0 のエラー ( ER_CHECK_NOT_IMPLEMENTED ) で失敗します。 mysqldump を使用して MySQL 5.7 (またはそれ以前) で作成されたダンプファイルから MySQL 8.0 サーバーにデータベースをインポートする場合は、パーティションテーブルを作成するすべてのステートメントで、パーティション化への参照を削除するか、ストレージエンジンを
InnoDBとして指定するか、デフォルトでInnoDBとして設定できるようにして、サポートされていないストレージエンジンも指定しないようにする必要があります。注記セクション2.11.5「アップグレード用のインストールの準備」 で提供されている手順では、MySQL 8.0 にアップグレードする前に変更する必要があるパーティションテーブルを識別する方法について説明します。
詳細は、セクション24.6.2「ストレージエンジンに関連するパーティショニング制限」 を参照してください。
互換性のない変更: いくつかのサーバーエラーコードが使用されておらず、削除されています (リストについては、MySQL 8.0 で削除された機能 を参照)。 特にテストするアプリケーションは更新する必要があります。
-
重要な変更: デフォルトの文字セットが
latin1からutf8mb4に変更されました。 次のシステム変数が影響を受けます:character_set_serverおよびcharacter_set_databaseシステム変数のデフォルト値がlatin1からutf8mb4に変更されました。collation_serverおよびcollation_databaseシステム変数のデフォルト値がlatin1_swedish_ciからutf8mb4_0900_ai_ciに変更されました。
その結果、明示的な文字セットと照合順序が指定されていないかぎり、新しいオブジェクトのデフォルトの文字セットと照合順序は以前とは異なります。 これには、データベースおよびその内部のオブジェクト (テーブル、ビュー、ストアドプログラムなど) が含まれます。 以前のデフォルトが使用されていたと仮定すると、これらを保持する方法の 1 つは、
my.cnfファイル内の次の行を使用してサーバーを起動することです:[mysqld] character_set_server=latin1 collation_server=latin1_swedish_ciレプリケートされた設定では、MySQL 5.7 から 8.0 にアップグレードする場合、アップグレードする前にデフォルトの文字セットを MySQL 5.7 で使用されている文字セットに戻すことをお薦めします。 アップグレードの完了後、デフォルトの文字セットを
utf8mb4に変更できます。 互換性のない変更: MySQL 8.0.11 の時点では、サーバーの初期化時に使用された設定とは異なる
lower_case_table_names設定でサーバーを起動することは禁止されています。 様々なデータディクショナリテーブルのフィールドで使用される照合は、サーバーの初期化時に定義されたlower_case_table_names設定に基づいており、異なる設定でサーバーを再起動すると、識別子の順序付けおよび比較方法に矛盾が生じるため、制限が必要です。
-
MySQL 8.0.11 では、ユーザーアカウントの非権限特性を変更するための
GRANTステートメントの使用、NO_AUTO_CREATE_USERSQL モード、PASSWORD()関数、old_passwordsシステム変数など、アカウント管理に関連するいくつかの非推奨機能が削除されました。これらの削除された機能を参照するステートメントの MySQL 5.7 から 8.0 へのレプリケーションによって、レプリケーションが失敗する可能性があります。 MySQL 8.0 で削除された機能 で説明されているように、削除された機能のいずれかを使用するアプリケーションを改訂して回避し、可能な場合は代替機能を使用する必要があります。
MySQL 8.0 での起動の失敗を回避するには、MySQL オプションファイルの
sql_modeシステム変数設定からNO_AUTO_CREATE_USERのインスタンスを削除します。ストアドプログラム定義に
NO_AUTO_CREATE_USERSQL モードを含むダンプファイルを MySQL 8.0 サーバーにロードすると、障害が発生します。 MySQL 5.7.24 および MySQL 8.0.13 の時点で、mysqldump はストアドプログラム定義からNO_AUTO_CREATE_USERを削除します。 以前のバージョンのmysqldumpで作成されたダンプファイルは、NO_AUTO_CREATE_USERのインスタンスを削除するために手動で変更する必要があります。 -
MySQL 8.0.11 では、これらの非推奨の互換性 SQL モードは削除されました:
DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。 これらをsql_modeシステム変数に割り当てたり、mysqldump--compatibleオプションの許可された値として使用したりすることはできなくなりました。MAXDBを削除すると、CREATE TABLEまたはALTER TABLEのTIMESTAMPデータ型はDATETIMEとして扱われなくなります。削除された SQL モードを参照するステートメントの MySQL 5.7 から 8.0 へのレプリケーションによって、レプリケーションが失敗する可能性があります。 これには、現在の
sql_mode値に削除されたモードのいずれかが含まれているときに実行されるストアドプログラム (ストアドプロシージャとストアドファンクション、トリガーおよびイベント) のCREATEステートメントのレプリケーションが含まれます。 削除されたモードのいずれかを使用するアプリケーションは、それらを回避するために改訂する必要があります。 -
MySQL 8.0.3 の時点では、空間データ型で
SRID属性を使用して、カラムに格納されている値の空間参照システム (SRS) を明示的に指定できます。 セクション11.4.1「空間データ型」を参照してください。明示的な
SRID属性を持つ空間カラムは、SRID 制限付きです: カラムはその ID を持つ値のみを取り、そのカラムのSPATIALインデックスはオプティマイザによって使用される対象になります。 オプティマイザは、SRID属性のない空間カラムのSPATIALインデックスを無視します。 セクション8.3.3「SPATIAL インデックス最適化」を参照してください。 SRID 制限のない空間カラムのSPATIALインデックスをオプティマイザで考慮する場合は、そのような各カラムを変更する必要があります:-
カラム内のすべての値が同じ SRID を持つことを確認します。 ジオメトリカラム
col_nameに含まれる SRID を確認するには、次のクエリーを使用します:SELECT DISTINCT ST_SRID(col_name) FROM tbl_name;クエリーで複数の行が返された場合、カラムには SRID の混在が含まれます。 その場合は、その内容を変更して、すべての値が同じ SRID を持つようにします。
明示的な
SRID属性を持つようにカラムを再定義します。SPATIALインデックスを再作成します。
-
正確な操作を実行する関数の
ST_接頭辞、または最小境界矩形に基づいて操作を実行する関数のMBR接頭辞を実装する空間関数ネームスペースの変更により、MySQL 8.0.0 でいくつかの空間関数が削除されました。 生成されたカラム定義で削除された空間関数を使用すると、アップグレードが失敗する可能性があります。 アップグレードする前に、削除された空間関数に対して mysqlcheck --check-upgrade を実行し、見つかったものをST_またはMBRの名前付き置換に置き換えます。 削除された空間関数のリストは、MySQL 8.0 で削除された機能 を参照してください。BACKUP_ADMIN権限は、MySQL 8.0.3 以上へのインプレースアップグレードの実行時に、RELOAD権限を持つユーザーに自動的に付与されます。-
MySQL 8.0.13 からは、一時テーブルの処理方法における行ベースまたは混合レプリケーションモードとステートメントベースのレプリケーションモードの違いにより、実行時のバイナリロギング形式の切り替えに新しい制限があります。
セッションにオープン一時テーブルがある場合、
SET @@SESSION.binlog_formatは使用できません。いずれかのレプリケーションチャネルにオープン一時テーブルがある場合、
SET @@global.binlog_formatおよびSET @@persist.binlog_formatは使用できません。SET @@persist_only.binlog_formatは、レプリケーションチャネルにオープン一時テーブルがある場合に許可されます。これは、PERSISTとは異なり、PERSIST_ONLYではランタイムグローバルシステム変数値が変更されないためです。レプリケーションチャネルアプライヤが実行されている場合、
SET @@global.binlog_formatおよびSET @@persist.binlog_formatは使用できません。 これは、変更がレプリケーションチャネルで有効になるのは、そのアプライヤが再起動されたときのみであり、そのときにレプリケーションチャネルにオープン一時テーブルがある可能性があるためです。 この動作は、以前よりも制限されています。SET @@persist_only.binlog_formatは、レプリケーションチャネルアプライヤが実行されている場合に許可されます。
-
InnoDBシステムテーブルに基づくINFORMATION_SCHEMAビューは、データディクショナリテーブルの内部システムビューに置き換えられました。 影響を受けるInnoDBINFORMATION_SCHEMAビューの名前が変更されました:表 2.16 名前が変更された InnoDB 情報スキーマビュー
旧名称 新規名 INNODB_SYS_COLUMNSINNODB_COLUMNSINNODB_SYS_DATAFILESINNODB_DATAFILESINNODB_SYS_FIELDSINNODB_FIELDSINNODB_SYS_FOREIGNINNODB_FOREIGNINNODB_SYS_FOREIGN_COLSINNODB_FOREIGN_COLSINNODB_SYS_INDEXESINNODB_INDEXESINNODB_SYS_TABLESINNODB_TABLESINNODB_SYS_TABLESPACESINNODB_TABLESPACESINNODB_SYS_TABLESTATSINNODB_TABLESTATSINNODB_SYS_VIRTUALINNODB_VIRTUALMySQL 8.0.3 以上にアップグレードした後、以前の
InnoDBINFORMATION_SCHEMAビュー名を参照するスクリプトを更新します。 -
MySQL にバンドルされている「zlib ライブラリ」バージョンは、バージョン 1.2.3 からバージョン 1.2.11 に引き上げられました。
zlib 1.2.11 の zlib
compressBound()関数は、zlib version 1.2.3 の場合よりも一定のバイト長を圧縮するために必要なバッファーサイズの見積りを少し大きく返します。compressBound()関数は、圧縮InnoDBテーブルの作成時または圧縮InnoDBテーブルへの行の挿入および更新時に許可される最大行サイズを決定するInnoDB関数によってコールされます。 その結果、以前のリリースで成功した最大行サイズに非常に近い行サイズのCREATE TABLE ... ROW_FORMAT=COMPRESSED、INSERTおよびUPDATE操作が失敗する可能性があります。 この問題を回避するには、アップグレードの前に、MySQL 8.0 テストインスタンスで大きい行を含む圧縮InnoDBテーブルのCREATE TABLEステートメントをテストします。 -
--innodb-directories機能の導入により、絶対パスまたはデータディレクトリ外の場所で作成された file-per-table および一般的なテーブルスペースファイルの場所をinnodb_directories引数値に追加する必要があります。 そうしないと、InnoDBはリカバリ中にこれらのファイルを検出できません。 テーブルスペースファイルの場所を表示するには、INFORMATION_SCHEMA.FILESテーブルをクエリーします:SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES \G -
undo ログはシステムテーブルスペースに存在できなくなりました。 MySQL 8.0 では、undo ログはデフォルトで 2 つの undo テーブルスペースに存在します。 詳細は、セクション15.6.3.4「undo テーブルスペース」を参照してください。
MySQL 5.7 から MySQL 8.0 にアップグレードする場合、MySQL 5.7 インスタンスに存在する undo テーブルスペースは削除され、2 つの新しいデフォルト undo テーブルスペースに置き換えられます。 デフォルトの undo テーブルスペースは、
innodb_undo_directory変数で定義された場所に作成されます。innodb_undo_directory変数が定義されていない場合、undo テーブルスペースはデータディレクトリに作成されます。 MySQL 5.7 から MySQL へのアップグレード 8.0 では、MySQL 5.7 インスタンスの undo テーブルスペースが空であることを保証する低速な停止が必要であり、安全に削除できます。以前の MySQL 8.0 リリースから MySQL 8.0.14 以降にアップグレードする場合、2 より大きい
innodb_undo_tablespaces設定の結果としてアップグレード前インスタンスに存在する undo テーブルスペースは、ユーザー定義 undo テーブルスペースとして扱われ、アップグレード後にALTER UNDO TABLESPACEおよびDROP UNDO TABLESPACE構文を使用してそれぞれ非アクティブ化および削除できます。 MySQL 8.0 リリースシリーズ内のアップグレードでは、常に低速な停止が必要になるわけではありません。つまり、既存の undo テーブルスペースに undo ログが含まれている可能性があります。 したがって、既存の undo テーブルスペースはアップグレードプロセスによって削除されません。 -
互換性のない変更: MySQL 8.0.17 では、
CREATE TABLESPACE ... ADD DATAFILE句で循環ディレクトリ参照は許可されません。 たとえば、次のステートメントの循環ディレクトリ参照 (/../) は使用できません:CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd 'any_directory/../ts1.ibd';Linux には制限の例外があり、前述のディレクトリがシンボリックリンクの場合は循環ディレクトリ参照が許可されます。 たとえば、
any_directoryがシンボリックリンクの場合、前述の例のデータファイルパスは許可されます。 (データファイルパスを'../'で始めることはできます。)アップグレードの問題を回避するには、MySQL 8.0.17 以上にアップグレードする前に、テーブルスペースデータファイルパスから循環ディレクトリ参照を削除します。 テーブルスペースパスを調べるには、
INFORMATION_SCHEMA.INNODB_DATAFILESテーブルをクエリーします。 -
MySQL 8.0.14 で導入された回帰のため、パーティションテーブルおよび
lower_case_table_names=1を含むインスタンスで、MySQL 8.0.14 から MySQL 8.0.16 への MySQL 5.7 または MySQL 8.0 リリースより前の大/小文字を区別するファイルシステムでのインプレースアップグレードが失敗しました。 失敗の原因は、パーティションテーブルのファイル名に関連する大/小文字の不一致の問題でした。 回帰を導入した修正が元に戻され、MySQL 8.0.14 より前の MySQL 5.7 または MySQL 8.0 リリースから MySQL 8.0.17 へのアップグレードが正常に機能するようになりました。 ただし、回帰は MySQL 8.0.14、8.0.15 および 8.0.16 リリースには引き続き存在します。パーティション化されたテーブルが存在し、
lower_case_table_names=1がある場合、バイナリまたはパッケージを MySQL 8.0.17 にアップグレードした後にサーバーを起動すると、大/小文字を区別するファイルシステムでの MySQL 8.0.14、8.0.15 または 8.0.16 から MySQL 8.0.17 へのインプレースアップグレードが次のエラーで失敗します:Upgrading from server version version_number with partitioned tables and lower_case_table_names == 1 on a case sensitive file system may cause issues, and is therefore prohibited. To upgrade anyway, restart the new server version with the command line option 'upgrade=FORCE'. When upgrade is completed, please execute 'RENAME TABLE part_table_name TO new_table_name; RENAME TABLE new_table_name TO part_table_name;' for each of the partitioned tables. Please see the documentation for further information.MySQL 8.0.17 へのアップグレード時にこのエラーが発生した場合は、次の回避策を実行します:
--upgrade=forceを使用してサーバーを再起動し、アップグレード操作を強制的に続行します。-
小文字のパーティション名デリミタ
(#p#または#sp#を使用して、パーティションテーブルのファイル名を識別します:mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%'; -
識別されたファイルごとに、一時名を使用して関連するテーブルの名前を変更し、テーブルの名前を元の名前に戻します。
mysql> RENAME TABLE table_name TO temporary_table_name; mysql> RENAME TABLE temporary_table_name TO table_name; -
パーティションテーブルファイル名の小文字のパーティション名デリミタがないことを確認します (空の結果セットが返されます)。
mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%'; Empty set (0.00 sec) 名前を変更した各テーブルで
ANALYZE TABLEを実行して、mysql.innodb_index_statsテーブルおよびmysql.innodb_table_statsテーブルのオプティマイザ統計を更新します。
MySQL 8.0.14、8.0.15 および 8.0.16 リリースには回帰がまだ存在するため、MySQL 8.0.14、8.0.15 または 8.0.16 から MySQL 8.0.17 へのパーティションテーブルのインポートは、
lower_case_table_names=1の大/小文字が区別されるファイルシステムではサポートされていません。 これを試行すると、「「テーブルのテーブルスペースがありません」」エラーが発生します。 -
MySQL では、テーブルパーティションのテーブルスペース名およびファイル名を作成する際にデリミタ文字列が使用されます。 次に示すように、「
#p#」デリミタ文字列はパーティション名の前に、「#sp#」デリミタ文字列はサブパーティション名の前にあります:schema_name.table_name#p#partition_name#sp#subpartition_name table_name#p#partition_name#sp#subpartition_name.ibd従来、Linux などの大/小文字を区別するファイルシステムではデリミタ文字列は大文字 (
#P#および#SP#)、Windows などの大/小文字を区別しないファイルシステムでは小文字 (#p#および#sp#) になっていました。 MySQL 8.0.19 の時点では、デリミタ文字列はすべてのファイルシステムで小文字になります。 この変更により、大/小文字を区別するファイルシステムと大/小文字を区別しないファイルシステムの間でデータディレクトリを移行する際の問題が回避されます。 大文字のデリミタ文字列は使用されなくなりました。また、ユーザー指定のパーティション名またはサブパーティション名 (大文字または小文字で指定可能) に基づいて生成されたパーティションテーブルスペース名およびファイル名は、大/小文字を区別しないように
lower_case_table_names設定に関係なく小文字で生成 (および内部的に格納) されるようになりました。 たとえば、テーブルパーティションがPART_1という名前で作成された場合、テーブルスペース名とファイル名は小文字で生成されます:schema_name.table_name#p#part_1 table_name#p#part_1.ibdアップグレード時に、MySQL は必要に応じてチェックおよび変更を行います:
小文字のデリミタとパーティション名を確認するために、ディスクおよびデータディクショナリのパーティションファイル名。
以前のバグ修正で発生した関連する問題のデータディクショナリ内のパーティションメタデータ。
以前のバグ修正で導入された関連する問題の
InnoDB統計データ。
テーブルスペースのインポート操作中に、小文字のデリミタとパーティション名を確認するために、必要に応じてディスク上のパーティションテーブルスペースファイル名がチェックおよび変更されます。
MySQL 8.0.21 では、テーブルスペースデータファイルが不明なディレクトリに存在することが判明した場合、起動時または MySQL 5.7 からのアップグレード時にエラーログに警告が書き込まれます。 既知のディレクトリは、
datadir、innodb_data_home_dirおよびinnodb_directories変数で定義されているディレクトリです。 ディレクトリを既知にするには、innodb_directories設定に追加します。 ディレクトリを既知にすると、リカバリ中にデータファイルを検出できるようになります。 詳細は、クラッシュリカバリ中のテーブルスペースの検出を参照してください。
-
互換性のない変更: MySQL 8.0.13 では、
GROUP BY句の非推奨のASC修飾子またはDESC修飾子は削除されています。 以前にGROUP BYソートに依存していたクエリーでは、以前の MySQL バージョンとは異なる結果が生成される場合があります。 特定のソート順序を生成するには、ORDER BY句を指定します。GROUP BY句にASCまたはDESC修飾子を使用する MySQL 8.0.12 以下のクエリーおよびストアドプログラム定義を修正する必要があります。 そうしないと、MySQL 8.0.13 以上のレプリカサーバーにレプリケートされる可能性があるため、MySQL 8.0.13 以上へのアップグレードが失敗することがあります。 MySQL 5.7 では予約されていなかった一部のキーワードが、MySQL 8.0 では予約されている場合があります。 セクション9.3「キーワードと予約語」を参照してください。 これにより、以前に識別子として使用された単語が不正になる可能性があります。 影響を受けるステートメントを修正するには、識別子の引用符を使用します。 セクション9.2「スキーマオブジェクト名」を参照してください。
アップグレード後、目的の最適化戦略を達成するためにヒントがまだ必要であることを確認するために、アプリケーションコードで指定されたオプティマイザヒントをテストすることをお薦めします。 オプティマイザの拡張により、特定のオプティマイザヒントが不要になる場合があります。 場合によっては、不要なオプティマイザヒントが対応することもあります。
-
互換性のない変更: MySQL 5.7 では、
CONSTRAINT句なしでsymbolInnoDBテーブルのFOREIGN KEY定義を指定するか、symbolなしでCONSTRAINTキーワードを指定すると、InnoDBで生成された制約名が使用されます。 この動作は MySQL 8.0 で変更され、InnoDBでは生成された名前ではなくFOREIGN KEY値が使用されます。 制約名はスキーマ (データベース) ごとに一意である必要があるため、スキーマごとに一意ではない外部キーインデックス名が原因でエラーが発生しました。 このようなエラーを回避するために、MySQL 8.0.16 では新しい制約のネーミング動作が元に戻され、index_nameInnoDBでは生成された制約名が再度使用されます。InnoDBとの一貫性のために、CONSTRAINT句が指定されていない場合、またはsymbolCONSTRAINTキーワードがsymbolなしで指定されている場合は、MySQL 8.0.16 以上に基づくNDBリリースで生成された制約名が使用されます。 MySQL 5.7 以前の MySQL 8.0 リリースに基づくNDBリリースでは、FOREIGN KEY値が使用されていました。index_name前述の変更により、以前の外部キー制約のネーミング動作に依存するアプリケーションの非互換性が生じる場合があります。