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  も忘れずに見る必要があります。


 
		 
			 
			 
			 
			 
			 
			 
			