9/21、MySQL8.0のRC版リリース。
基本、マニュアルヨメのお話なんですが、
自分のメモを兼ねて書いておきます。
MySQL 8.0.3リリースノート:
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-3.html
MySQL Server TeamのMySQL 8.0.3紹介記事
http://mysqlserverteam.com/the-mysql-8-0-3-release-candidate-is-available/
ほとんどはリリースノートが情報ソースです。
1. ロシア語のcollationサポート
ワタシ、ロシア語ワカリマセーン。
アクセント・大文字小文字Sensitiveかそうでないか、ですね。
この辺は日本語の方でも8.0で話題になっていますね。
2. back_logの計算方法の変更
元々「50 + (max_connections / 5)」だったものが、「= max_connections」になった。
クライアント接続数の設定するときにback_logを注意する必要が(たぶん)なくなるのでよさそうですね。
3. イベントスケジューラーがデフォルトONになった
正直、イベントスケジューラーを使ったことがないですが、MySQL Server Teamの記事によると、
「This is seen as an enabler for new features in SYS, for example “kill idle transactions”.」
だそうです。
4. max_allowed_packetのデフォルトが4Mから64Mに引き上げられた
これにやられた人が多かったってことでしょうか。
5. sql_log_binのグローバルスコープが削除された
以前からdeprecatedとなり、setはできなくなっていましたが、
存在もしなくなりました(以前はselectはできました)。
deprecatedになったのは、下記のような問題があったためです。
https://yakst.com/ja/posts/757
6. tx_isolationがtransaction_isolationに改名
my.cnfでの指定にはtransaction_isolationと書くのに、
SHOW GLOBAL VARIABLESではtx_isolationと表示される、
という不自然さが解消されました。
なお、tx_read_onlyも同様にtransaction_read_onlyと改名されています。
7. クエリキャッシュの削除
以前からクエリキャッシュはWriteの負荷が上がることなどを理由にOFFとするのが定石となっていましたが、
ついに機能が削除されました。
Amazon Aurora MySQL compatibleではクエリキャッシュを向上したと謳っているのと対照的です。
これに伴い、関連するシステム変数、ステータス変数が削除されています。
8. EXPLAIN EXTENDED/PARTITIONS句の削除
単にEXPLAIN、というだけで同様の効果を持つようになっているので不要になりました。
5.7あたりから既にそうなっていたと思います。
9. log_warningsの削除
5.7からlog_error_verbosityが導入され、こちらを使うように、と言われていましたが、
ついにlog_warningsが削除されました。
10. SECURE_AUTHの削除
mysql_old_passwordはサポートされなくなったので、SECURE_AUTHも用済み、ということですね。
11. オプティマイザがヒストグラムベースをサポート
カラムの値の分散を考慮にいれた実行計画の作成をするようになったそうです。
これはしっかり読み込まないと理解できなさそうですね・・・。
Oracle Databaseでは導入されている機能だったはずです。
12. パスワード履歴を保持するようになった。
パスワード変更の履歴を持つようになったそうです。
password_history、password_reuse_intervalあたりのシステム変数が関連してそうですね。
13. DDLがアトミックになった
重要な変更ですね。
これについては、公式の発表で詳細が語られると思います。
データディクショナリをInnoDB化したことでできるようになったものです。
DDLのRecoveryログは、mysql.innodb_ddl_logファイルに書かれますが、
innodb_print_ddl_logsをONにすると、
エラーログに書いてくれるそうです。
早速出してみると、こんなログが書かれました。
なお、実行したDDLは、「create table UCO.t1 (a int primary key auto_increment);」です。
2017-09-24T15:27:48.756509Z 8 [Note] InnoDB: DDL log insert : [DDL record: DELETE SPACE, id=22, thread_id=8, space_id=5, old_file_path=./UCO/t1.ibd] 2017-09-24T15:27:48.756646Z 8 [Note] InnoDB: DDL log delete : by id 22 2017-09-24T15:27:48.759498Z 8 [Note] InnoDB: DDL log insert : [DDL record: REMOVE CACHE, id=23, thread_id=8, table_id=71, new_file_path=UCO/t1] 2017-09-24T15:27:48.759523Z 8 [Note] InnoDB: DDL log delete : by id 23 2017-09-24T15:27:48.760807Z 8 [Note] InnoDB: DDL log insert : [DDL record: FREE, id=24, thread_id=8, space_id=5, index_id=138, page_no=4] 2017-09-24T15:27:48.760832Z 8 [Note] InnoDB: DDL log delete : by id 24 2017-09-24T15:27:48.766674Z 8 [Note] InnoDB: DDL log post ddl : begin for thread id : 8 2017-09-24T15:27:48.766696Z 8 [Note] InnoDB: DDL log post ddl : end for thread id : 8
14. InnoDB Buffer Poolの自動調整
サーバ搭載の物理メモリに応じて、
innodb_buffer_pool_size、innodb_log_file_size、innodb_flush_methodを
自動設定するオプションが導入されました。
innodb_dedicated_serverです。
15. Serialized Dictionary Information (SDI)ファイルが存在するようになった
テーブルスペース毎に.sdiファイルというのが作成されるようになりました。
テーブル等のメタデータの冗長性を提供するものらしいですが、詳細は不明です。
新しい情報が出てくるのを待ちます。
このファイル、JSON形式で書かれたテキストファイルで、中身を直接読めます。
例えばこんな感じです。
{ "mysqld_version_id": 80003, "dd_version": 1, "sdi_version": 1, "dd_object_type": "Schema", "dd_object": { "name": "UCO", "default_collation_id": 255, "created": 0, "last_altered": 0 }
16. innodb_flush_neighborsがデフォルトでOFFになった
SSDを前提にする、という意志の表れでしょうか。
17. innodb_max_dirty_pages_pct_lwm、innodb_max_dirty_pages_pctのデフォルトが変更された
それぞれ0から10に、75から90に変更された。
innodb_max_dirty_pages_pct_lwmは、
InnoDBのAdaptive Flush開始の比率を指定するパラメーター(らしい)。
ちなみにlwmはLow Water Markの略。
InnoDB Buffer Pool上のダーティーページが、
指定した割合を超えるとテーブルスペースへのフラッシュを開始する。
※ダーティーページ:
バッファ上では更新されたが、テーブルスペースでは更新されていないページ。
innodb_max_dirty_pages_pctは、この値を超えないようにAdaptive Flushが動く、という目標値らしい。
おそらく、これを超えるとダーティーページの強制フラッシュが始まる可能性があるのではないか?
要は、早い段階からAdaptive Flushを開始し、
代わりにInnoDB Bufferにより多くのダーティーページを許容する、
という修正と解釈してます。
18. UNDOテーブルスペースファイルが作られるようになった
5.7までは、デフォルトではUNDOテーブルスペースファイルは作られていなかった(データファイル中に作成されていた?)が、
8.0ではデフォルトでUNDOテーブルスペースファイルが作成されるようになりました。
innodb_undo_tablespacesが0から2になった、というのが具体的な変更点です。
19. log_slave_updatesがデフォルトONになった
いちいちONにしてまわる必要がなくなって助かります。
20. バイナリログがデフォルトONになった
ようやく、という感じでしょうか。
レプリケーションでは必須ですし、シングルでもロールフォワードリカバリに必要なので、
ONにしている環境は多いと思います。
ちなみに、server_idはデフォルト1でセットされ、
明示的に変更しないと起動時にログにwarningが出力されます。
21. expire_logs_daysがdeprecatedに
代わりに、binlog_expire_logs_secondsが導入されました。
しかしこれ、deprecatedになったといっても、
デフォルトが30になるという変更がかかっています。
さらに、8.0ではexpire_logs_days + binlog_expire_logs_secondsがバイナリログの保存期間になるので、
注意が必要です。
要は、「ああ、binlog_expire_logs_secondsで秒指定するようになったんだ」と言って、
保存期間を秒変換してここに代入すると、プラス1か月されてしまうということです。
22. LOCK INSTANCE FOR BACKUPの追加
これ、結構面白そうだと思っています。
インスタンスレベルでのバックアップ用のロックを取得するそうです。
https://dev.mysql.com/doc/refman/8.0/en/lock-instance-for-backup.html
に説明があります。
いわく、DMLは許可するが、スナップショットの一貫性を損なうクエリはブロックするそうです。
挙動をもう少し調べて確証が得られれば、商用環境での利用も十分検討できると思います。
23. master_infor_repository/relay_log_info_repository=FILEがdeprecatedに
まあFILEにするメリットもなく、クラッシュに対応できなくなるだけなので、
あえて使う人もいないのではないでしょうか。
24. Resource Groupsの追加
MySQL Server Teamの記事を見ると、
Resource Groupsという機能が導入されたそうです。
SQL毎にCPUの使用数を制限できるそうで、なかなか面白そうです。
今日はここまで。
面白そうな機能はまたいじってみます。
面白そうな機能
7. クエリキャッシュの削除
11. オプティマイザがヒストグラムベースをサポート
13. DDLがトランザクショナルになった
15. Serialized Dictionary Information (SDI)ファイルが存在するようになった
22. LOCK INSTANCE FOR BACKUPの追加
24. Resource Groupsの追加