パラメータ変更時の落とし穴
パラメータ確認時に落ちる
最近のMySQLはパラメータをオンラインで変更できるので、
SET GLOBAL パラメータ名=xxxx
だとか
SET パラメータ名=xxxx
で変えている人も多いと思う。
でも、SHOW VARIABLES;で確認したときに変化が無くて、なんで変わらないんだ?と思った人はいないだろうか。
落ち着いて考えれば気づけると思うけどね。
パラメータには2種類ある
パラメータには
- グローバル値とセッション値があり、
- サーバ開始時はコンフィグファイル(my.cnf等)を読み込みつつ、全てのグローバル値をデフォルト→読み込んだ値で上書いた値でサーバを動かします。
- 各クライアントの持つセッション値も基本は上記グローバル値がデフォルトです。
- グローバル値もセッション値も一部はオンラインで変更が可能です。
この時、
SET GLOBAL パラメータ名=xxxx
でグローバル値を変更したら、変更したセッションのセッション値が同じ値に変更すればいいんだけど、そうじゃないパラメータが存在する。 例えば、long_query_timeとかinnodb_ft_result_cache_limitとか
個人的には
SET パラメータ名=xxxx
でセッション値を変えてもグローバル値が変わらないのは納得感あるけど、その逆は「えーー??」って感じがする。
確認方法をshow variablesじゃなくて、
@を二つ重ねた後にパラメータ名を書くとセッション値が、@@global.という文字列の後にパラメータ名を書くとグローバル値が取得できる ↓こんな感じ
select @@long_query_time, @@global.long_query_time;
おまけ
パラメータと言えば、初期値ってバージョンごとにかなり変わるんだけど、 そんなバージョン間のパラメータの比較ならとみたさんの MySQL Parameters がおススメ。 バージョン移行時には必ず見といたほうが良い。 あと、後のバージョンで変わってるようなパラメータにはそれなりの理由があることが多いので、 現在使用しているバージョンでデフォルト値のままのパラメータ値が、バージョン変更している場合に値も変更されていたら要注意。
参考 https://dev.mysql.com/doc/refman/5.6/ja/using-system-variables.html https://tmtm.github.io/mysql-params/?vers=5.0.96,5.1.72,5.5.58,5.6.38,5.7.21,8.0.4&diff=true