スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL 8.0 の SET PERSIST について

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 です。

SET PERSIST で 1000 に変更してみます。

MySQL 8.0 を再起動します。

再度確認してみます。変更後の1000 のまま保持されているのが確認できました。

設定値はどこに格納されるのか?

SET PERSIST で変更された値はデータディレクトリの mysqld-auto.cnf に格納されます。
フォーマットはJSON形式のようです。

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で設定した値をリセットしたい場合

コマンドでリセットする

以下のコマンドで設定したパラメーターをリセットすることができます。

ただし、設定した値がすぐにデフォルト値に戻るわけではありません。

SET PERSIST で設定した値のままなので、改めてSETを使って値を設定するか、MySQLを再起動する必要があります。

RESET PERSIST しても一度作成された mysqld-auto.cnf は消されず、以下のような内容になります。

起動時に読み込まないようにしたい場合

my.cnf に以下のように persisted_globals_loadを無効にするか、--no-defaultsオプションを指定してMySQL を起動することで無効にすることができます。

あまり無いとは思いますが、もしmysqld-auto.cnf を手で変更したために、解析エラーで起動しなくなった場合の対応としても使えます。

まとめ

これまではSET文で変更したパラメーターをmy.cnfに記載するのを忘れてしまうと、MySQLの再起動時に値が元に戻ってパフォーマンスに問題が出たり、障害にまでなってしまうようなケースがありましたが、MySQL 8.0 からは SET PERSIST 文を使うことでそういった問題は回避できるようになるかと思います。
また、これまではパラメーター設定は基本的にmy.cnfを見れば把握できましたが、MySQL 8.0 からは mysqld-auto.cnf も忘れずに見る必要があります。


MySQL

 

Return Top