すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ベストプラクティス

最終更新日:May 28, 2024

このトピックでは、PolarDB for MySQL 5.6および5.7およびMySQL 5.6および5.7からPolarDB for MySQL 8.0へのアップグレードの利点、事前チェック項目、および互換性の説明について説明します。

PolarDB for MySQLの8.0の概要

  • リリース日

    • PolarDB for MySQL 8.0.1は2019年12月3日にリリースされました。

    • PolarDB for MySQL 8.0.2は2020年7月22日にリリースされました。

  • メリット

    PolarDB for MySQL 8.0は、アーキテクチャとカーネル機能を強化し、ビジネス処理のためのより柔軟な技術ソリューションをもたらし、パフォーマンスを大幅に向上させます。 詳細については、「PolarDB For MySQL 8.0の機能」をご参照ください。

互換性の事前チェック

PolarDB for MySQLの5.6と5.7、MySQLの5.6と5.7からPolarDB for MySQL 8.0へのアップグレード中に、パフォーマンス、構文の互換性、および周辺コンポーネントのサポートに関連する問題が発生する可能性があります。 クエリのパフォーマンスの問題は、オプティマイザのアップグレードによる実行計画の変更によって発生します。 このような問題を解決するには、パフォーマンスの低い特定のステートメントを最適化する必要があります。 パフォーマンスの問題だけでは、ビジネスエラーやコードの書き換えは必要ありません。 したがって、このトピックではパフォーマンスの問題については説明しません。

このトピックでは、データベースのアップグレード中にコードまたは環境構成の更新が必要な互換性の問題について説明します。 このような問題の主な原因は、バージョンアップ後の構文と機能の更新または削除の変更です。 このような問題がない場合は、次のセクションをスキップして直接アップグレードを実行してください。 詳細については、「手順」をご参照ください。

このセクションでは、アップグレードを実行する前にアップグレードプロセスで注意を払う必要がある問題をよりよく理解するのに役立つ簡単なチェックリストを提供します。 次のチェックリストに基づいて問題が見つかった場合は、次のセクションを参照して問題を解決します。

  • 廃止されたデータ型、関数、または機能が使用されていないことを確認してください。 廃止されたアイテムのリストの詳細については、「MySQL 8.0で削除された機能」をご参照ください。

  • トリガーには、不足している定義子、空の定義子、または無効なコンテンツがないことを確認してください。

  • InnoDBストレージエンジンのパーティションテーブルのみが使用可能であることを確認します。

  • 名前がキーワードや予約語と競合しないようにしてください。 詳細については、「キーワードと予約語」をご参照ください。

  • MySQL 5.6および5.7のシステムデータベース、およびMySQL 8.0の名前がINNODB_ で始まる新しいデータ辞書テーブルと名前が競合しないことを確認してください。

  • INFORMATION_SCHEMA内のGLOBALLOCALVARIABLES、またはSTATUSテーブルに依存する項目がないことを確認します。

  • sql_modeで中断された変数設定が使用されていないことを確認します。 詳細については、このトピックの「パラメーターの互換性」をご参照ください。

  • 1つのENUMまたはSET列要素が、テーブルおよびストアドプロシージャで255文字または1,020バイトを超えないようにしてください。

  • 共有InnoDBテーブルスペースにテーブルパーティションがないことを確認します。

  • SQLクエリ文のGROUP BY句にASCまたはDESCが含まれていないことを確認してください。

    説明

    バージョン8.0.2.2.11.1以降では、互換モードを有効にするために、PolarDB for MySQLコンソールでloose_group_by_compatible_sortingパラメーターをTRUEに設定できます。 このモードでは、ASCまたはDESCを含むGROUP BY句を使用できます。 PolarDB For MySQLコンソールでパラメーターを設定する方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。

  • 外部キー制約の名前の長さが64文字を超えないようにしてください。

説明
  • Unicodeのサポートを強化するために、オブジェクトで使用される文字セットをutf8mb3 (廃止) またはutf8 (utf8mb3文字セットのエイリアス) からutf8mb4に変更することを推奨します。 詳細については、「utf8mb3文字セット (3バイトUTF-8 Unicodeエンコーディング) 」をご参照ください。

  • アップグレード中に他の問題が発生した場合に備えて、アップグレード前にバックアップが必要です。

ストレージエンジンとパーティションテーブルの互換性

バージョン8.0でMyISAMパーティションを作成した場合、このストレージエンジンがサポートされていないため、ステートメントは失敗し、ER_CHECK_NOT_IMPLEMENTEDエラーが報告されます。 テーブルをMyISAMからInnoDBに変換する方法の詳細については、「MyISAMからInnoDBへのテーブルの変換」をご参照ください。

ストレージエンジンはパーティションハンドラーをサポートし、サーバーは汎用エンジンパーティションをサポートしません。

InnoDBは、バージョン8.0でのみサポートされるネイティブパーティションハンドラーも提供します。 サーバーをアップグレードする前に、パーティションテーブルを他のストレージエンジンからInnoDBに変換するか、パーティションテーブルを削除する必要があります。 それ以外の場合、パーティション分割テーブルはアップグレード後に使用できません。 アップグレード前に、同様のパーティションを事前にInnoDBに変換します。 次の文を実行して、ストレージエンジンを確認します。

SELECT TABLE_SCHEMA, TABLE_NAME
情報SCHEMA.TABLESから
エンジンが入っていない場所 ('innodb' 、'ndbcluster') と「 % partitioned' 」のような作成オプション; 

次の構文を使用することもできます。

SELECT DISTINCT NAME,SPACE,SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
「 %#P#% 」のような名前とスペース_タイプは「シングル」のようではありません。

次のステートメントを実行して、ストレージエンジンをInnoDBに変更します。

ALTER TABLEパーツエンジン=INNODB;
クエリOK、影響を受ける0行 (0.09秒) 

次のステートメントを実行して、パーティションテーブルを削除します。

ALTER TABLEパーツがパーティションを削除します。クエリOK、影響を受ける0 raws (0.06秒) 

mysqldumpを使用して、MySQL 5.6または5.7サーバーで作成されたダンプファイルからMySQL 8.0サーバーにデータをインポートする場合は、パーティションテーブル作成のステートメントにサポートされていないストレージエンジンが指定されていないことを確認してください。 この要件を満たすには、パーティションへのすべての参照を削除するか、ストレージエンジンをInnoDBに指定するか、default_storage_engineパラメーターをInnoDBに設定します。 MySQL 8.0へのアップグレード前に変更する必要があるパーティションテーブルを特定する方法の詳細については、「アップグレードのためのインストールの準備」をご参照ください。 パーティション制限の詳細については、「ストレージ関連のパーティション制限」をご参照ください。

文字セットと照合の互換性

MySQL 8.0のデフォルトの文字セットはutf8mb4です。 MySQL 8.0とPolarDB For MySQLの場合、character_set_serverパラメーターはデフォルトでutf8に設定されています。 ビジネス要件に基づいて値を変更できます。 Unicodeをサポートするには、文字セットをutf8mb3からutf8mb4に変更することを推奨します。 詳細については、「utf8mb3文字セット (3バイトUTF-8 Unicodeエンコーディング) 」をご参照ください。

MySQL 8.0では、default_collation_for_utf8mb4パラメーターが追加されます。これは、文字セットがutf8mb4の場合のデフォルトの照合順序を指定します。 このパラメーターのデフォルト値はutf8mb3_0900_ai_ciです。これは、MySQLのレプリケーションで使用される内部照合順序です。

以前のバージョンから新しいバージョンにデータを同期するときに違法な照合順序の組み合わせエラーが発生していない場合は、デフォルト値をutf8mb4_general_ciまたはutf8mb4_0900_ai_ciに変更しないことを推奨します。

  • utf8mb4_0900_ai_ci: 公式のUnicodeルールに基づいて一般的なソートと比較を実行します。 精度は高いが、比較は遅い。

  • utf8mb4_general_ci: 比較を高速化するためのソートルールの簡略化されたセットを提供します。 Unicodeルールは守られていませんが、結果は同じ状況下で期待を満たしています。

文字セットとは異なり、照合順序は並べ替えにのみ関連します。 照合の名前において、aiは、照合がアクセントに敏感ではないことを示す。 たとえば、e、è 、é 、ê 、およびeは、ソート中に同じ文字と見なされます。 ciは、照合が大文字と小文字を区別しないことを示します。 例えば、pおよびPは、ソート中に同じ文字と見なされる。

説明
  • バージョン8.0から以前のバージョンへの逆同期またはダンプモードでの同期中に、互換性の問題が発生する可能性があります。

  • Data Transmission Service (DTS) を使用した以前のバージョンと新しいバージョン間の双方向同期では、例外が発生する可能性があります。 MySQLの5.6と5.7、およびPolarDB for MySQLの5.6と5.7には、デフォルトの並べ替え文字セットを使用する必要があります。 そうでなければ、逆同期中に例外が発生する。

  • 照合順序の問題により、ビューの作成時に違法な照合順序の組み合わせエラーが報告されることがあります。 たとえば、convert(a.c1 using utf8mb4)=b.c1を使用すると、前述のエラーが報告される場合があります。

  • convert(exp using utf8mb4) を使用し、照合順序を指定しない場合、MySQLはutf8mb4に基づいてデータを照会し、charset numberの戻り値は255になります。 255に対応する照合順序は、MySQL 8.0のデフォルトのutf8mb4_0900_ai_ciです。

  • default_collation_for_utf8mb4パラメーターを変更した場合、またはDDLステートメントで列名、テーブル名、またはデータベース名を指定した場合、照合順序は有効になりません。 convert関数を使用する必要がある場合は、照合順序を追加します。 例: (convert(a.c1 using utf8mb4)collate utf8mb4_general_ci)=b.c1

  • default_collation_for_utf8mb4パラメーターのデフォルト値を変更すると問題が発生します。 たとえば、デフォルト値をutf8mb4_general_ciに変更すると、次の問題が発生します。

    • sysデータベースとその関連関数を正しく読み取ることができず、不正な照合順序 (utf8mb4_0900_ai_ci.IMPLICIT) と (utf8mb4_general_ci.IMPLICIT) for operation'=' のエラーが報告されます。

    • 8.0.1から8.0.2へのアップグレードは失敗します。 このパラメーターはバージョン8.0で追加されます。 このパラメーターは変更しないことを推奨します。 別の値を使用する必要がある場合は、Quota Centerコンソールに移動し、[操作] 列の [適用] をクリックして、default_collation_for_utf8mb4クォータのデフォルト値をutf8mb4_0900_ai_ciにリセットします。 アップグレードが完了したら、デフォルト値をutf8mb4_general_ciに変更します。

パラメーターの互換性

lower_case_table_names

MySQL 8.0.11以降、サーバーの初期化時に定義されたものとは異なるlower_case_table_namesパラメーターの値を使用してサーバーを起動することは禁止されています。 さまざまなデータ辞書とテーブルフィールドで使用される照合順序は、サーバーの初期化時に定義されるlower_case_table_names値に基づいています。 サーバが異なる値で再起動されると、識別子がソートされ比較される方法に矛盾が生じる。 PolarDB for MySQLの8.0では、初期化後にクラスターのケース感度を変更することはできません。 クラスターの購入時に、PolarDB for MySQL 8.0クラスターが大文字と小文字を区別するかどうかを選択する必要があります。 lower_case_table_namesパラメーターの詳細については、「lower_case_table_names」をご参照ください。

sqL_mode

バージョン8.0のクラスターの起動失敗を防ぐには、NO_AUTO_CREATE_USERオプションを使用して、MySQLオプションファイルのシステム変数sql_modeからすべてのクラスターを削除します。

システム変数に古いSQLモードを定義しないでください。 そうしないと、sql_modeで多くの異なる動作が発生する可能性があります。 バージョンのアップグレード時には確認と整合が必要です。 次のオプションを削除する必要があります。

DB2、MAXDB、MSSDL、MYSQL323、MYSQL40、ORACLE、POSTGRESQL、NO_FIELD_OPTIONS、NO_KEY_OPTI
説明

ほとんどの場合、上記のオプションは組み合わせて設定されます。 一貫性のないモードオプションが存在するかどうかに注意する必要があります。 例:

  • sql_mode=TRADITIONALは、次のオプションの組み合わせに相当します。

    STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISIC
  • PolarDB for MySQLの5.6と5.7、およびMySQLの5.6と5.7にデフォルト設定が使用されている場合、sql_mode=TRADITIONALは次のオプションの組み合わせに相当します。

    STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISIC_BY_ZERO、NO_AUTO_CREATE_USER、およびNO_ENGINE_代替 

上記のオプションの比較に基づいて、NO_AUTO_CREATE_USERオプションがバージョン5.6とバージョン5.7に追加されます。 バージョン8.0では、GRANTステートメントを実行してアカウントを暗黙的に作成することは禁止されています。 NO_AUTO_CREATE_USERオプションはバージョン5.6とバージョン5.7で追加されていますが、GRANTを使用してアカウントを作成できます。identified byを指定した場合。

ONLY_FULL_GROUP_BYオプションを有効にした後に既存のアプリケーションのクエリが拒否された場合、次の方法を使用して問題を解決できます。

  • クエリを変更できる場合は、SELECTプロジェクション、HAVING条件、またはORDER BYリストから、GROUP BY列にもGROUP BY列と機能的な関係がない非集計列を削除します。 または、ANY_VALUE() 関数を使用できます。

  • サードパーティのアプリケーションによって生成されるクエリなど、クエリを変更できない場合は、サーバーの起動時にシステム変数sql_modenot enable ONLY_FULL_GROUP_byに設定します。

    たとえば、GROUP BY句でdescription列が指定されておらず、MINMAXなどの集計関数が適用されていない場合、次の結果が返されます。

    バージョン5.6:

    SELECT id, invoice_id, 説明FROM invoice_line_items GROUP BY invoice_id;
    + ---- ----------- ------------------ +
    | id | invoice_id | description |
    + ---- ----------- ------------------ +
    | 1 | 1 | 新しいソックス |
    | 3 | 2 | 靴 |
    | 5 | 3 | タイ |
    + ---- ----------- ------------------ +
    セットの3列 (0.00秒) 

    バージョン8.0:

    SELECT id, invoice_id, 説明FROM invoice_line_items GROUP BY invoice_id;
    ERROR 1055 (42000): SELECTリストの式 #3はGROUP BY句には含まれていません

explicit_defaults_for_timestamp

MySQLの8.0以降、explicit_defaults_for_timestampパラメーターのデフォルト値はOFFからONに変更されます。 PolarDB for MySQL 8.0では、このパラメーターのデフォルト値はOFFです。これは、バージョン5.6および5.7と同じです。

移行中にnot NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPを自動的に追加しない場合は、このパラメーターをONに設定する必要があります。

MySQLは、explicit_defaults_for_TIMESTAMPパラメーターがOFFに設定されている場合、timestampタイプに対して次の非標準動作を使用します。

  • NULL属性がTIMESTAMP型の列に対して明示的に定義されていない場合、not NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPが自動的に追加されます。 NULL属性が明示的に定義されている場合は保持されます。

mysql> set explicit_defaults_for_timestamp = OFF;
クエリOK、影響を受ける行0、警告1 (0.00秒)

mysql> create table t1(c1 timestamp);
クエリOK、影響を受ける0行 (0.01秒)

mysql> show create table t1;
+ ------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
| テーブル | テーブルの作成 |
+ ------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
| t1 | CREATE TABLE 't1' (
 「c1」タイムスタンプNOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) エンジン=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+ ------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
セットの1列 (0.00秒)

mysql> ドロップテーブルt1;
クエリOK、影響を受ける0行 (0.01秒)

mysql> create table t1(c1 int, c2 timestamp null);
クエリOK、影響を受ける0行 (0.01秒)

mysql> show create table t1;
+ ------- + -------------------------------------------------------------------------------------------------------------------------------------------------------- +
| テーブル | テーブルの作成 |
+ ------- + -------------------------------------------------------------------------------------------------------------------------------------------------------- +
| t1 | CREATE TABLE 't1' (
 'c1' int (11) DEFAULT NULL、
 'c2' タイムスタンプNULL DEFAULT NULL
) エンジン=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+ ------- + -------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.00秒) 
  • テーブルで定義されているTIMESTAMP型の最初の列には、NULLDEFAULT、またはON UPDATE属性が明示的に定義されるか、DEFAULT CURRENT_TIMESTAMPおよびON UPDATE CURRENT_TIMESTAMP属性が自動的に追加されます。

  • テーブルで定義されているTIMESTAMP型の2番目の列で、sql_modeパラメーターがNO_ZERO_DATEに設定されておらず、NULLまたはDEFAULT属性が明示的に定義されていない場合、DEFAULT '0000-00-00 00:00:00 'が自動的に定義されます。

    mysql> set sql_mode = '';
    クエリOK、影響を受ける0行 (0.00秒)
    
    mysql> create table t1(c1 timestamp, c2 timestamp);
    クエリOK、影響を受ける0行 (0.01秒)
    
    mysql> show create table t1;
    + ------- + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | テーブル | テーブルの作成 |
    + ------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    | t1 | CREATE TABLE 't1' (
     'c1' タイムスタンプNOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
     'c2' タイムスタンプNOT NULL DEFAULT '0000-00-00 00:00:00'
    ) エンジン=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
    + ------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
    1行セット (0.00秒) 

    sql_modeパラメーターをNO_ZERO_DATEに設定してstrictモードを有効にすると、次のエラーが報告されます。

    mysql> create table t1(c1 timestamp, c2 timestamp);
    エラー1067 (42000): 'c2' の無効なデフォルト値
    mysql> create table t1(c1 timestamp, c2 timestamp); 

explicit_defaults_for_timestampパラメーターがONに設定されている場合、前述の非標準の動作は中止され、TIMESTAMPタイプの動作は他のタイプの動作と同じになります。

ビュー、テーブル、キーワードの互換性

InnoDB関連のビューとの互換性

INFORMATION_SCHEMAのInnoDBシステムテーブルに基づくビューは、データディクショナリテーブルの内部システムビューに置き換えられます。 InnoDBのINFORMATION_SCHEMAに影響するビューの名前が変更されます。 システムアプリケーションでInnoDB関連のビューにアクセスする場合は、アプリケーションでビューが変更されているかどうかを確認します。 information_SCHEMAの詳細については、「INFORMATION_SCHEMAテーブル」をご参照ください。

InnoDB情報スキーマビューの名前変更

古い名前

新しい名前

INNODB_SYS_COLUMNS

INNODB_COLUMNS

INNODB_SYS_DATAFILES

INNODB_DATAFILES

INNODB_SYS_FIELDS

INNODB_FIELDS

INNODB_SYS_FOREIGN

INNODB_FOREIGN

INNODB_SYS_FOREIGN_COLS

INNODB_FOREIGN_COLS

INNODB_SYS_INDEXES

INNODB_INDEXES

INNODB_SYS_TABLES

INNODB_TABLES

INNODB_SYS_TABLESPACES

INNODB_TABLESPACES

INNODB_SYS_TABLESTATS

INNODB_TABLESTATS

INNODB_SYS_VIRTUAL

INNODB_VIRTUAL

MySQL 5.6および5.7、またはPolarDB for MySQL 5.6および5.7のビューが、PolarDB for MySQL 8.0に追加されたビューと同じ名前を使用しないようにします。 MySQL 5.7またはPolarDB for MySQL 5.7クラスターで次のステートメントを実行します。 情報が返された場合は、そのようなテーブルの処理方法を決定します。 アップグレードのために自己管理クラスターをクラウドに移行するときに、このチェックを実行することを推奨します。

「インデックス」、'parameter_type_elements '、「パラメータ」、'resource_groups '、「ルーチン」、'スキーマ' 、'st_spatial_reference_systems '、'table_partition_systems '、'table_partition_values '、'table_partitions' 、「テーブル_状態」、「テーブル」、'tablespace_files' 、「テーブルスペース」、「トリガー」、'view_routine_usage'
);

仮定する
+ ------------ ------------------- +
| TABLE_SCHEMA | テーブル名 |
+ ------------ ------------------- +
| mysql | カタログ |
+ ------------ ------------------- +
セットで1行 (0.00秒) 

MySQL 5.6または5.7クラスターで次のステートメントを実行します。 情報が返された場合は、そのようなテーブルの処理方法を決定します。 アップグレードのために自己管理クラスターをクラウドに移行するときに、このチェックを実行することを推奨します。

SELECT TABLE_SCHEMA, TABLE_NAME
情報SCHEMA.TABLESから
WHERE LOWER(TABLE_SCHEMA) = 'mysql'
およびLOWER(TABLE_NAME) IN
(
「カタログ」、'character_sets' 、'check_constraints' 、'コラージュ' 、'column_statistics '、'column_type_elements '、「列」、'dd_properties' 、「イベント」、'foreign_key_column_usage '、「foreign_keys」、'index_column_usage '、'index_partitions' 、'index_stats' 、'インデックス' 、'parameter_type_elements '、「パラメータ」、'resource_groups '、「ルーチン」、「スキーマ」、

返されるユーザーテーブルは、アップグレード前に名前を変更または削除する必要があります。 次のステートメントを実行して、ユーザーテーブルの名前を変更します。

ALTER TABLEカタログRENAME user_catalogs;
クエリOK、影響を受ける0行 (0.05秒) 

次のステートメントを実行して、ユーザーテーブルを削除します。

DROP TABLEカタログ;
クエリOK、影響を受ける0行 (0.06秒) 

互換性の表示

MySQL 8.0より前のバージョンでは、ビューの表示列の名前に最大255文字を含めることができます。 列名の最大長の要件に準拠するため、MySQL 8.0は、表示列の名前が64文字を超えるビューをサポートしていません。 これらのビューは、MySQL 5.6および5.7でSHOW CREATE VIEWステートメントを実行することによってのみ識別できます。

ショーはビューv1を作成します。+ ------ + ------------------------------------------------------------------------------------------------
| ビュー | ビューの作成
+ ------ + ------------------------------------------------------------------------------------------------
| v1 | CREATE ALGORITHM=UNDEFINED DEFINER='root' @ 'localhost' SQL SECURITY DEFINER VIEW
+ ------ + ------------------------------------------------------------------------------------------------
1行セット (0.00秒) 

バージョン8.0にアップグレードする前に、ビューの名前を変更する必要があります。

ALTER VIEW v1(a12345678901234567890) としてSECLCT 1;

バージョン5.6のシステムテーブルとの互換性

MySQL 5.7.6および8.0以降のバージョンでは、mysql.usシステムテーブルからPassword列が削除されます。 以前のバージョンでPassword列に格納されていたデータを含め、すべての資格情報はauthentication_string列に格納されます。

INFORMATION_SCHEMAバージョン5.6のシステム変数とステータス変数を含むテーブルとの互換性

MySQL 5.6のINFORMATION_SCHEMAおよびPolarDB for MySQL 5.6のシステム変数とステータス変数を含むテーブルは、バージョン8.0では廃止されています。 次のテーブルは廃止されました。

INFORMATION_SCHEMA.GLOBAL_VARIABLES
INFORMATION_SCHEMA.SESSION_VARIABLES
INFORMATION_SCHEMA.GLOBAL_STATUS
INFORMATION_SCHEMA.SESSION_ステータス 

バージョン8.0では、前述の廃止されたテーブルはPERFORMANCE_SCHEMAに移行されます。

performance_schema.global_variables
performance_schema.session_variables
performance_schema.variables_by_thread
performance_schema.global_status
performance_schema.session_status
performance_schema.status_by_thread
performance_schema.status_by_account
performance_schema.status_by_host
performance_schema.status_by_ユーザー 

対応するビューを直接使用するのではなく、SHOWコマンドを実行することをお勧めします。

ショーのバリエーション
ショーステータス 

バージョン5.6のInnoDBテーブルとの互換性

InnoDBテーブルの暗黙のデフォルトの行形式は、COMPACTからDYNAMICに変更されます。 innodb_default_row_formatパラメーターは、デフォルトのInnoDB行形式を指定します。 COMPACT (デフォルト) とREDUNDANTの値はDYNAMICに変更できます。 バージョン8.0へのアップグレード後、row_formatオプションを明示的に指定しない限り、作成する新しいテーブルは定義された行形式を使用します。 ROW_FORMATオプションが明示的に指定されていない場合、またはROW_FORMAT=DEFAULTが使用されている場合、テーブルを再構築する操作は、テーブルの行形式をinnodb_default_row_FORMATパラメーターで指定された形式に変更します。 詳細については、「テーブルの行形式の定義」をご参照ください。

バージョン5.6のGET_LOCK関数との互換性

GET_LOCK() 関数は、MySQL 5.7.5以降のメタデータロック (MDL) サブシステムを使用して再実装され、その機能が拡張されました。

  • 以前のバージョンでは、GET_LOCK() 関数は一度に1つの名前付きロックのみを取得するために呼び出すことができ、GET_LOCK() 関数が2回目に呼び出されると既存のロックはすべて解放されます。 バージョン8.0では、GET_LOCK() 関数を呼び出して、一度に複数の名前付きロックを取得できます。既存のロックは解放されません。

    以前のロックをすべて解除するには、GET_LOCK() 関数に依存するアプリケーションに変更が必要です。

  • 複数のロックを取得する能力は、クライアント間でデッドロックを導入し得る。 MDLサブシステムはデッドロックをチェックし、デッドロックが検出された場合はER_USER_LOCK_DEADLOCKエラーを報告します。

  • MDLサブシステムは、ロック名に最大64文字の長さを適用します。 この制限は、名前付きロックにも適用されます。 この長さの制限は、以前のバージョンでは適用されません。

  • GET_LOCK() 関数を使用して取得したロックがPerformance Schema metadata_locksに表示されます。 OBJECT_TYPE列の値はUSER LEVEL LOCKで、OBJECT_NAME列はロック名を示します。

  • バージョン8.0では、RELEASE_ALL_LOCKS() 関数を呼び出して、取得したすべての名前付きロックを一度に解放できます。

詳細については、「関数のロック」をご参照ください。

タイプの互換性

ENUMおよびSETタイプ

テーブルまたはストアドプロシージャ内の単一のENUMまたはSET列要素は、255文字または1,020バイトの長さを超えることはできません。

YEARタイプバージョン5.6

YEAR(2) タイプは廃止されました。 YEAR(2)YEAR(4) に置き換える必要があります。

タイプデータ挿入バージョン5.6

  • 符号なしの列に負の値が挿入されると、エラーが報告されます。 例:

    1. 符号なし列を含むテーブルを作成します。

      CREATE TABLEテスト (id int unsigned);
    2. 負の値を挿入します。

      INSERT INTOテスト値 (-1);
      • 次の結果がバージョン5.6で返されます。

        クエリOK、1行影響、1警告 (0.01秒)
      • 次の結果がバージョン8.0で返されます。

        エラー1264 (22003): 行1の列 'a' の範囲外の値
  • 値をゼロで割ると、エラーが報告されます。 例:

    1. テストテーブルを作成します。

      CREATE TABLE test2 (id int unsigned);
    2. 値をゼロで割ります。

      test2値に挿入する (0/0) 。
      • 次の結果がバージョン5.6で返されます。

        クエリOK、影響を受ける1行 (0.01秒)
      • 次の結果がバージョン8.0で返されます。

        エラー1365 (22012): 除算by 0
  • 列に挿入された文字数が上限を超えると、エラーが報告されます。 例:

    1. 10文字の列に20文字を含む文字列を挿入すると、エラーが報告されます。 10文字の列を含むテーブルを作成します。

      CREATE TABLE test3 (varchar(10));
    2. 10文字を超える文字列を挿入します。

      test3 VALUES ('abcdefghijklmnopqrstuvwxyz') に挿入します。
      • 次の結果がバージョン5.6で返されます。

        クエリOK、1行影響、1警告 (0.00秒)
      • 次の結果がバージョン8.0で返されます。

        エラー1406 (22001): 行1の列 'a' にデータが長すぎる
  • 非標準のゼロ日付がdatetime列に挿入されると、エラーが報告されます。 例:

    1. datetime列を含むテーブルを作成します。

      CREATE TABLE test3 (datetime);
    2. 0000-00-00 00:00を挿入します。

      テスト3値に挿入する ('0000-00-00 00:00:00 ');
      • 次の結果がバージョン5.6で返されます。

        クエリOK、1行影響、1警告 (0.00秒)
      • 次の結果がバージョン8.0で返されます。

        エラー1292 (22007): 日付時刻の値が正しくない: '0000-00-00 00:00:00 'for column 'a' at ro

バージョン5.7のJSONでのINT型のデータへの変更

. 0サフィックスは、INT型の一部の値に追加されます。 例: 1.0と9999.0。 バージョン5.7とバージョン8.0は、JSONのデータに対して倍精度処理の方法が異なるためであることを事前に確認します。 この問題を解決するには、DTSデータ検証が必要です。 必要に応じて、DTSタスク設定ページでデータ検証を設定できます。

バージョン5のレガシータイプ。x

レガシーDECIMAL、レガシーVARCHAR、レガシーTIME/DATETIMEおよびTIMESTAMPなどのデータタイプは、MySQL 5.0、5.1、および5.6では廃止されています。 バイナリーアップグレードは、MySQL 5.6と5.7でのみ使用でき、MySQL 8.0ではサポートされていません。 これらのテーブルを識別するには、アップグレード前にMySQL 5.6および5.7でCHECK TABLE...FOR UPGRADEコマンドを実行するか、mysqlcheckcheck-upgradeオプションで使用します。 さらに、セッション変数を有効にすることで、レガシーTIME/DATETIMEおよびTIMESTAMPを使用するテーブルを識別できます。

アップグレード用の
チェックテーブル41_decimal;
+ ----------------- ------- ----------- + ------------------------------------------------
| テーブル | Op | Msg_type | Msg_text
+ ----------------- ------- ----------- + ------------------------------------------------
| test.41_decimal | check | error | 'test'.'41_decimal' にテーブルのアップグレードが必要です。 
+ ----------------- ------- ----------- + -------------------------------------------------
セットの1列 (0.00秒)
アップグレードのためにテーブル55_temporalをチェックしてください。+ ------------------ ------- ----------- + ------------------------------------------------
| テーブル | Op | Msg_type | Msg_text
+ ------------------ ------- ----------- + ------------------------------------------------
| test.55_temporal | check | error | テーブルのアップグレードが必要です。 「修復テーブル」を行ってください
セットの1列 (0.00秒)
nisha @ nisha-PORTEGE-Z30-A:~/workspace1/mysql-5.7/dbg-5.7 /クライアント /mysqlcheck -- user=root
エラー: 'test'.'41_decimal' にはテーブルのアップグレードが必要です。 テーブルをダンプ /リロードしてください
test.55_一時的
error: テーブルのアップグレードが必要です。 「REPAIR TABLE '55_temporal' 」またはdump/reloaを実行してください
テスト。子供OK
test.geom OK
test.jemp OK
test.jemp_myisam OK
test.opening_lines OK 

このようなデータ型を使用するテーブルはアップグレードできません。 この場合、REPAIR TABLEステートメントを実行してテーブルを修復し、レガシーVARCHARとレガシーDECIMALのダンプとリロードを実行します。

修復テーブル55_temporal;
+ ------------------ -------- ----------- + ---------------------------------------------------
| テーブル | Op | Msg_type | Msg_text
+ ------------------ -------- ----------- + ---------------------------------------------------
| test.55_temporal | repair | 注 | 古い形式のTIME/TIMESTAMP/DATETIME列には
| test.55_temporal | 修理 | ステータス | OK
+ ------------------ -------- ----------- + ---------------------------------------------------
セットの2行 (0.01)
ダンプ:
$./client/mysqldump -- データベースtest -- socket=5.6/data/mysql.sock -- user=root>test.sql
復元:
.\ test.sql 

キーワードと予約語

PolarDB for MySQL 8.0では、現在のバージョンで使用されているキーワードと予約語をinformation_schema. keywordsテーブルで表示できます。 名前がこれらのキーワードや予約語と競合しないようにしてください。 以前に予約されていなかった一部のキーワードは、PolarDB for MySQL 8.0で予約できます。 詳細については、「キーワードと予約語」をご参照ください。 テーブル名、フィールド名、関数名など、すべてのカスタムコンテンツでキーワードや予約語を使用しないことをお勧めします。 さらに、KICKOUTは、PolarDB for MySQL 8.0の予約済みキーワードです。 MySQL 5.6、MySQL 5.7、またはネイティブMySQL 8.0で、テーブル名、フィールド名、ストアドプロシージャ名などのオブジェクト名としてこのキーワードを使用した場合、PolarDB for MySQL 8.0に移行する前にオブジェクト名を変更することを推奨します。 そうでない場合、エラーコード1064を伴う構文エラーが報告される。

SQLの互換性

承認

MySQL 8.0.11では、GRANTステートメントを使用してユーザーアカウントの非特権機能を変更する機能など、アカウント管理に関連する一部の廃止された機能が削除されます。

GRANT REPLICATION CLIENT ON *.* TO 'odps' @ '%'; でユーザーを作成することはできません。ユーザーを作成します。グラントprivielges; 

ASCまたはDESCを含むGROUP BY句

MySQL 8.0.13以降、GROUP BY句に推奨されないASCまたはDESC修飾子は削除されました。 以前はGROUP BYソートに依存していたクエリは、以前のMySQLバージョンとは異なる結果を生成する場合があります。 指定されたソート順序を生成するには、GROUP BY句を書き直す必要があります。 例:

元のSQL文:

select id,count(*) from sbtest.sbtest1 where id < 10 group by id desc

書き換えられたSQL文:

select id,count(*) from sbtest.sbtest1 where id < 10 group by id order by id
説明

PolarDB for MySQL 8.0.2.2.11.1以降では、GROUP BY句を書き直す必要はありません。 ASCまたはDESCを含むGROUP BY句を使用するには、PolarDB for MySQLコンソールでloose_group_by_compatible_sortingパラメーターをTRUEに設定するだけです。 PolarDB For MySQLコンソールでパラメーターを設定する方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。

外部キー制約の定義

MySQL 5.6および5.7では、InnoDB FOREIGN KEYの定義にCONSTRAINTキーワードを含めることはできません。また、外部キー制約の名前の長さは64文字を超えることはできません。 MySQL 8.0より前のバージョンでは、外部キー制約の名前を明示的に指定しない場合、InnoDBはテーブル名に _ibfk_Xを追加することで外部キー制約名を自動的に生成します。Xは数値です。 次の例で使用されるSililテーブル名 имя_базы_в_кодировке_утф8_длиной_больше_чем_45имя_азы_в_к о д и р о в к など、複数バイトの64文字のテーブル名の場合、外部キー制約の自動的に生成される名前は64文字を超える長さで構成されます。 これらのテーブルを変更するには、64文字を超えない明示的な制約名を持つ制約を追加します。

ALTER TABLE 'и м я_базы_в_кодировке_утф8_длиной_больше_чем_45имя_азы_в_кодировк 'DR
クエリOK、影響を受ける0行 (0.01秒)
記録: 0重複: 0警告: 0
ALTER TABLE 'и м я_базы_в_кодировке_утф8_длиной_больше_чем_45имя_азы_в_кодировк 'AD
クエリOK、影響を受ける0行 (0.13秒)
レコード: 0重複: 0警告: 0 

バージョン5.7の空間関数

MySQL 5.7では、複数の名前で使用できる空間関数を使用しないことを推奨します。 例:

CREATE TABLE t_gcol_dep (fid INTEGER NOT NULL PRIMARY KEY, g POINT GENERATED ALWA)
クエリOK、影響を受ける行0、警告1 (0.07秒)
警告を表示します。+ -------- + ------- + ---------------------------------------------------------------------
| レベル | コード | メッセージ
+ -------- + ------- + ---------------------------------------------------------------------
| 警告 | 1287 | 'POINTFROMTEXT' は非推奨であり、将来のリリースで削除されます
+ -------- + ------- + ---------------------------------------------------------------------
1行セット (0.00秒) 

これらの空間関数は、空間関数名の変更のため、バージョン8.0で削除されています。 この変更は、命名規則の一貫性を維持するのに役立ちます。 名前がST_ で始まる関数は正確な操作を実行しますが、名前がMBRで始まる関数は最小境界長方形に基づいて操作を実行します。 これらの関数を使用して生成される列は、アップグレード前に変更する必要があります。 削除された空間関数の詳細については、「MySQL 8.0で削除された機能」をご参照ください。 名前がST_ またはMBRで始まる関数を使用するように列を変更する必要があります。

ALTER TABLE t_gcol_dep常に生成されるMODIFY g POINT (ST_POINTFROMTEXT(POINT))
クエリOK、影響を受ける0行 (0.03秒)
レコード: 0重複: 0警告: 0 

トリガーの互換性

MySQL 5.0.17より前のバージョンでは、CREATE TRIGGERステートメントはdefiner属性をサポートしていません。 character_set_clientcollation_collection、データベース照合順序属性など、definer属性が欠落または空または無効なコンテキストを持つこのタイプのトリガー定義は、MySQL 5.6および5.7からのアップグレードに失敗します。 これらのトリガーは、check-upgradeオプションを指定してmysqlcheckを実行するか、MySQL 5.6および5.7でCHECK TABLEステートメントを実行することで識別できます。

$./client/mysqlcheck -- user=root -- socket=5.7/data/mysql.sock -- databases triggers -- ch
triggers.t1
警告: トリガー 'triggers. 'trg_t1_before_insert 'のdefiner属性がありません。 トリグ
警告: トリガー 'triggers. 't1_bi' のdefiner属性がありません。 トリガーは行為になります
警告: トリガー 'triggers' のdefiner属性がありません。'trg_t1_after_insert_1 '。 トライ
警告: トリガー 'triggers. 'trg_t1_after_insert 'のdefiner属性がありません。 トリッグ
警告: トリガー 'triggers. 'trg_t1_after_insert_3' のdefiner属性はありません。 トライ
警告: トリガー 'triggers. 'trg_t1_before_update_3' のdefiner属性がありません。 tr
警告: トリガー 'triggers. 'trg_t1_before_update 'のdefiner属性がありません。 トリグ
警告: トリガー 'triggers. 'trg_t1_after_update 'のdefiner属性がありません。 トリッグ
警告: トリガー 'triggers. 'trg1' のdefiner属性がありません。 トリガーはactiになります
ステータス: OK
triggers.t2 OK
チェックテーブルt1;
------------ ------------------------- -----------------------------------------------------
| テーブル | Op | Msg_type | Msg_text
------------ ------------------------- -----------------------------------------------------
| triggers.t1 | チェック | 警告 | トリガー 'triggers. 'trg_t1_のdefiner属性なし
| triggers.t1 | チェック | 警告 | トリガー 'triggers. 't1_bi' のdefiner属性がありません。
| triggers.t1 | チェック | 警告 | トリガー 'triggers. 'trg_t1_のdefiner属性なし
| triggers.t1 | チェック | 警告 | トリガー 'triggers. 'trg_t1_のdefiner属性なし
| triggers.t1 | チェック | 警告 | トリガー 'triggers. 'trg_t1_のdefiner属性なし
| triggers.t1 | チェック | 警告 | トリガー 'triggers. 'trg_t1_ 
のdefiner属性なし

このようなトリガーをダンプまたはリロードして問題を解決します。

ダンプ:
$./client/mysqldump -- データベーストリガー -- socket=5.6/data/mysql.sock -- user=root>trigge
復元:
.\ triggers.sql 

クライアントの互換性

Javaアプリケーションの場合、MySQL Connector/Jが8.0以降にアップグレードされた場合、接続アカウントにはMySQL Connector/J 8.0.9以降のcaching_sha2_passwordが必要です。 データソースでdataworksがutf8に設定されていない場合、エラーが発生する可能性があります。 データベース名を変更することを推奨します。 characterEncoding=utf8&com.mysql.jdbc.faultInjection.serverCharsetIndex= を接続文字列に追加して、Javaクライアントが接続でセッションレベルの文字セットを明示的に指定できるようにします。

不明なシステム変数tx_read_onlyとの互換性

MySQLおよびPolarDB for MySQL 8.0では、環境変数tx_read_onlyが削除されています。 代わりにtransaction_read_onlyを使用します。

元のステートメント:

@ @ tx_read_のみ
を選択

書き直したステートメント:

@ @ transaction_read_のみ
を選択

一般的な問題

並列クエリによるソートの問題

バージョン8.0以降では、並列クエリがサポートされています。 並列スキャンでは、特にページ化されたクエリのSQL文の場合、データへのランダムアクセスのため、MySQLシリアルスキャンのデフォルトの順序が毎回ランダムに変更されます。 指定されたソート順序を生成するには、order BY句を追加します。

バージョン5.6のサブクエリに関連する問題

バージョン5.6のサブクエリのORDER BY句は機能しなくなりました。 例:

SELECT *
から
(
SELECT * FROM 'information_schema '. テーブル
table_name DESCによる注文
) AS sg
GROUP BYテーブル_名 

内部レイヤーのORDER BY句は、バージョン5.7および8.0のオプティマイザによって無視されます。 この問題を解決するには、ステートメントを変更する必要があります。 最も簡単な方法は、ソートを有効にするための制限を追加することです。 例:

SELECT *
から
(
SELECT * FROM 'information_schema '. テーブル
ORDER BY table_name DESC制限10000# 行数が不足している必要があります。
) AS sg
GROUP BYテーブル_名 

派生テーブルの反転5.6に関連する問題

オプティマイザは、同じ方法で、派生テーブルとビューを句で処理します。 FROMを使用して不要な具体化をより適切に防ぎ、プッシュダウン条件を可能にし、より効率的な実行計画を作成します。 ただし、バージョン8.0およびテーブル変更ステートメントでは、UPDATEを使用して生成された派生テーブルでDELETEステートメントでマージポリシーを使用すると、ER_UPDATE_TABLE_USEDエラーが発生する可能性があります。

t1から削除
-> WHERE id IN (SELECT id)
-> FROM (SELECT t1.id)
-> FROM t1 INNER JOIN t2 USING (id)
-> WHERE t2.status = 0) AS t;
エラー1093 (HY000): ターゲットテーブル 't1' を指定できません
FROM句
の更新用

派生テーブルを外部クエリブロックにマージすると、テーブルのクエリまたは変更時にエラーが発生します。 この問題は、実際には派生テーブルを別のテーブルに変換するため、マテリアライゼーションによっては発生しません。 この問題を回避するには、ステートメントを実行する前にoptimizer_switchシステム変数を使用してderived_mergeフラグを無効にします。

SET optimizer_switch = 'derived_merge=off ';

derived_mergeフラグは、オプティマイザがFROM句のクエリとビューを外部クエリブロックにマージしようとするかどうかを指定します。 他のルールがマージをブロックしない場合、このフラグはデフォルトでオンに設定され、マージを有効にします。 フラグをoffに設定すると、マージをブロックできます。 詳細については、「マージまたはマテリアライゼーションによる派生テーブル、参照の表示、および共通テーブル式の最適化」をご参照ください。

UNIONステートメントで、ORDER BYまたはLIMITを別のSELECTクエリブロックに適用するには、SELECT句を括弧 (()) 内に配置します。

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
ユニオン
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); 
説明

バージョン8.0では、括弧 (()) が必要です。 以前のMySQLバージョンでは、かっこ (()) なしのステートメントが許可される場合があります。

参考資料

What Is New in MySQL 8.0

MySQLの変更8.0

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

MySQL 8.0へのアップグレード? ここにあなたが知る必要があるものがあります...

MySQL 5.6、MySQL 5.7、MySQL 8.0の違い: