41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

パラメータ変更時の落とし穴

パラメータ確認時に落ちる

最近の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;

f:id:next4us-ti:20181010160437p:plain

おまけ

パラメータと言えば、初期値ってバージョンごとにかなり変わるんだけど、 そんなバージョン間のパラメータの比較ならとみたさんの 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