2018.11.27

MySQL

MySQL 5.7.24 GA版(リリース日:2018年10月22日)

主な変更点

■ 廃止予定と削除

・InnoDB; パーティショニング: 共有テーブルスペースへのテーブルパーティションの配置の
 サポートは廃止予定で、MySQLの将来のバージョンで削除される予定です。
 共有テーブルスペースには、システムテーブルスペースと一般的なテーブルスペースが
 含まれます。

・InnoDB: CREATE TEMPORARY TABLEと共に使用されるTABLESPACE = innodb_file_per_table
 およびTABLESPACE = innodb_temporary句のサポートは廃止予定で、MySQLの将来のバージョンで
 削除されます。

■ パッケージング関連

・システムcurlライブラリへのリンクではなくcurlを含むバイナリパッケージは、
 現在curl 7.45.0ではなくcurl 7.60.0を使用します。(Bug #28043702)

■ セキュリティ関連

・Microsoft Windows: Windowsでは、MySQL Enterprise Editionのディストリビューションに
 Cyrus SASLライブラリファイルlibsasl.dllとsaslSCRAM.dllがバンドルされており、
 LDAP認証プラグインがSCRAM-SHA-1認証メソッドを使用できるようになりました。

・MySQL Enterprise Editionは、プラグインと一連のユーザー定義関数を含む
 プラグインライブラリとして実装されたデータマスキングと非特定化の機能を
 提供するようになりました。
 データマスキングは、実際の値を代わりのものに置き換えることによって機密情報を隠します。
 MySQL Enterpriseのデータマスキングと非特定化の機能は、難読化(識別特性の削除)、
 フォーマットされたランダムデータの生成、および、データ置換または代用などの
 いくつかの方法を使用して、既存のデータをマスキングすることを可能にします。

 例:
  mysql> SET @ssn = gen_rnd_ssn();
  mysql> SET @masked_ssn1 = mask_ssn(@ssn);
  mysql> SET @masked_ssn2 = mask_outer(mask_inner (@ssn,4,5,'A'),3,0,'B');
  mysql> SELECT @ssn, @masked_ssn1, @masked_ssn2;
  +-------------+--------------+--------------+
  | @ssn        | @masked_ssn1 | @masked_ssn2 |
  +-------------+--------------+--------------+
  | 980-31-2838 | XXX-XX-2838  | BBB-AA-2838  |
  +-------------+--------------+--------------+

■ 追加・変更された機能

・以前は、mysysライブラリのI/Oキャッシュで実行されたファイルI/Oが計測されず、
 バイナリログインデックスファイルについてパフォーマンススキーマによって報告された
 ファイルI/O統計に特に影響していました。現在、このI/Oは計測されており、
 パフォーマンススキーマの統計は正確です。(Bug #27788907, Bug #90264)

・MySQLにバンドルされているzlibライブラリのバージョンは、バージョン1.2.3から
 バージョン1.2.11に上がりました。MySQLは、zlibライブラリを使用して圧縮を実装します。

 zlib 1.2.11のzlib compressBound()関数は、与えられた長さのバイトを圧縮するのに
 必要なバッファサイズを、zlibバージョン1.2.3よりも若干高い見積もりで返します。
 compressBound()関数は、InnoDB関数によって呼び出され、圧縮されたInnoDBテーブルを
 作成する時または圧縮されたInnoDBテーブルに行を挿入する時に許可される
 最大行サイズを決定します。その結果、以前のリリースで成功した最大行サイズに
 非常に近い行サイズのCREATE TABLE ... ROW_FORMAT=COMPRESSEDまたはINSERT操作が、
 現在失敗する可能性があります。

■ バグ修正

・InnoDB: プライマリーキーを追加するALTER TABLE操作でセグメント化エラーが発生しました。
 (Bug #28395278)

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

・InnoDB: テーブルのプライマリーキーをスキャンしたクエリは、期待した結果を
 返しませんでした。(Bug#28104394、Bug#91032)

・InnoDB: ロック待機中にクエリが中断し、エラーが発生しました。(Bug#28068293)

・InnoDB: 生成された列に定義されたセカンダリインデックスを更新する時に
 インデックスレコードが見つかりませんでした。(Bug#27968952)

・InnoDB: オンラインのALTER TABLE操作の一部として適用された更新ログは、
 セカンダリインデックスの更新中に古い行に生成された列の計算値を
 考慮されませんでした。(Bug#27921932)

・InnoDB: 外部キー制約を含むサポートされていないDDL操作がアサーションを
 引き起こしました。(Bug#27912873)

・InnoDB: 破棄されたテーブルの外部キーのチェックを試みると、セグメント化エラーが
 発生しました。(Bug#27804668)

・InnoDB:OPTIMIZE TABLE操作中にアサーションが発生しました。(Bug#27753193)

・InnoDB:テーブル名の変更操作中に外部キー制約名が重複し、その後のクエリ実行中に
 エラーが発生しました。(Bug#27545888)

・InnoDB:ストアドプロシージャ内のステートメントの実行前に呼び出された関数では、
 trx->lock.start_stmtの読み書き操作はmutexによって保護されませんでした。
 (Bug#27325898)

・InnoDB:オンラインログの長さを決定するREDUNDANT行フォーマットの計算での不一致が原因で、
 DDL操作中にエラーが発生しました。(Bug#26375771)

・InnoDB:wait/io/file/innodb/innodb_temp_fileパフォーマンススキーマインストゥルメント
 によって報告されたInnodb Merge Temp Fileの場所が正しくありませんでした。
 (Bug#21339079、Bug#77519)

・パーティショニング: 無効なパーティション定義が原因で
 CREATE TABLE ... PARTITION BY ...ステートメントが失敗した場合、
 サーバーは無効なPARTITION句に遭遇する前に作成された可能性のある
 パーティションファイルを削除しませんでした。(Bug #27798708)

 参照: 関連項目: Bug #88043、Bug #26945644.

・パーティショニング: innodb_file_per_table=1で作成されたパーティション化されたテーブルに
 対して、そのテーブルスペースを破棄した後に、FLUSH TABLES FOR EXPORTを実行することが
 できました。これを試みると、ER_TABLESPACE_DISCARDEDが発生します。
 (Bug #90545, Bug #27903881)

 参照: 関連項目: Bug #80669、Bug #22899690.

・レプリケーション: binlog_group_commit_sync_delayシステム変数が
 ディスクへのトランザクションの同期を遅らせるための待機時間に設定され、
 binlog_group_commit_sync_no_delay_countシステム変数もトランザクションの数に
 設定されている時、指定された待機時間に達する前に指定された数のトランザクションに
 達した場合、MySQLサーバーは待機プロシージャを終了します。サーバーは、
 binlog_group_commit_sync_delayで指定された時間の1/10のデルタが経過した後に
 トランザクション数をチェックし、残りの待機時間からその間隔を減算することによって、
 このプロセスを管理します。

 デルタの計算中の四捨五入が待機時間がデルタの倍数ではないことを意味した場合、
 残りの待機時間からデルタを最終減算すると、その値は負になり、最大待機時間にラップして、
 コミットがハングします。この状況で値がラップしないように、残りの待機時間のデータ型が
 変更され、元の待機時間が経過するとコミットが続行されます。(Bug #28091735, Bug #91055)

・レプリケーション: MySQLサーバーがGTIDの整合性違反を記録したが、関連するステートメントが
 正常に実行されなかった後レコードを削除しなかったため、デバッグビルドでアサーションが
 生成されました。この状況の処理が改善され、現在は、サーバーはトランザクションの最後に
 GTID整合性違反が失敗したステートメントによって生成されたかどうかを確認し、
 もしそうであれば前のGTID整合性状態を復元します。(Bug #27903831, Bug #90551)

・レプリケーション: GTIDがレプリケーションに使用されており、空のトランザクション
 または置換トランザクションに同じGTIDを注入する推奨方法によって、解析エラー
 (ER_PARSE_ERROR)を引き起こしたステートメントを含むトランザクションを手動で
 スキップできませんでした。この動作により、スレーブはすでに使用されているGTIDを
 識別し、そのGTIDを共有していた不要なトランザクションをスキップする必要があります。
 しかし、解析エラーが発生した場合では、GTIDがスキップされる必要があるかどうかを
 チェックされる前にステートメントが解析されたため、トランザクションがとにかく
 スキップされるという意図があったとしても、レプリケーションアプライアスレッドは
 解析エラーのため停止しました。

 この修正により、レプリケーションアプライアスレッドは、懸念されるトランザクションが
 GTIDがすでに使用されているためにスキップされる必要がある場合、解析エラーを無視する
 ようになりました。この動作の変更は、mysqlbinlogによって生成されるバイナリログ出力で
 構成されるワークロードの場合は適用されません。そのような状況では、エラーを発生させる
 べきである時に、スキップされたトランザクションの直後に続く解析エラーを伴う
 トランザクションも静かにスキップされるというリスクがあります。(Bug #27638268)

・レプリケーション: GTIDを使用するレプリケーションスレーブでRESET SLAVEステートメントが
 発行された時、既存のリレーログファイルはパージされましたが、チャネルの一連の受信GTIDが
 クリアされる前に置換用の新しいリレーログファイルが生成されました。したがって、
 以前のGTIDのセットは、新しいリレーログファイルにPREVIOUS_GTIDSイベントとして書き込まれ、
 両方のサーバーのgtid_executedのセットが空であったとしても、スレーブがマスターより多くの
 GTIDを持つことを示すレプリケーションに致命的なエラーが発生しました。
 現在、RESET SLAVEが発行されると、一連の受信GTIDは、新しいリレーログファイルが
 生成される前にクリアされるので、この状況は発生しません。(Bug #27636289)

・レプリケーション: スレーブから肯定応答を読み取る間、準同期レプリケーションの
 マスター受信スレッドはmutexを保持していましたが、半同期スレーブの追加または削除には
 同じmutexが必要で、これらの操作は肯定応答アクティビティによって遅延させられました。
 この問題は、スレーブから肯定応答を読むためにmutexを取得しないことによって解決されました。
 (Bug #27610678, Bug #89370)

・レプリケーション: グループレプリケーション固有チャネルgroup_replication_applierおよび
 group_replication_recoveryのリレーログ情報ログ(slave_relay_log_infoテーブル)の
 エントリーは、RESET SLAVEまたはRESET SLAVE ALLコマンドによってクリアされませんでした。
 (Bug #27411175)

・レプリケーション: レプリケーションスレーブでのトランザクションの自動再試行は、
 slave_transaction_retriesシステム変数で指定されているように、
 トランザクションが再試行で繰り返される非一時的なエラーまたはより広い問題を示したエラー
 を持っていたとしても、実行されました。現在、トランザクションには、エラーがないか、
 一時的なエラーしかない場合にのみ、自動的に再試行されます。(Bug #27373559, Bug #89143)

・レプリケーション: START GROUP_REPLICATIONが実行中にプラグインをアンインストール
 しようとすると、予期しない動作が起こりました。
 (Bug #25423650, Bug #91042, Bug #28088177)

・レプリケーション: 特定のログタイプ(FLUSH SLOW LOGSなど)のFLUSHステートメントが
 エラーになった場合、ステートメントはバイナリログに書き込まれました。
 エラーはマスターで発生しましたが、スレーブで発生しなかったため、これはレプリケーションを
 停止しました。現在、MySQL ServerはこれらのFLUSHステートメントの結果をチェックし、
 エラーが発生した場合、ステートメントはバイナリログに書き込まれません。
 (Bug #24786290, Bug #83232)

・レプリケーション: パスワードのハッシュを生成するPASSWORD()関数は、MySQL 5.7では
 廃止予定になり、MySQL 8.0では削除されました。この関数を使用した
 SET PASSWORDステートメントが、MySQL 5.6のマスターからMySQL 5.7のスレーブに、または、
 log_builtin_as_identified_by_passwordシステム変数がONに設定された
 MySQL 5.7のマスターからMySQL 5.7のスレーブにレプリケートされた時、
 パスワードハッシュ自体もスレーブに格納される前にハッシュされました。
 この問題は修正され、レプリケートされたパスワードハッシュは
 もともとスレーブに渡された状態で保存されます。(Bug #24687073)

・レプリケーション: レプリケーションに関連する特定のパフォーマンススキーマテーブルから
 レコードを取り出すのにORDER BY句が使用された場合、空のセットが返されました。
 この問題は修正されました。(Bug #22958077, Bug #80777)

・レプリケーション: レプリケーションチャネルがマルチソースレプリケーションのために
 スレーブ上で使用される場合、個別のチャネルを指定しないSTART SLAVEステートメント
 (FOR CHANNEL句を使用しない)は、レプリケーションスレーブ上のすべてのチャネルの
 I/OスレッドとSQLスレッドを開始します。
 ただし、そのようなスレーブでRESET SLAVEステートメントが使用された場合、
 後続のSTART SLAVEステートメントはデフォルト以外のチャネルを開始しませんでした。
 現在、初期化プロセスのエラーの結果としてではなく、RESET SLAVEステートメントの
 結果として初期化解除されたレプリケーションチャネルは、すべてのチャネルに適用される
 START SLAVEステートメントによって識別され再始動されます。(Bug #22809607)

・レプリケーション: レプリケーションスレーブでRESET SLAVEを発行すると、
 メモリに保持されているマスターホストやマスターポート、マスターユーザー、
 マスターパスワードなどのレプリケーション接続パラメーターは変更されません。
 ただし、RESET SLAVE ALLを発行すると、これらの接続パラメーターはリセットされます。
 以前は、スレーブのmysqldがRESET SLAVEの発行後すぐに再起動された場合
 (サーバーのクラッシュと意図的な再起動を含む)、RESET SLAVE ALLが使用されたかのように
 接続パラメーターがリセットされました。

 現在、master_info_repository=TABLEがサーバーに設定されている場合
 (MySQL 8.0からはデフォルト)、レプリケーション接続パラメーターは、
 RESET SLAVE操作の一部としてクラッシュセーフInnoDBテーブルの
 mysql.slave_master_infoに保持されます。それらはメモリにも保持されます。
 RESET SLAVEを発行した後でSTART SLAVEを発行する前にサーバーがクラッシュした場合や
 意図的に再起動した場合、レプリケーション接続パラメーターはそのテーブルから取得され、
 新しい接続に再利用されます。

 サーバー上でmaster_info_repository=FILEが設定されている場合(MySQL 5.7のデフォルト)、
 レプリケーション接続パラメーターはメモリ内にのみ保持されるため、その動作はこれまでと
 同じままです。RESET SLAVEの発行直後のサーバーのクラッシュまたは意図的な再起動のために
 スレーブのmysqldが再起動された場合、接続パラメーターは失われます。この場合、
 START SLAVEを発行する前に、サーバーの起動後にCHANGE MASTER TOステートメントを
 発行して接続パラメーターを再指定する必要があります。

 意図的に接続パラメーターをリセットしたい場合、RESET SLAVE ALLを使用して
 接続パラメーターをクリアする必要があります。その場合、サーバーの起動後に
 CHANGE MASTER TOステートメントを発行して、新しい接続パラメーターを指定する
 必要があります。(Bug#20280946)

・レプリケーション: xdr_utilsの未使用機能に関連するコンパイル警告が減少しました。
 (Bug #91071, Bug #28099963)

・レプリケーション: メンバーがすでに再接続を試みている時に
 group_replication_recovery_retry_count変数が修正されると、その接続の試みは
 無限ループに入る可能性がありました。(Bug #91057, Bug #28092714)

・レプリケーション: DNSベースのエントリーでそれ自身のローカルアドレスに解決されたものが
 group_replication_group_seedsがに含まれる時、グループレプリケーションは
 開始できませんでした。(Bug #90483, Bug #27882096, Bug #28074929)

・Microsoft Windows: Windowsでは、MySQLインストーラによるMySQL Server MSIパッケージの
 アンインストールによって、誤ったポップアップウィンドウが生成されました。(Bug #27463864)

・Fedora 29プラットフォームでは、OpenSSL 1.1.1のサポートが準備できていないために、
 1.0.xがパッケージのビルドに使用されます。ソースからMySQLをビルドする場合は、
 compat-openssl10-develパッケージを使用してビルドすることをお勧めします。(Bug #28737143)

・Address Sanitizerは、audit_logプラグインに関連するSSL/Zlibリンクの問題を明らかにしました。
 これらは修正されました。(Bug #28525431, Bug #92082)

・一部のシステムライブラリを使用するようにMySQLが設定されているGCC 8のコンパイルに失敗しました。
 (Bug #28471072, Bug #91914)

・MERGEテーブルのINSERTステートメントとSELECTステートメントを同時に実行すると、
 サーバーが終了する可能性があります。(Bug #28379285)

・sql_safe_updatesが有効になっているためにエラーが発生するUPDATEおよびDELETEステートメント
 の場合、エラーメッセージは情報が十分ではありませんでした。現在、このメッセージには、
 失敗の理由に関する情報を提供するために、生成された最初の診断が含まれます。例えば、
 range_optimizer_max_mem_sizeの値が超過したか型変換が発生したことをメッセージが示し、
 そのいずれかがインデックスの使用を妨げる可能性があります。
 追加情報:
 (1)そのようなステートメントにEXPLAINを使用するとエラーは発生せず、ユーザーは
   EXPLAINとSHOW WARNINGSからインデックスが使用されない理由を確認できます。
 (2)複数テーブルの削除および更新の場合、ターゲットテーブルがテーブルスキャンを
   使用する場合にのみ、セーフアップデートを有効にしてエラーが生成されます。
 (Bug#28145710、Bug#91080)

・MySQL Server(と mysql-test)をRPMパッケージ形式でダウンロードした時に、依存関係で
 一緒にインストールされるソフトウェアの中からperl-Data-Dumperが抜けていました。
 (Bug #28144933, Bug #72926)

・mysqlクライアントの場合、-b shortオプションは、
 2つの長いオプション--no-beepと--binary-as-hexと関連していました。
 -bオプションは、現在、--no-beepのみと関連付けられます。(Bug#28093271)

・WITH_GMOCK CMakeオプションは、Windowsのパス名を適切に処理しませんでした。
 (Bug#28061409、Bug#90964)

・ユーザーに十分な権限がないと、LDAP認証プラグインのグループ検索が失敗する可能性があります。
 ここで、グループ検索操作は、利用可能な場合はrootの資格情報を使用して再度バインドされます。
 (Bug #28016008)

・インデックスを持ち、文字列関数を使用して生成された列は、常に正しく読み込まれませんでした。
 (Bug #27973409)

・mysqldumpダンプファイルのストアドプログラム定義には、
 NO_AUTO_CREATE_USER SQLモードが含まれることがありました。
 このモードはMySQL 8.0で削除されているため、そのようなダンプファイルを
 MySQL 8.0サーバーにロードすることはできませんでした。mysqldumpは、現在、
 ダンプされたストアドプログラムの定義からNO_AUTO_CREATE_USERを削除します。
 (Bug#27931181、Bug#90624)

・非常に長いテーブルキーがレプリケーションスレーブで正しく処理されなかった。(Bug #27930505)

・サーバーの起動/停止中に、PIDファイルが誤って処理される可能性があります。(Bug #27919254)

・ファイルアクセス許可エラーによりエラーログのフラッシュが失敗した場合、
 フラッシュ操作は完了しませんでした。(Bug #27891472, Bug #90505)

 参考: この問題は次のバグのリグレッションです: Bug#26447825

・MEMORYテーブルの場合、メモリオーバーフローエラーが発生する可能性があります。
 (Bug #27799513)

・BLOB(またはTEXT)タイプからより小さいBLOB(またはTEXT)タイプに変換する時、
 切り捨てまたはデータ消失に関する警告もエラーも全く報告されませんでした。
 厳密なSQLモードでは適切なエラーが発行され、非厳密なSQLモードでは警告が出されます。
 (Bug #27788685, Bug #90266)

・キーファイルを読み取ることができないことについてサーバーによって生成されたメッセージの
 重大度が、INFORMATIONからWARNINGにエスカレートされました。(Bug #27737195)

・MyISAMクエリ中に一時テーブルを作成できないと、サーバーが終了する可能性があります。
 (Bug #27724519, Bug #90145)

・parser_max_mem_sizeは、ストアドプログラムの定義を解析する時に無効でした。(Bug #27714748)

・サーバーエラーメッセージのいくつかのタイプミスが修正されました。
 (Bug #27688294, Bug #90048)

・ホスト名解決エラーによって、audit_logプラグインが失敗する可能性があります。(Bug #27567003)

・log_error_verbosity=3の場合、失敗した接続試行はエラーログに書き込まれませんでした。
 (Bug #27539838)

・以前のコードのクリーンアップにより、FEDERATEDストレージエンジンの障害が発生しました。
 (Bug #27493633, Bug #89537)

 参考: この問題は次のバグのリグレッションです: Bug#25943754

・コミットされていないトランザクションの読み取り試行でアサーションが発生しました。
 (Bug #26876608)

・ALTER TABLE ... REORGANIZE PARTITION ...は、最後のパーティション以外のパーティションに
 構文のVALUES LESS THAN部分がないと、正しく動作しなくなる可能性があります。(Bug #26791931)

・audit_logプラグインがサーバーをデッドロックする可能性があります。(Bug #24353553)

・デバッグシンボルパッケージはすべてのaptプラットフォームに含まれるようになりました
 (以前はDebian 9でのみ利用可能でした)。(Bug #24008883, Bug #27990381)

・InnoDBテーブルの場合、ストレージエンジンAPIは、サポートされているキーパーツの
 最大長に対して不正な値を返す可能性があります。(Bug #20629014, Bug #76096)

・2155.0E00や2.15E3などの実定数で表現すると、YEAR列の最大の可能な値を
 指定できませんでした。(Bug #91226, Bug #28172538)

・NULLを許可されたカラムに対して一意のキーを使用したサブクエリは、複数の行を返すことが
 できました。(Bug #88670, Bug #27182010)

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

MySQL Editions

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

MySQL Editionsの詳細