MySQL ではサーバーのパラメーターを設定する場合、my.cnf
に記載する以外にもSQLのSET
ステートメントで値を設定することができますが、この場合、MySQLを再起動すると設定した値がリセットされてしまってました。
MySQL 8.0 では新しく SET PERSIST
が追加され、これを使用してパラメーターの値を設定すると、再起動後も値が保持されるようになります。
MySQL :: MySQL 8.0 Reference Manual :: 13.7.5.1 SET Syntax for Variable Assignment
使用例
ここでは SET PERSIST
を使用して max_connections
のパラメーターを変更し動作の確認を行ってみたいと思います。
デフォルトの max_connections は 151 です。
1 2 3 4 5 6 7 |
mysql> show global variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 151 | +-----------------+-------+ 1 row in set (0.01 sec) |
SET PERSIST
で 1000 に変更してみます。
1 2 3 4 5 6 7 8 9 10 |
mysql> set persist max_connections=1000; Query OK, 0 rows affected (0.00 sec) mysql> show global variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 1000 | +-----------------+-------+ 1 row in set (0.00 sec) |
MySQL 8.0 を再起動します。
1 |
$ sudo systemctl restart mysqld |
再度確認してみます。変更後の1000 のまま保持されているのが確認できました。
1 2 3 4 5 6 7 |
mysql> show global variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 1000 | +-----------------+-------+ 1 row in set (0.02 sec) |
設定値はどこに格納されるのか?
SET PERSIST
で変更された値はデータディレクトリの mysqld-auto.cnf
に格納されます。
フォーマットはJSON形式のようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ cat /var/lib/mysql/mysqld-auto.cnf | jq { "Version": 1, "mysql_server": { "max_connections": { "Value": "1000", "Metadata": { "Timestamp": 1530853149287909, "User": "msandbox", "Host": "localhost" } }, "slow_query_log": { "Value": "ON", "Metadata": { "Timestamp": 1530853572774050, "User": "msandbox", "Host": "localhost" } } } } |
PERSISTに必要な権限
SUPER
もしくは SYSTEM_VARIABLES_ADMIN
が必要になります。
SYSTEM_VARIABLES_ADMINとは?
これも MySQL 8.0 から追加された権限で、動的に権限を付与することができるものになります。
SYSTEM_VARIABLES_ADMIN
を付与すると、PERSIST でパラメータの変更ができます。
MySQL :: MySQL 8.0 Reference Manual :: 6.2.1 Privileges Provided by MySQL
PERSISTで設定した値をリセットしたい場合
コマンドでリセットする
以下のコマンドで設定したパラメーターをリセットすることができます。
1 |
mysql> RESET PERSIST; |
ただし、設定した値がすぐにデフォルト値に戻るわけではありません。
1 2 3 4 5 6 7 |
mysql> show global variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 1000 | +-----------------+-------+ 1 row in set (0.00 sec) |
SET PERSIST
で設定した値のままなので、改めてSET
を使って値を設定するか、MySQLを再起動する必要があります。
RESET PERSIST
しても一度作成された mysqld-auto.cnf
は消されず、以下のような内容になります。
1 2 3 4 |
{ "Version": 1, "mysql_server": {} } |
起動時に読み込まないようにしたい場合
my.cnf に以下のように persisted_globals_load
を無効にするか、--no-defaults
オプションを指定してMySQL を起動することで無効にすることができます。
1 2 |
[mysqld] persisted_globals_load = OFF |
あまり無いとは思いますが、もしmysqld-auto.cnf
を手で変更したために、解析エラーで起動しなくなった場合の対応としても使えます。
まとめ
これまではSET
文で変更したパラメーターをmy.cnf
に記載するのを忘れてしまうと、MySQLの再起動時に値が元に戻ってパフォーマンスに問題が出たり、障害にまでなってしまうようなケースがありましたが、MySQL 8.0 からは SET PERSIST
文を使うことでそういった問題は回避できるようになるかと思います。
また、これまではパラメーター設定は基本的にmy.cnf
を見れば把握できましたが、MySQL 8.0 からは mysqld-auto.cnf
も忘れずに見る必要があります。