2020.10.23

MySQL

MySQL 8.0.22 GA版(リリース日:2020年10月19日)

主な変更点

■ Account Management関連

● 付与テーブルを含むステートメントのロック処理が改善されました。(バグ #31291237、バグ #31576185)

● mysql.infoschemaおよびmysql.sysの予約済みアカウントの変更は、現在、SYSTEM_USER権限を必要とします。(バグ #31255458)

● CREATE USER、DROP USER、RENAME USERのアカウント管理ステートメントの場合、サーバーは、(おそらく不注意で)保存済みオブジェクトの孤立を引き起こす操作、または、現在孤立している保存済みオブジェクトの採用を引き起こす操作を防ぐように設計された追加のセキュリティチェックを実行するようになりました。このような操作は、現在、エラーで失敗します。SET_USER_ID権限がある場合、それはチェックをオーバーライドし、それらの操作はエラーではなく警告を生成します。これにより、管理者はそれらの操作をそれらの操作が意図された時に実行できます。

■ 監査ログ関連

● JSON形式のログファイルの場合、MySQL Enterprise Auditは、audit_log_read()ユーザー定義関数を使用したログ読み取り操作をサポートします。以前は、読み取りを開始する位置の指定は、特定のイベントの正確なタイムスタンプとイベントIDを示すブックマークを含む引数をaudit_log_read()に渡すことによってのみ可能でした。柔軟性を高めるために、引数を任意のタイムスタンプに名前を付ける開始指定子にして、そのタイムスタンプ以降に発生する最初のイベントから開始して読み取ることができるようになりました。

■ C API関連

● MySQLクライアントライブラリは、mysql_real_connect()と同様のmysql_real_connect_dns_srv() C API関数が含まれるようになりましたが、MySQLサーバーへの接続を確立するための候補となるホストを決定するために、明示的なホスト、ポート、ソケット引数ではなく、DNS SRVレコードを使用するようになりました。

 C APIを使用するアプリケーションは、新しい関数を直接呼び出すことができます。さらに、mysqlクライアントプログラムはDNS SRV機能を使用するように変更されています。それは、--hostよりも優先される--dns-srv-nameオプションをサポートするようになり、接続がDNS SRVレコードに基づくようになりました。

 レプリカ、FEDERATEDストレージエンジン、mysql以外のクライアントプログラムによって作成された接続を含む、他のコンテキストでの接続の確立は影響を受けません。

■ コンパイル関連

● Visual Studio 16.4は、現在、MySQLコンパイルの最小バージョンです。(バグ #31655401)

● サーバービルド用のBoostライブラリの最小バージョンは、現在、1.73.0です。(バグ #31309800)

■ 設定関連

● 新しいWITH_TCMALLOC CMakeオプションは、-ltcmallocとリンクするかどうかを示します。有効にすると、組み込みのルーチン malloc()、calloc()、realloc()、free()が無効になります。デフォルトはOFFです。WITH_TCMALLOCとWITH_JEMALLOCは、相互に排他的です。(バグ #31785166)

● 新しいCOMPRESS_DEBUG_SECTIONS CMakeオプションは、バイナリ実行可能ファイルのデバッグセクションを圧縮するかどうかを示します(Linuxのみ)。実行可能なデバッグセクションを圧縮すると、ビルドプロセス中に余分なCPU時間を費やしてスペースを節約します。デフォルトはOFFです。このオプションは明示的に設定されていないが、COMPRESS_DEBUG_SECTIONS環境変数が設定されている場合、オプションはその変数からその値を取得します。(バグ #31498296)

● WITH_DEFAULT_FEATURE_SET CMakeオプションが削除されました。(バグ #31122507)

● ネットワーク名前空間サポートを実装するプラットフォーム(Linuxなど)で、MySQLは、クライアントプログラムからMySQLサーバーまたはXプラグインへのTCP/IP接続用のネットワーク名前空間の設定を可能にするようになりました。

  ・サーバー側では、システム変数 bind_address、admin_address、mysqlx_bind_addressに、着信接続をリッスンする特定のIPアドレスまたはホスト名に使用するネットワーク名前空間を指定するための拡張構文があります。

  ・クライアント接続の場合、mysqlクライアントとmysqlxtestテストスイートクライアントは、ネットワーク名前空間を指定するための--network-namespaceオプションをサポートします。

  ・レプリカサーバーからソースサーバーへのレプリケーション接続の場合、CHANGE MASTER TOステートメントは、ネットワーク名前空間を指定するためのNETWORK_NAMESPACEオプションをサポートします。

 レプリケーション監視の目的で、パフォーマンススキーマ replication_connection_configurationテーブル、レプリカサーバー接続メタデータリポジトリ、SHOW REPLICA | SLAVE STATUSステートメントには、接続に適用可能なネットワーク名前空間を表示する新しい列があります。

■ 非推奨と削除関連

● InnoDB memcachedプラグインは非推奨で、そのサポートは将来のMySQLバージョンで削除される予定です。

● INFORMATION_SCHEMA.TABLESPACESテーブルは使用されていません。現在は非推奨であり、将来のMySQLバージョンで削除される予定です。他のINFORMATION_SCHEMAテーブルは関連情報を提供する可能性があります。

■ キーリング関連

● MySQL Enterprise Editionには、キーリングストレージのバックエンドとしてOracle Cloud Infrastructure Vaultを使用するkeyring_ociプラグインが含まれるようになりました。MySQLサーバーのローカルストレージに永続的に保存されるキー情報はありません。全てのキーはOracle Cloud Infrastructure Vaultに格納されるため、このプラグインは、Oracle Cloud Infrastructure MySQLの顧客がMySQL Enterprise Editionのキーを管理するのに非常に適しています。

■ オプティマイザ関連

● 重要な変更:プリペアドステートメントは、実行される度に1回ではなく、PREPAREの実行時に1回だけ準備されるようになりました。さらに、ストアドプロシージャ内のステートメントも、ストアドプロシージャが最初に実行された時に1回だけ準備されるようになりました。この変更により、準備の繰り返しと準備構造のロールバックの追加コストが回避されるため、このようなステートメントのパフォーマンスが向上します。準備構造のロールバックはいくつかのバグの原因です。

 この作業の一環として、プリペアドステートメントで使用される動的パラメータが解決される方法が変更され、その結果、プリペアドステートメントのユースケースが次のように変更されます。

  ・SELECT expr1, expr2, ... FROM table ORDER BY ?の形式のプリペアドステートメントの場合、パラメーターに整数値Nを渡しても、選択リストのN番目の式による結果の順序付けは行われなくなりました。結果は、ORDER BY定数で予想されるように、順序付けられなくなりました。

  ・ウィンドウ関数のNTILE(NULL)、NTH_VALUE(expr, NULL)、LEAD(expr, nn)、LAG(expr, nn)は、SQL標準に準拠するために、プリペアドステートメント内で許可されなくなりました(nnは負の数)。

  ・プリペアドステートメントによって読み取られるユーザー変数のタイプは、ステートメントが準備される時に決定されるようになりました。タイプは、ステートメントのその後の各実行に対して持続します。

  ・ストアドプロシージャ内のステートメントによって読み取られるユーザー変数のタイプは、ステートメントが最初に実行された時に決定されるようになりました。タイプは、含まれているストアドプロシージャのその後の呼び出し全てに対して持続します。

  ・パラメータタイプを決定するために使用できるコンテキスト情報がないパラメータの場合、サーバーは、パラメータがバイナリ文字列ではなく、デフォルトの文字セットの文字列であると想定します。これが正しくないパラメータは、CAST()式内に配置できます。

 さらに、ウィンドウ関数のLAG()、LEAD()、NTILE()のrows (N) 引数は、現在は、次のいずれかの形式で1から263の範囲の整数である必要があります。

  ・符号なし整数定数リテラル

  ・位置パラメータマーカー (?)

  ・ユーザー定義変数

  ・保存されたルーチンのローカル変数

 さらに、この引数はNULLを値として受け入れなくなりました。詳細については、参照したばかりの関数の説明を参照してください。(バグ #48612、バグ #99601、バグ #100150、バグ #11756670、バグ #23599127、バグ #31119132、バグ #31365678、バグ #31393719、バグ #31592822、バグ #31810577)

● filesortアルゴリズムは、単一のテーブルだけでなく、複数のテーブルでの結合のソートをサポートするようになりました。(バグ #31310238、バグ #31559978、バグ #31563876)

● RIGHT JOINを使用すると、一部の内部オブジェクトが、意図したとおりにLEFT JOINでの使用に適したオブジェクトに変換されませんでした。これらには、解析時に作成されたテーブルのリストがいくつか含まれていましたが、それらの順序は逆になりませんでした。これは、特殊なケースとしてLEFT JOINが元々RIGHT JOINであったインスタンスを処理するためのコードを維持することを必要とし、いくつかのバグの原因でした。現在、サーバーは解析時に必要な反転を実行します。そのため、解析後、RIGHT JOINは実際には全ての点でLEFT JOINになります。(バグ #30887665、バグ #30964002)

 参照:バグ #12567331、バグ #21350125。

● SELECT INTO DUMPFILEステートメントとSELECT INTO OUTFILEステートメントを使用してファイルに書き込む時の定期的な同期のサポートが追加されました。この機能は、select_into_disk_syncシステム変数をONに設定することにより有効にできます。書き込みバッファのサイズは、サーバーシステム変数select_into_buffer_sizeを使用して設定できます。デフォルトのバッファサイズは131072(217)バイトです。ディスクへの同期後の任意の遅延は、select_into_disk_sync_delayシステム変数を使用して設定することもできます。デフォルトの動作では、遅延は許可されません(つまり、0ミリ秒の遅延時間)。

 (バグ #30284861)

● MySQLは、適格なクエリに対して派生条件プッシュダウンを実装するようになりました。これが意味するのは、SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > constantなどのクエリの場合、多くの場合に外部のWHERE条件を派生テーブルにプッシュすることが可能になりました。この場合、SELECT * FROM (SELECT i, j FROM t1 WHERE i > constant) AS dtになります。以前は、派生テーブルがマテリアライズされ、マージされなかった場合、MySQLはテーブル全体(この場合はt1)をマテリアライズしてから、WHERE条件を使用して行を修飾していました。

 派生テーブルを外部クエリにマージできない場合(例えば、派生テーブルが集約を使用している場合)、外側のWHERE条件を派生テーブルにプッシュすると、処理される必要のある行数を減らすことができ、クエリのパフォーマンスが向上するはずです。

 派生テーブルが集約関数またはウィンドウ関数を使用しない場合、外部WHERE条件をマテリアライズされた派生テーブルに直接プッシュダウンできます。さらに、派生テーブルにGROUP BYがあり、ウィンドウ関数を使用しない場合、外部のWHERE条件をHAVING条件として派生テーブルにプッシュダウンできます。派生テーブルがウィンドウ関数を使用し、外側のWHEREがウィンドウ関数のPARTITION句で使用される列を参照している場合、WHERE条件もプッシュダウンできます。

 この最適化は、UNION句またはLIMIT句を含む派生テーブルには使用できません。

 派生条件のプッシュダウンを有効にするためには、optimizer_switchシステム変数のderivated_condition_pushdownフラグ(このリリースで追加)をオンに設定する必要があります。これはデフォルト設定です。この最適化がオプティマイザースイッチの設定によって無効になっている場合、DERIVED_CONDITION_PUSHDOWNオプティマイザーヒント(このリリースで追加)を使用して、特定のクエリに対してこの最適化を有効にできます。特定のクエリの最適化を無効にするためには、NO_DERIVED_CONDITION_PUSHDOWNオプティマイザーヒントを使用します。

 (バグ #59870、バグ #88381、バグ #11766303、バグ #27590273)

■ パッケージ関連

● RPMパッケージとDebianパッケージの場合、クライアント側のプラグインはその独自のクライアントプラグインパッケージに移動されました。(バグ #31584093)

● Boostとの名前の競合により、MySQLソースディストリビューションのVERSIONファイルの名前は現在MYSQL_VERSIONになりました。(バグ #31466846)

● systemdを使用してMySQLを実行するプラットフォームの場合、パッケージにレガシーSystemVファイル(mysqld_multi.serverスクリプト、mysql.serverスクリプト、および、mysql.server.1マニュアルページ、mysqld_multi.1マニュアルページ、mysqld_safe.1マニュアルページ)が含まれなくなりました。(バグ #31450888)

■ パフォーマンススキーマ関連

● SHOW PROCESSLISTステートメントは、全てのアクティブなスレッドからスレッドデータを収集することによってプロセス情報を提供します。ただし、実装はグローバルミューテックスを保持しながらスレッドマネージャー内からアクティブなスレッド間で繰り返されるため、特にビジー状態のシステムでは、パフォーマンスに悪影響を及ぼします。

 新しいパフォーマンススキーマプロセスリストテーブルに基づいて、代替のSHOW PROCESSLISTの実装が利用可能になりました。この実装は、スレッドマネージャーではなくパフォーマンススキーマからアクティブなスレッドデータに問い合わせを行い、ミューテックスを必要としません:

  ・代替実装を有効にするためには、performance_schema_show_processlistシステム変数を有効にします。

  ・SHOW PROCESSLISTの代替実装は、mysqladmin processlistコマンドにも適用されます。

  ・代替実装は、MySQLクライアント/サーバープロトコルのINFORMATION_SCHEMA PROCESSLISTテーブルまたはCOM_PROCESS_INFOコマンドには適用されません。

  ・デフォルト実装と代替実装で同じ情報が得られるようにするためには、特定の設定要件を満たす必要があります。

● MySQLサーバーのエラーログに書き込まれた最新のイベントへのSQLインターフェイスが、新しいパフォーマンススキーマerror_logテーブルのクエリを用いて利用可能ようになりました。このテーブルは固定サイズで、新しいイベント用のスペースを確保するために古いイベントは必要に応じて自動的に破棄されます。エラーログ設定にこの機能をサポートするログシンクコンポーネント(現在、従来の形式のlog_sink_internalシンクおよびJSON形式のlog_sink_jsonシンク)が含まれている場合、このテーブルにデータが入力されます。いくつかの新しいステータス変数は、error_logテーブルの操作に関する情報を提供します。 

■ プラガブル認証

● これらの変更は、LDAP認証プラグインに対して行われました。

  ・SASL LDAP認証プラグインの場合、SCRAM-SHA-1認証方式は、ON SLES 12および15およびEL6システムではサポートされていません。これらのシステムのデフォルトメソッドは、現在GSSAPIです。

  ・LDAPホストが設定されていない場合、LDAP接続プールは初期化されません。そのため、以前失敗したケースで、認証プラグインを正常にインストールできます。(これは、サイトが最初にプラグインをインストールし、後でそれを設定する場合に当てはまる可能性があります。)

  ・LDAP接続パラメーターが実行時に変更された場合、LDAP接続プールは、その後の最初の認証試行のために再初期化されます。

  ・LDAPサーバーを再起動すると、接続プール内の既存の接続が無効になります。LDAP認証プラグインはこのケースを検出し、接続プールを再初期化し、(SASL LDAPプラグインの場合)SASLチャレンジが再送信されます。

 (バグ #31664270、バグ #31219323)

■ SQL構文関連

● パーサーは、次の構文を使用して括弧で囲まれたクエリ式をサポートするようになりました。

  ( query_expression )
    [order_by_clause]
    [limit_clause]
    [into_clause]

 他のバリエーションも可能です。(バグ #30592703)

● CAST()関数またはCONVERT()関数のいずれかを使用して、他のタイプの値をYEARにキャストできるようになりました。これらの関数は、現在、0?99の範囲の1桁または2桁のYEAR値、および、1901?2155の範囲の4桁の値をサポートしています。整数0は0年に変換されます。1つ以上のゼロで構成される文字列(可能な切り捨てに続く)は、2000年に変換されます。キャストにより、1?69の範囲の値には2000が追加され、70?99の範囲の値には1900が追加されます。

 1桁、2桁、または4桁で始まり、その後に少なくとも1つの非数字文字(および場合によっては他の数字文字または非数字文字)が続く文字列は、YEARに変換される前に切り捨てられます。このような場合、サーバーは切り捨て警告を発行します。浮動小数点値は変換前に四捨五入されます。CAST(1944.5 AS YEAR)は、四捨五入によって1945を返し、CASTCAST("1944.5" AS YEAR)は切り捨てによって(警告付きで)1944を返します。

 DATE、DATETIME、およびTIMESTAMPは、値のYEAR部分にキャストされます。TIME値は現在の年にキャストされます。キャストされる値をTIME値として指定しないと、予想とは異なる結果が生じる可能性があります。CAST("13:47" AS YEAR)は、文字列値の切り捨てにより2013を返し、CAST(TIME "13:47" AS YEAR)は、このリリースの年の時点で2020を返します。

 GEOMETRY値のYEARへのキャストはサポートされていません。互換性のないタイプ、範囲外、または不正な値のキャストはNULLを返します。

 YEARは、JSON_VALUE()関数の戻り値のタイプとしても使用できます。この関数は4桁の年のみをサポートし、それ以外はYEARへのキャストを実行する時にCAST()およびCONVERT()に適用されるのと同じ規則に従います。

● TIMESTAMP列の値を選択する時、このリリースのCAST()関数に実装されているAT TIME ZONE演算子を使用して、その取得時にシステムのタイムゾーンからUTC DATETIMEにそれを変換できるようになりました。

 構文は、CAST(値 AT TIME ZONE 指定子 AS DATETIME[(精度)])です。ここで、値はTIMESTAMPであり、指定子は[INTERVAL] '+00:00'または'UTC'のいずれかです。(INTERVALは、指定子の最初の形式ではオプションであり、'UTC'と共に使用できません。)キャストによって返されるDATETIME値の精度は、オプションで小数点以下6桁まで指定できます。

 タイムゾーンオフセットを使用してテーブルに挿入された値もサポートされています。

 AT TIME ZONEは、CONVERT()と共に使用したり、CAST()関数呼び出しの一部として以外のコンテキストで使用したりすることはできません。AT TIME ZONEを使用する時、ARRAYキーワードと複数値インデックスの作成もサポートされません。

 簡単な例を次に示します。

  mysql> SELECT @@system_time_zone;
  +--------------------+
  | @@system_time_zone |
  +--------------------+
  | EDT                |
  +--------------------+
  1 row in set (0.00 sec)

  mysql> CREATE TABLE ex (ts TIMESTAMP);
  Query OK, 0 rows affected (0.81 sec)

  mysql> INSERT INTO ex VALUES
       >     ROW(CURRENT_TIMESTAMP),
       >     ROW('2020-07-31 21:44:30-08:00');
  Query OK, 2 rows affected (0.09 sec)
  Records: 2  Duplicates: 0  Warnings: 0

  mysql> TABLE ex;
  +---------------------+
  | ts                  |
  +---------------------+
  | 2020-07-28 21:39:31 |
  | 2020-08-01 01:44:30 |
  +---------------------+
  2 rows in set (0.00 sec)

  mysql> SELECT ts, CAST(ts AT TIME ZONE 'UTC' AS DATETIME) AS ut FROM ex;
  +---------------------+---------------------+
  | ts                  | ut                  |
  +---------------------+---------------------+
  | 2020-07-28 21:39:31 | 2020-07-29 01:39:31 |
  | 2020-08-01 01:44:30 | 2020-08-01 05:44:30 |
  +---------------------+---------------------+
  2 rows in set (0.00 sec)

■ Xプラグイン関連

● 特定の条件では、Xプロトコル接続を終了すると、MySQLサーバーが予期せず停止する可能性があります。(バグ #31671503)

■ 追加・変更された機能

● hypergraph_optimizerオプティマイザースイッチを追加しました。このスイッチはデフォルトでオフになっており、デバッグビルドでのみ有効にできます。

 hypergraph_optimizerは実験的なものであり、MySQLの内部テストにのみ使用することを目的としています。標準のMySQLリリースでそれを有効にしようとすると、エラーで拒否されます。(バグ #31420895)

● ビューのLOCK TABLES権限チェックが改善されました。(バグ #31304432)

● MySQLサーバーの新しい非同期接続フェイルオーバーメカニズムを使用して、レプリカからそのソースへの既存の接続が失敗した後、新しいソースへの非同期(ソースからレプリカへの)レプリケーション接続を自動的に確立できます。ソースの停止またはネットワーク障害が原因でレプリケーションI/Oスレッドが停止した場合、接続はフェイルオーバーします。非同期接続フェイルオーバーメカニズムは、グループレプリケーションが使用されているサーバーからの非同期レプリケーションを含め、データを共有する複数のMySQLサーバーまたはサーバーのグループとレプリカを同期させておくために使用できます。レプリケーションチャネルの非同期接続フェイルオーバーをアクティブにするためには、チャネルのCHANGE MASTER TOステートメントでSOURCE_CONNECTION_AUTO_FAILOVER=1を設定し、asynchronous_connection_failover_add_source UDFとasynchronous_connection_failover_delete_source UDFを使用してチャネルのソースリストを設定します。

● 新しいinnodb_extend_and_initialize変数を使用すると、InnoDBがLinux上のfile-per-tableテーブルスペースと一般的なテーブルスペースにスペースを割り当てる方法を設定できます。デフォルトでは、操作がテーブルスペースに追加のスペースを必要とする場合、InnoDBはそのテーブルスペースにページを割り当て、それらのページに物理的にNULLを書き込みます。新しいページが頻繁に割り当てられる場合、この動作はパフォーマンスに影響します。MySQL 8.0.22以降では、Linuxシステムでinnodb_extend_and_initializeを無効にして、新しく割り当てられたテーブルスペースページに物理的にNULLを書き込まないようにすることができます。innodb_extend_and_initializeが無効になっている場合、スペースはposix_fallocate()呼び出しを使用して割り当てられます。この呼び出しは、物理的にNULLを書き込まずにスペースを予約します。

 posix_fallocate()操作はアトミックではないため、テーブルスペースファイルへのスペースの割り当てとファイルメタデータの更新の間にエラーが発生する可能性があります。このようなエラーにより、新しく割り当てられたページが初期化されていない状態のままになり、InnoDBがそれらのページにアクセスしようとした時に失敗する可能性があります。このシナリオを防ぐために、InnoDBは新しいテーブルスペースページを割り当てる前にREDOログレコードを書き込みます。ページ割り当て操作が中断された場合、その操作はリカバリ中にREDOログレコードから再実行されます。

● MySQLの付与テーブルでのDML操作とDDL操作の同時実行を許可するために、以前MySQLの付与テーブルで行ロックを取得した読み取り操作は、現在は、非ロック読み取りとして実行されるようになりました。MySQLの付与テーブルで非ロック読み取りとして実行されるようになった操作は次のとおりです。

  ・任意のトランザクション分離レベルを使用する、SELECT ... FOR SHAREステートメントを含む、結合リストおよびサブクエリを介して付与テーブルからデータを読み取るSELECTステートメントおよびその他の読み取り専用ステートメント。

  ・トランザクション分離レベルを使用する、(結合リストまたはサブクエリを介して)付与テーブルからデータを読み取るがそれらを変更しないDML操作。

 付与テーブルからデータを読み取る時に行ロックを取得しなくなったステートメントは、ステートメントベースのレプリケーションの使用中に実行されると警告を報告します。

 -binlog_format=mixedの使用時、付与テーブルからデータを読み取るDML操作が行イベントとしてバイナリログに書き込まれるようになり、その操作は混合モードレプリケーションに対して安全になりました。

 付与テーブルからデータを読み取るSELECT ... FOR SHAREステートメントは、警告を報告するようになりました。FOR SHARE句を使用する場合、読み取りロックは付与テーブルではサポートされません。

 付与テーブルからデータを読み取り、SERIALIZABLE分離レベルを使用して実行されるDML操作は、警告を報告するようになりました。SERIALIZABLE分離レベルの使用時に通常取得される読み取りロックが付与テーブルではサポートされません。

● MySQL 8.0.22から、group_replication_ip_whitelistシステム変数は非推奨になり、システム変数group_replication_ip_allowlistが追加され、それに置き換えられました。このシステム変数は以前と同じように機能し、用語のみが変更されました。

 両方のシステム変数について、デフォルト値はAUTOMATICです。このシステム変数のいずれかがユーザー定義値に設定されていて、もう一方が設定されていない場合は、変更された値が使用されます。両方のシステム変数がユーザー定義の値に設定されている場合は、group_replication_ip_allowlistの値が使用されます。

● From MySQL 8.0.22, the statements START SLAVE, STOP SLAVE, SHOW SLAVE STATUS, SHOW SLAVE HOSTS and RESET SLAVE are deprecated. The following aliases should be used instead:
MySQL 8.0.22以降、ステートメントSTART SLAVE、STOP SLAVE、SHOW SLAVE STATUS、SHOW SLAVE HOSTS、RESET SLAVEは非推奨になりました。代わりに、次のエイリアスを使用する必要があります。

  ・START SLAVEの代わりに、START REPLICAを使用
  ・STOP SLAVEの代わりに、STOP REPLICAを使用
  ・SHOW SLAVE STATUSの代わりに、SHOW REPLICA STATUSを使用
  ・SHOW SLAVE HOSTSの代わりに、SHOW REPLICASを使用
  ・RESET SLAVEの代わりに、RESET REPLICAを使用

 ステートメントは以前と同じように機能し、各ステートメントに使用される用語とその出力のみが変更されました。

 関連するステータス変数のエイリアスとして、新しいステータス変数が追加されました。ステートメントの古いバージョンと新しいバージョンの両方が、これらのステータス変数の古いバージョンと新しいバージョンの両方を更新します。

  ・Com_slave_startは、Com_replica_startと同等
  ・Com_slave_stopは、Com_replica_stopと同等
  ・Com_show_slave_statusは、Com_show_replica_statusと同等
  ・Com_show_slave_hostsは、Com_show_replicasと同等

● ALTER DATABASEステートメントは、データベースとその中のオブジェクトの変更を許可するかどうかを制御するREAD ONLYオプションをサポートするようになりました。このオプションは、データベースの移行に役立ちます。なぜなら、READ ONLYが有効になっているデータベースを、データベースが操作中に変更される可能性を懸念することなく、別のMySQLインスタンスに移行できるためです。

 SCHEMATA_EXTENSIONSという名前の新しいINFORMATION_SCHEMAテーブルは、データベースオプションを表示します。現在、読み取り専用データベースの場合はREAD ONLY=1と表示されます。

■ 主なバグ修正

● InnoDB:テストの失敗の原因となった関連するアサーションコードを含む、ヒストグラムサンプリングのトランザクションサポートに関連するコードが削除されました。トランザクションサポートはヒストグラムサンプリングには必要ありません。(バグ #31787736)

● InnoDB:暗号化情報は、REDOログアーカイブログライタースレッドの書き込み操作に関して設定されていませんでした。(バグ #31690196)

● InnoDB:TTASEventMutex::exit関数は、ARM64用に最適化されました。

 (バグ #31589019、バグ #100132)

● InnoDB:InnoDBは、DISABLE_PSI_RWLOCK CMakeオプションが有効な状態で、コンパイルに失敗しました。(バグ #31578289)

● InnoDB:古いレコードバージョンの不要なルックアップを回避するためにヒストグラムサンプリングでREAD UNCOMMITTEDに設定されているトランザクション分離レベルは、サンプリング操作の完了後にリセットされませんでした。(バグ #31564407)

● InnoDB:内部一時テーブルのクラスター化インデックスを更新したクエリが誤った結果を返しました。クラスタ化インデックスの変更されたページはフラッシュリストに追加されなかったため、変更されたページがバッファプールから削除された時に変更が失われました。(バグ #31560679)

 参照:この問題は、バグ #29207450のリグレッションです。

● InnoDB:TempTableストレージエンジン用に定義されたBoostライブラリへのビルド依存関係が削除されました。(バグ #31505048)

● InnoDB:32ビットのビルドでClangコンパイラの問題を処理するために、回避策が実装されました。これにより、ATOMIC_LLONG_LOCK_FREE値が“sometimes lock-free”として定義され、__atomic_always_lock_freeは同じプラットフォーム上の同じタイプに対してtrueを返します。(バグ #31504609)

● InnoDB:以前のバージョンのMySQLで作成されたREDUNDANT行フォーマットテーブルでは、行フォーマットが明示的に定義されていなかったため、REDUNDANT行フォーマットのインデックスの列サイズ制限を超えるインデックスを追加できました。(バグ #31479542、バグ #99791)

● InnoDB:複数値のインデックスで定義された列に対するDML操作が失敗を引き起こしました。(バグ #31479282)

● InnoDB:マスターキーローテーション中にエラーが発生しました。UNDOテーブルスペースのメモリ内オブジェクトが途中で解放されました。(バグ #31467626)

● InnoDB:未使用の物理先読みコードが並列読み取りインターフェースから削除されました。(バグ #31429385)

● InnoDB:マスターキーローテーション操作で、すでに切り捨てられているUNDOテーブルスペースをスキップできませんでした。これにより、サーバーのシャットダウン時にアサーションエラーが発生しました。(バグ #31400195)

● InnoDB:ページ圧縮テーブルのテーブルスペースをインポートした後、ページは圧縮されなくなり、INFORMATION_SCHEMA.INNODB_TABLESPACESメタデータはページが圧縮されていると誤って示しました。テーブルの圧縮情報はインポート操作中に使用できませんでした。(バグ #31396947)

● InnoDB:インスタントDDL操作を実行した後のロールバックと更新操作でアサーションが発生しました。(バグ #31391126)

● InnoDB:ログシステム(log_sys)のシャード読み取り/書き込みロックにより、CPUバウンドワークロードのパフォーマンスが低下しました。(バグ #31389135)

● InnoDB:UNIV_ENCRYPT_DEBUGオプションを有効にしてコンパイルすると、コンパイルエラーが発生しました。(バグ #31369540)

● InnoDB:パーティション分割されたテーブルに対するDDL操作は失敗を引き起こす可能性があります。TABLE_SHAREおよびテーブルインスタンスオブジェクトが、全てのパーティションに対して不必要に開かれました。(バグ #31365127)

● InnoDB:インプレースのALTER TABLE操作でVARCHAR列の照合順序をutf8mb4からutf8mb4_binに変更し、同じ列にインデックスを追加した後、VARCHAR列に対する大文字と小文字を区別するクエリが誤った結果を返しました。VARCHAR列の照合順序はデータディクショナリで変更されましたが、メモリ内テーブルオブジェクトでは変更されませんでした。その結果、VARCHAR列に対して作成されたインデックスは古い列情報を使用していたため、比較は以前に定義された照合順序を使用しました。(バグ #31361838)

● InnoDB:暗号化され圧縮された大きなテーブルでのALTER TABLE ... IMPORT TABLESPACE操作が失敗し、ディスクからの読み取りエラー後にページの解凍に失敗しました。復号化操作では、暗号化中に使用された暗号化ブロックサイズは使用されませんでした。また、暗号化プロセスは圧縮された長さを考慮しませんでしたが、復号化プロセスは圧縮された長さのみでデータを復号化します。(バグ #31313533)

● InnoDB:同時更新操作中に失敗が発生しました。失敗は、無効な以前のレコード値が原因でした。(バグ #31205266、バグ #99286)

● InnoDB:MySQL 5.7からMySQL 8.0へのアップグレードは、一般的なテーブルスペースで作成され、FULLTEXTインデックスで定義されたテーブルを持つインスタンスで失敗しました。テーブルの正しいデータディクショナリスペースIDが判別できませんでした。(バグ #31154128、バグ #99211)

● InnoDB:SHOW ENGINE INNODB MUTEXステートメントの処理に使用される関数は、新しいミューテックスを同時に追加する他のスレッドから十分に分離されませんでした。(バグ #31105262)

● InnoDB:バッファプールページI/O完了ルーチンの呼び出しに失敗すると、孤立したバッファプールI/O書き込みページが発生しました。(バグ #31073853)

● InnoDB:バッファープールフラッシュリストの末尾にある多数のシステム一時テーブルページにより、パフォーマンスが低下しました。flush_list_mutexは、フラッシュリストスキャンがシステムの一時テーブルページをトラバースしている間、保持されました。フラッシュリストスキャンは、システムの一時テーブルページを除外するようになりました。(バグ #31060470、バグ #98974)

● InnoDB:バッファー制御ブロック構造(buf_block_t)はバッファプールのサイズを縮小しながら解放され、これはアサーションエラーを引き起こします。このバグの修正は、バグ #20735882/バグ #76343の修正の重要な側面もバックポートし、内部のbuf_block_is_uncompressed()関数をbuf_pointer_is_block_field_instance()関数に置き換えます。buf_block_is_uncompressed()関数があまりにも多くのケースでfalseを返すため、OLTPクエリのスループットに影響を与えました。(バグ #31036301、バグ #31389823)

● InnoDB:並列読み取りスレッドが明示的なトランザクションの中断に応答できませんでした。(バグ #31016076)

● InnoDB:START TRANSACTION WITH CONSISTENT SNAPSHOTで開始されたセッションで、範囲クエリが切り捨てられた結果を返しました。インデックス読み取りの開始時に範囲終了フラグがリセットされなかったため、読み取りが中止され、行が欠落していました。(バグ #30950714、バグ #98642)

 参照:この問題は、バグ #23481444のリグレッションです。

● InnoDB:フルテキストフレーズ検索でアサーションエラーが発生しました。

 (バグ #30933728、バグ #31228694)

 参照:この問題は、バグ #22709692のリグレッションです。

● InnoDB:rawディスクパーティションのシステムテーブルスペースを初期化しようとした時にエラーが発生しました。さらに、rawディスクパーティションテーブルスペースでのINPLACE DDL操作は、COPYアルゴリズムに切り替える代わりに、エラーで失敗しました。(バグ #30867065、バグ #98091)

● InnoDB:LOBパージコード(lob :: purge())は、Bツリーミニトランザクション(btr_mtr)のコミットおよび復元操作中に取得されたラッチを適切に処理しませんでした。そのため、BツリーとLOBミニトランザクションの間で競合が発生する可能性がありました。(バグ #30620011)

● InnoDB:大きなテーブルで長時間実行されている統計計算操作が、テーブルの統計へのアクセスを必要とする他の操作をブロックし、それらの操作の失敗を引き起こしました。同時アクセステーブル統計を可能にする新しい統計計算ミューテックスが導入されました。(バグ #30607708)

● InnoDB:2つの接続が同じトランザクションハンドラーオブジェクトを使用しようとしたため、クエリが停止しました。(バグ #30594501)

● InnoDB:innodb_fast_shutdown設定が0より大きいサーバーをシャットダウンすると、アサーションエラーが発生しました。アサーションは、まだロールバックされていない回復されたトランザクションの存在によって引き起こされました。アサーションコードは、高速シャットダウン中は回復されたトランザクションを無視するように改訂されました。ロールバックされていない回復されたトランザクションが高速シャットダウンによって残された場合に、メッセージがエラーログに書き込まれるようになりました。低速シャットダウンは、回復されたトランザクションがロールバックされるのを待つようになりました。他の様々なシャットダウンロジックの改善が実装されました。(バグ#30226841)

● InnoDB:MySQL 8.0.11で導入された専用のログライタースレッドにより、同時実行性の低いシステムでCPUバウンドのパフォーマンスが低下しました。この問題に対処するために、新しいinnodb_log_writer_threads変数は専用のログライタースレッドの無効化を許可します。これにより、REDOログレコードはログバッファからシステムバッファに書き込まれ、各ユーザースレッドによってシステムバッファからREDOログファイルにフラッシュされます。これは、専用のログライタースレッドが導入される前の動作です。CPU時間を浪費した不要なログクローザースレッドの削除や、攻撃的なチェックポイントアクティビティや過度のフラッシュ呼び出しを修正するための最適化を含む、その他のREDOロギングの最適化が実装されました。この修正によって対処された問題は、LOAD DATAのパフォーマンスの低下にも現れました。(バグ #30088404、バグ #30003849)

● InnoDB:障害が発生した後、誤ったlower_case_table_names設定でサーバーを再起動すると、ハング状態が発生しました。起動時に、InnoDBはトランザクションがロールバックするのを待機しましたが、lower_case_table_names設定が正しくないために起動検証が失敗したため、ロールバックスレッドは開始されませんでした。(バグ #29833945)

● レプリケーション:新しいXプロトコル接続が確立された後、セッションが作成される前に、グループレプリケーション通知が発行された場合、Xプラグインが予期せず停止する可能性がありました。グループレプリケーション通知を処理するディスパッチャスレッドは、セッションポインタが有効であることを確認するようになりました。(バグ #31742798)

● レプリケーション:トランザクション書き込みセットを追加する時のメモリ割り当ての問題のグループレプリケーションの処理が改善されました。(バグ #31586243)

● レプリケーション:以前は許可されていなかった、ストアドプロシージャのgtid_purgedシステム変数の値を設定できるようになりました。ストアド関数でgtid_purgedを設定することはできません。(バグ #31571427)

● レプリケーション:リモートクローニング手順が分散リカバリ中に参加メンバーに対して実行されている間、グループレプリケーションは、全てのメンバーに適用されたトランザクションの共通セットを識別する時に、参加メンバーの事前クローンニングgtid_executed値を考慮しました。これは、グループの認証情報のセット(パフォーマンススキーマテーブルreplication_group_member_statsのcount_transactions_rows_validatingフィールドとして表示)からの適用されたトランザクションのガベージコレクションが、リモートクローニング手順中に行われなかったことを意味します。リモートクローニング手順に時間がかかると、認証情報が大きくなりすぎて、リモートクローニング手順の後で再起動した時に参加メンバーに送信できなくなる可能性がありました。その場合、エラーが発生し、メンバーはグループに参加できませんでした。

 この問題を回避するために、グループレプリケーションでは、全てのメンバーに適用されているトランザクションの共通セットを識別する時に、ONLINEステータスのグループメンバーのみが考慮されるようになりました。参加メンバーが分散リカバリ後にONLINE状態になると、その認証情報はそのメンバーが参加した時のドナーからの認証情報で更新され、ガベージコレクションは今後のラウンドではこれのために行われます。

 以前のリリースでのこの問題の回避策として、グループの認証情報のサイズを縮小するためにガベージコレクションのラウンドが行われるまで2分間待ちます。その後、参加メンバーに対して次のステートメントを発行して、以前の認証情報のセットの適用を停止します。

  RESET SLAVE FOR CHANNEL group_replication_recovery;

 (バグ #31446381、バグ #99778)

● レプリケーション:通信エラーのためにグループを離れたグループメンバーが、自動再結合手順の進行中に自動再結合の試行間で再接続する可能性があり、その結果、グループレプリケーションがそのメンバーで機能できなくなりました。この状況を防ぐために、グループレプリケーションのエラー管理とメンバーステータスの処理が修正されました。(バグ #31401797)

● レプリケーション:レプリケーションソースサーバーがシャットダウンして再起動すると、そのMEMORYテーブルは空になります。この効果をレプリカに複製するために、ソースが起動後に特定のMEMORYテーブルを初めて使用する時に、バイナリログにその効果のステートメントを書き込むことによってテーブルを空にする必要があることをレプリカに通知するイベントをログに記録します。以前は、これはDELETEステートメントでしたが、現在は、TRUNCATE TABLEステートメントです。レプリカサーバーは、シャットダウンし再起動する時に、このステートメントを独自のバイナリログにも書き込みます。そのステートメントは、バイナリロギング形式がROWに設定されている場合でも常にステートメント形式でログに記録され、サーバーでread_onlyまたはsuper_read_onlyモードが設定されている場合でも書き込まれます。(バグ #29848785、バグ #95496)

● レプリケーション:マルチスレッドレプリカでシステム変数session_track_gtidsがOWN_GTIDに設定されている場合、レプリカのパフォーマンスは時間の経過とともに低下し、マスターより遅れ始めました。その原因は、トランザクションのコミットごとにレプリカのワーカースレッドによって記録されたGTIDの蓄積でした。これにより、ワーカースレッドが新しいスレッドを挿入するのにかかる時間が長くなりました。セッション状態追跡は、マルチスレッドレプリカのワーカースレッドに関して無効になりました。(バグ #29049207、バグ #92964)

● レプリケーション:行ベースのレプリケーションを使用する場合、レプリカは、同期する行を検索する時に非表示のインデックスを使用できました。(バグ #96148、バグ #30072179)

● Microsoft Windows:Windowsでは、ビルドがR:/のようなファイルシステムルート上にある場合、ビルドターゲットが失敗する可能性がありました。(バグ #31315467)

● JSON:JSON_ARRAYAGG()は、常に適切なエラー処理を実行するとは限りませんでした。(バグ #31856260)

● JSON:JSON_OBJECT()は、常にNULL値の適切なチェックを実行するとは限りませんでした。(バグ #31393934)

● 新しいWITH_SYSTEMD_DEBUG CMakeオプションは、有効な場合、systemdがMySQLを実行するために使用されているプラットフォーム用に、追加のsystemdデバッグ情報を生成します。デフォルトはOFFです。(バグ #31788834)

● RPMパッケージおよびDebianパッケージに関して、クライアント側プラグインはMySQL 8.0.21のサーバーパッケージからクライアントパッケージに移動されました。これにより、5.7パッケージから8.0パッケージにアップグレードする時に、LDAP認証プラグインに関連する障害が発生する可能性があります。この問題を回避するために、パッケージの調整が行われました。(バグ #31782612)

 参照:この問題は、バグ #31123564、バグ #31336340のリグレッションです。

● log_sink_json JSON形式のエラーログシンクによってtsキーに書き込まれたタイムスタンプは、同じログメッセージ内の他のタイムスタンプと同じ値を持ちませんでした。(バグ #31749103)

● SASL LDAP認証プラグインのKerberos認証は、Ticket-granting Ticketの取得の失敗を誤って処理しました。(バグ #31727195)

● 一部のサードパーティライブラリでは、リンク時の最適化を有効にするとビルドが失敗しました。(バグ #31701553、バグ #100410)

● 過度に長い診断メッセージを出力すると、サーバーが予期せず終了する可能性がありました。(バグ #31686926)

● ページ圧縮されたテーブルは、非圧縮テーブルとしてクローン化されました。圧縮フラグを含め、関連するテーブルスペースオブジェクトは、クローニング操作の前に初期化されませんでした。(バグ #31677990、バグ #100243)

● LDAP認証が成功する特定のケースで、サーバーがハングする可能性がありました。(バグ #31661437)

● グループ化されたクエリの派生テーブルへの変換中、WHERE句とHAVING句がその派生テーブルの一部になった時に、その派生テーブルの条件カウントが更新されませんでした。これにより、参照アクセス用のキーを作成する際のメモリ割り当てが削減されました。(バグ #31661309)

● 値が、MySQL文字列タイプの1つとして定義されていないテーブル列とLIKEを使用して比較された場合、サーバーが期待されるエラーを発生させないことがありました。(バグ #31659015)

● acquire_related()サービス関数がエラーを返すはずの時にデフォルトサービスを返した場合がありました。(バグ #31655906)

● ブートストラップモードでは、特定のマルチステートメントトランザクションが予期しないサーバー動作を引き起こす可能性がありました。(バグ #31650096)

● リモートクローニング操作は、以前にドナーインスタンスから削除された受信者のプラグインの可用性をチェックしました。アンインストールされたプラグインへの参照はリリースされていませんでした。プラグインの不一致と可用性に関連するエラー報告の問題も解決されました。(バグ #31639732、バグ #100244)

● MySQL Server Dockerイメージは、グループレプリケーションの推奨ポート(33061)を公開しませんでした。(バグ #31627536)

● デバッグビルドでは、サーバーはビューの作成中にサブクエリを評価しようとしました。(バグ #31590301)

 参照:この問題は、バグ #25466100のリグレッションです。

● RAND()を使用する条件は、プッシュダウンするのが安全な場合、つまりウィンドウ関数またはGROUPBYが使用されていない場合でも、プッシュダウンされませんでした。(バグ #31587575)

● 条件を派生テーブルにプッシュダウンしている時に、WHERE FALSEやWHERE TRUEのような定数条件は派生テーブルの最初のテーブルにプッシュダウンされました。これは、条件が派生テーブルとは何の関係もないため、必要ありません。MySQLは、このような場合に定数条件を派生テーブルにプッシュすることを回避するようになりました。

 さらに、コード検査によって、条件内の列を派生テーブル式に置き換えた後にこれが行われなかったことが明らかになった後、派生テーブルにプッシュダウンされる必要がある条件に対して、使用済みテーブルが更新されるようになりました。(バグ #31587493)

● WHERE 列 > (... IN (SELECT ...))を使用したクエリは、範囲オプティマイザでアサーションをトリガーする可能性がありました。(バグ #31586906)

 参照:この問題は、バグ #30473261のリグレッションです。

● 行の存在の確認から挿入の実行までの間に行が挿入され、統計テーブルが同時に更新された場合、ANALYZETABLEが重複キーエラーで失敗する可能性がありました。ANALYZE TABLEは、この状況でエラーを無視するようになりました。(バグ #31582758)

● 範囲オプティマイザは、マージされたスキャンの実行に必要なハンドラのクローンを作成した後、正しいロックタイプを使用せず、代わりに無条件に読み取りロックを使用しました。これにより、様々なシナリオで様々な副作用が発生しました。

 例えば、FOR UPDATEを指定したSELECTは書き込みロックを要求しますが、インデックスマージスキャンのハンドラのクローンを作成した後、範囲オプティマイザが読み取りロックを要求したため、不一致が発生しました。同様に、データディクショナリテーブルの場合、そのようなテーブルには特別な処理が必要とされるため、ロックタイプはLOCK_NONEに設定されました。

 この問題の発生を防ぐために、ハンドラの元のロックタイプがクローンハンドラでも常に使用されるようになりました。(バグ #31582383)

● いくつかのケースで、subquery_to_derivedオプティマイザスイッチが有効になっていると、ANYサブクエリを使用したクエリで誤った結果が得られました。(バグ #31566339)

● FALSE AND条件がFALSEとして簡略化された場合、条件に割り当てられた一時テーブルリソースは、その後常に解放されるとは限りませんでした。(バグ #31565009)

● ULLONG_MAXに等しい値をBIT(64)列に挿入することは可能ですが、取得することができません。(バグ #31564742、バグ #100053)

● 未使用のウィンドウ定義を削除している時に、ORDER BYの一部であったサブクエリは削除されませんでした。その後、オプティマイザは、テーブルをロックせずにサブクエリを最適化しようとしました。現在は、未使用のウィンドウ定義を削除する時に、サーバーは定義の一部として存在する全てのサブクエリをクリーンアップします。(バグ #31518806)

 参照:この問題は、バグ #27062031のリグレッションです。

● ICU U_REGEX_NUMBER_TOO_BIGからMySQL ER_REGEX_NUMBER_TOO_BIGへの欠落しているエラーコード変換を追加しました。(バグ #31514995)

● ファイルソート操作中にマージすると、DISTINCTを使用したクエリの重複を削除できない場合がありました。(バグ #31498664、バグ #99900)

● MySQLの内部DYNAMIC_STRINGクラスは、以前は線形に、つまりあらかじめ定められたバイト数で、メモリを割り当てました。そのクラスは、メモリを指数関数的に割り当てるように改訂されました。これにより、繰り返される文字列の追加などの操作がより効率的になるはずです。(バグ #31491799)

● LOCK_mutexの処理を誤ると、メモリリークが発生する可能性があります。(バグ #31491146)

● 新しく追加された照合順序が、シャットダウン時に追加されず、予期しない終了を引き起こす可能性がありました。(バグ #31470422)

● Windowsでは、GetTempFileName()関数によるファイル名の再利用により、アサーションが発生する可能性がありました。(バグ #31468590)

● LATERALサブクエリが誤ってアンチジョインに変換されました。(バグ #31465717)

● NATURAL JOIN評価は、機能インデックスによって作成された非表示の仮想列と誤って一致する場合がありました。(バグ #31463511、バグ #99807)

● 1024バイトを超える文字列ハッシュ結合キーのソートキーは、サーバーによって正しく処理されませんでした。(バグ #31437753)

● サーバーは、定義の一部としてHAVINGを使用するビューが更新可能であってはならない場合でも、HAVING句が定数であり、trueと評価された時に、サーバーは定義にHAVINGが含まれるビューから削除しようとしました。(バグ #31429865)

● INFORMATION_SCHEMA.USER_ATTRIBUTESテーブルの権限要件が正しくチェックされていませんでした。(バグ #31427410)

● 内部関数replace_index_subquery()が失敗した場合でも、サーバーは影響を受けるサブクエリのイテレータを作成しようとしました。現在、その関数は代わりに明確なエラーを発生させます。(バグ #31427072)

● WHERE NOT EXISTS (SELECT const FROM table WHERE column=FROM_UNIXTIME(value)を使用したクエリが正しく処理されませんでした。(バグ #31425664)

● いくつかのケースで、key_hintの処理が派生テーブルおよび内部一時テーブルに不適切に適用されました。(バグ #31424455)

● プリペアドINSERTステートメントの再実行は、ビューを介した挿入で失敗する可能性がありました。(バグ #31417951)

● JSONスカラー評価は無限ループに入る可能性がありました。(バグ #31406724)

● mysql.userテーブル行のuser_attributes列は、部分的な取り消しによって誤って影響を受ける可能性がありました。(バグ #31405985)

● ウィンドウ関数の不適切な初期化により、サーバーが終了する可能性がありました。(バグ #31389573、バグ #31437834)

● 機密性の高いLDAP認証プラグインのシステム変数は、SQLステートメントで取得された時にアスタリスクとして表示されるようになりました。(バグ #31388444、バグ #31391864)

● リソースグループの不適切な初期化により、スレッドなしの接続処理でのmysql-test-run.plテストがASANビルドで失敗しました。これは修正されました。(バグ #31378900、バグ #99609)

● SSLでauthentication_ldap_simple認証プラグインを使用すると、シャットダウン中にセグメンテーション違反が発生する可能性がありました。(バグ #31364927)

● クエリを強制終了すると、ハッシュ結合イテレータで誤ったアサーションが発生する可能性がありました。(バグ #31361354)

● いくつかのケースで、LATERALではない外部参照が期待どおりに読み取り専用としてマークされませんでした。(バグ #31359965)

● 孤立したイベント(データベースが存在しなくなったイベント)への無効な参照が原因で、MySQL 5.7からMySQL 8.0にアップグレードする時にエラーが発生しました。アップグレード中に孤立したイベントが発生すると、サーバーは適切なエラーメッセージを出して失敗するようになりました。孤立したストアドルーチンのエラーメッセージも改訂されました。(バグ #31335554)

● create_admin_listener_threadシステム変数を有効にすると、起動時にサーバーが終了する可能性がありました。(バグ #31335279)

● 列に式のデフォルトを追加するALTER TABLEの後、最初の挿入は、式が挿入時ではなく変更時に評価されたかのように値を挿入しました。(バグ #31330789、バグ #99513)

● LDAP認証プラグインは、ユーザー指定の認証方法を許可されている方法と適切に比較しませんでした。(バグ #31320532)

● 特定のビューにより、次のUSEステートメントが予期しないサーバー終了を引き起こす可能性がありました。(バグ #31311312)

● ファイルソートがバッファをソートし、LIMITがアクティブな場合、ファイルソートは最初に全ての行をソートし、次に制限内に収まらない行を破棄しました。これは、後で破棄されることが確実な多くの行をソートする必要がありました。現在、オプティマイザは実際に必要な行のみをソートします。この変更により、単純な文字列ソートのベンチマーク(EXPLAIN ANALYZEで測定)のソートフェーズを最大15%高速化できることが内部テストで示されています。(バグ #31303537)

● 動的範囲スキャンは、結合の最初のテーブルからフェッチされた各行に対して範囲オプティマイザを実行し、2番目のテーブルに対してその行から利用可能な値を使用して範囲スキャンを選択可能かどうかを判断します。行に使用可能なインデックスが含まれていない場合は、代わりにテーブルスキャンを選択できます。この問題を引き起こすクエリでは、テーブルスキャンが1回選択され、続いて非カバーインデックスに対して範囲スキャンが選択されます。そして、動的範囲イテレータには、これらの両方の場合に使用される2つの読み取りセットがあります。これらの1つ、テーブルスキャンに使用されるものには、クエリの処理に必要な生成された列の基本列が含まれます。もう一方の読み取りセットには、範囲スキャンに使用される読み取りセットの基本列は含まれていません。これは、カバーインデックスに関して、読み取りセットには、ハッシュ結合またはバッチキーアクセスによる不要な列の追加を回避するために基本列を含めるべきではないためです。この問題は、2番目の読み取りセットが非カバーインデックスにも使用されたために発生し、その結果、アサートが発生しました。

 この発生を回避するために、動的範囲イテレータでテーブル読み取りセットを初期化する時、範囲オプティマイザが非カバーインデックスを選択する時に確実に基本列が含まれるようにしました。(バグ #31280526)

 参照:この問題は、バグ #30417361のリグレッションです。

● タイムゾーンオフセットが含まれている場合、TIMESTAMPに範囲外の値を挿入することが可能でした。(バグ #31239157)

● keyring_hashicorpキーリングプラグインは、キー操作のキーのサイズを制限しませんでした。(バグ #31205715)

● 古いバージョンのzstdライブラリでは、-DWITH_ZSTD=systemを使用した設定に失敗しました。CMakeはzstdのバージョンをチェックするようになり、コンパイルには少なくとも1.0.0、圧縮チェックを実行するには1.2.0が必要です。(バグ #31174920、バグ #99241)

● パフォーマンススキーマテーブルからステータス変数情報を取得し、時間値を含む列によるソートを含むSELECTが正しく処理されない場合がありました。(バグ #31168097)

● ROUND()とTRUNCATE()が最初の引数のデータ型を期待どおりに返さない場合がありました。この修正により、これらの関数からの戻り値の型がこれらのルールに従うことが保証されます。最初の引数は次のような型です。

  ・整数型の場合、戻り値の型はBIGINTです。

  ・浮動小数点型または非数値型の場合、戻り値の型はDOUBLEです。

  ・DECIMALの場合、戻り値の型もDECIMALです。

  ・2番目の引数が定数値である時、DECIMALの場合を除いて、戻り値の型属性も最初の引数からコピーされます。

  ・希望する小数点以下の桁数が引数のスケールよりも小さい場合、結果のスケールと精度はそれに応じて調整されます。さらに、ROUND()関数の場合、精度は有効桁数を増やす四捨五入に対応するために1桁拡張されます。2番目の引数が負の場合、戻り値の型は、対応する精度を使用して、そのスケールが0になるように調整されます。

 (バグ #31128028)

● SELECT ... FOR SHAREステートメントは、SELECT権限のみを必要とするようになりました。以前は、SELECT権限は、DELETE、LOCK TABLES、UPDATE権限のうち少なくとも1つ必要でした。(バグ #31096384、バグ #99101)

● LIMIT句を持ち、最初の行以外の行を必要とする相関サブクエリの結合には、準結合戦略が選択されました。これにより、LIMIT句が無視され、無効な行が返されました。現在、このタイプの結合で使用されるLIMITが最初の行以外の行、または複数の行を指定する場合、準結合戦略は使用されなくなりました。(バグ #31096309)

● バグ #81009の修正後、read_onlyまたはsuper_read_onlyが有効になっている場合、パフォーマンススキーマテーブルの切り捨ての権限チェックが制限されすぎました。そのため、適切なテーブル権限を持つユーザーでも切り捨てが失敗しました。(バグ #31080309、バグ #99072)

 参照:この問題は、バグ #81009のリグレッションです。

● ウィンドウ関数も使用されているROLLUPを使用したクエリでは、ORDERBYが期待どおりに機能しませんでした。(バグ #31073133)

● 一部のINSERTステートメントが正しく処理されませんでした。(バグ #31072198)

● 日付間隔の計算では、オーバーフローはチェックされましたが、アンダーフローはチェックされませんでした。現在は、両方をチェックします。(バグ #31054071)

● REGEXP_LIKE()などの正規表現関数は、バイナリ文字列引数を使用して一貫性のない結果を生成しました。これらの関数は、エラーでバイナリ文字列を拒否するようになりました。(バグ #31031886、バグ #98951、バグ #31031888、バグ #98950)

● XAプリペアドトランザクションのロールバックXIDが不正にフォーマットされた場合、トランザクションはエラーを報告するのではなく、XA COMMITステートメントおよびXA ROLLBACKステートメントの回復状態のままでした(または、デバッグビルドのアサーションを発生させました)。(バグ #31030205)

● ロールを介して継承されたデータベースレベルの権限は、ワイルドカード文字を含むデータベース名に対して適切に処理されませんでした。(バグ #31013538、バグ #98876)

● --localオプションが指定された場合、mysqlimportはmysql_options()のMYSQL_OPT_LOAD_DATA_LOCAL_DIRオプションを誤って処理したため、その効果が全くありませんでした。(バグ #31001550)

● 特定のプリペアドステートメントは、予期しないサーバー終了を引き起こす可能性がありました。(バグ #30943963)

● MyISAMテーブルのOPTIMIZE TABLEにより、テーブルサイズが増加し、クエリのパフォーマンスが低下する可能性がありました。MyISAMテーブルのREPAIR TABLEを使用すると、テーブルが前のOPTIMIZETABLEによって生成された最新のステータスになっていることが失われる可能性がありました。(バグ #30869674、バグ #98511、バグ #29755517)

● mysqlpumpオブジェクトの検証には、除外されたデータベースのオブジェクトが含まれていました。(バグ #30819012)

● 月、日、またはその両方にゼロを持つタイムゾーンオフセットを持つTIMESTAMP値を挿入すると、アサートが発生しました。このような値は、sql_mode設定に関係なく、拒否されるべきで、拒否されるようになりました。(バグ #30786762)

 参照:バグ #31239157。

● TIME値をNULLと比較すると、アサーションが発生する場合がありました。(バグ #30324587)

 参照:この問題は、バグ #25949639のリグレッションです。

● LDAP認証プラグインがCA検証を誤って実施したため、誤ったCAが使用される可能性がありました。(バグ #30220357)

● sort_buffer_sizeとmax_sort_lengthが、ソートバッファごとに許可されるキーの最大数の内部制限が0に設定される原因となる値に設定されると、ORDER BYクエリが正しく実行されませんでした。(バグ #30175483)

● 全文検索クエリにネストされた引数が多数あると、エラーが発生しました。(バグ #29929684)

● パフォーマンススキーマによるメモリ使用の潜在的な誤報が修正されました。(バグ #29912403)

● explicit_defaults_for_timestampが無効になっていて、TIMESTAMP NOT NULLとして宣言された生成列にNULLが挿入された場合、サーバーは挿入された値をCURRENT_TIMESTAMPに変換しようとしました。このような挿入は、ER_BAD_NULL_ERRORで拒否されるようになりました。(バグ #29449518)

● SET_VARヒントは、システム変数設定として指定された浮動小数点値を受け入れませんでした。(バグ #29349748)

● 以前は、STR_TO_DATE()のフォーマット引数としてNULLが使用されていた場合、無関係な警告が出力されました。現在は、NULLがそれに渡されると、関数はNULLを返します。(バグ #27265863)

● IS NULLを誤って使用すると、無効な引数に関する複数の警告が生成される場合がありました。(バグ #27264652)

● 派生テーブルからSELECTリスト列を参照するORDER BY列の解決が、特定のプリペアドステートメントの実行時に正しく実行されませんでした。(バグ #26808862)

● 生成された列が条件で参照されているマルチテーブルUPDATEステートメントでEXPLAINを使用すると、テーブルが実際に更新されたかどうかに関係なく、出力には常にこの列を含むテーブルが更新されていると表示されました。(バグ #22671310)

● SQLレイヤーが一時テーブルで実行される操作のタイプに関する誤った情報をInnoDBに渡した場合、アサーションが発生する可能性がありました。(バグ #22503696)

● この構成は、基本テーブルが全てのデフォルト値を使用して行を挿入するために機能しますが、ビューでは失敗します。

  INSERT INTO name () VALUES ();

 (バグ #15988466、バグ #67863)

● use_invisible_indexesオプティマイザスイッチがOFFに設定されていなくても、非表示のインデックスがインデックスヒントで使用されていると、サーバーがエラーを発行する場合がありました。(バグ #100024、バグ #31550839)

● 更新可能な部分と更新可能ではない部分がある結合に基づくビューの場合、更新できなかったこのビューの列を更新しようとした時に生成されたエラーメッセージは、問題のあるUPDATEステートメントで実際に指定されたビューの代わりに、ソーステーブルまたはソースビューを参照しました。(バグ #80655、バグ #22891840)

全ての変更点やバグ修正については、以下のページをご覧ください。
MySQL 8.0.22 リリースノート(MySQLウェブサイト):
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-22.html

MySQL Editions

MySQL EditionsMySQLのサブスクリプションは、24時間365日体制でお客様をサポートいたします。さらに MySQL Enterprise Edition では、データベース管理者支援ツール MySQL Enterprise Monitor やバックアップツール MySQL Enterprise Backup をご利用いただけます。

MySQL Editionsの詳細