MySQL 8.0 の SET PERSIST について

MySQL 8.0
この記事は最終更新から6年以上経過しています。内容が古くなっている可能性があります。

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


 

 

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次