この記事は MySQL Casual Advent Calendar 2016 の7日目です。
MySQL 8.0 Developer Milestone Release (ベータ版みたいなもの) が9月にリリースされました。
MySQL 8.0 で導入された「Persisting configuration variables」について紹介します。
これまで(MySQL 5.7まで)の設定変更の手順とその課題
MySQL の設定には、再起動不要で動的に変更できるものと、できないものがあります。
動的に設定変更するには SET GLOBAL
を実行します。
例)wait_timeout の変更
mysql> SET GLOBAL wait_timeout=60;
Query OK, 0 rows affected (0.00 sec)
SET GLOBALは現在起動中のMySQLのみに影響を及ぼします。
そのため、MySQLが再起動したときに備えて設定ファイル(my.cnf)も、設定した値にあわせて編集しておく必要があります。
// SET GLOBAL に加えて設定ファイルの編集が必要
$ sudo vi /etc/my.cnf
この仕組みには以下のような課題があります。
- 2つ変更しないといけないので面倒。特にサーバ台数が多い場合ツライ。
- my.cnf の編集を忘れがち。再起動したら設定が戻ってしまった など事故のもとに・・・
- DB管理者にファイルを編集させるためOSアカウントを与えないといけない
個人的には3つ目が一番の課題だと感じています。DB管理者がユーザデータにアクセスできないようDBアカウントの権限分離をしていたとしても、OSレイヤーからアクセスできてしまっては意味がありません。
Persisting configuration variables
Persisting configuration variables を使うことで上記の課題を解決できます。
※ Oracle Database を使ったことがある方は、SPFILEと同じものだと考えて頂ければよいでしょう。
設定変更時に SET GLOBAL
の代わりに SET PERSIST
を使います。
mysql> SHOW GLOBAL VARIABLES LIKE 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET PERSIST wait_timeout = 60;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW GLOBAL VARIABLES LIKE 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 60 |
+---------------+-------+
1 row in set (0.00 sec)
SET PERSIST
では、このようなJSONファイルが生成されます。
$ sudo cat /var/lib/mysql/mysqld-auto.cnf
{ "mysql_server": {"wait_timeout": "60" } }
この設定ファイルは再起動時に読み込まれるので、my.cnf を手オペで編集する必要はもうありません!
SQLでファイルを編集できるため、OSアカウントをDB管理者に与える必要もなくなりました。
ちなみにデフォルト値に戻すと、mysqld-auto.cnf から、ちゃんと消えてくれます。
mysql> SET PERSIST wait_timeout = 28800;
Query OK, 0 rows affected (0.00 sec)
$ grep wait_timeout /etc/my.cnf
$ sudo cat /var/lib/mysql/mysqld-auto.cnf
{ "mysql_server": { } }
以上 Persisting configuration variables の紹介でした。