MySQLでスロークエリのログがファイルに出力されない
3行まとめ
- MySQLで、スロークエリのログを出すように設定したのに、ログに何も出力されなかった
- cnfファイルの権限を必要以上に与えていて、MySQLから無視されてしまっていた
- logファイルの権限が絞られすぎていて、MySQLが読みにいくことができず、エラーになっていた
概要
ISUCONの練習をしている時に、MySQLのスロークエリのログを吐かせて、pt-query-digestで分析しようと考えた。
しかし、負荷試験をしてクエリを流しても、クエリは空のまま。
cat /var/log/mysql/mysql-slow.log
# 何も起こらない
前提
mysqld.cnfには以下のように記載している。
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 0
その他の設定は基本的にISUCON本の3章あたりの設定に準じている。
ISUCON本: https://www.amazon.co.jp/dp/B0B1Z9ZMY6/ref=cm_sw_r_tw_dp_PH3EPXCFATXCMCSDWV07
mysqlは再起動している。
show variablesしてみると、設定が読み込まれていないようだった。(実際に内部の設定を確認するのは、当然だが大事)
mysql> show variables like 'slow%';
+---------------------+-------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------+
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/log/mysql/mysql-slow.log |
+---------------------+-------------------------------+
3 rows in set (0.01 sec)
結果
2つ問題があった。
mysqld.cnfのパーミッションが不適当で、そもそも設定ファイルが読み込まれていなかった
よくある、confファイルに権限を与えすぎていると怒られる問題。
編集とかの都合で、えいやとmysqld.cnfのパーミッションを777にしていた。
対処法は、
chmod 644 /etc/mysql/mysql.conf.d/mysqld.cnf
とした。
権限に着目した理由としては、
mysqlコマンドを実行したときに、以下のエラーが出ていたことから、ファイルがそもそも読み込まれていないと考えた。ファイルが読み込まれていないということは、ファイルの権限に問題があるのではないかと考えた。
/var/log/mysql# mysql
mysql: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf' is ignored.
しかし、これを行なってもslow_query_logはOFFのままだった。
mysql-slow.logのパーミッションが足りなかった(mysqlが読めなかった)
mysqlがlogファイルを読みに行けないと、そもそもslow_query_logの項目がOFFのままのようだ。
ISUCONの勉強時としての対処法としては、
chmod 777 /var/log/mysql/mysql-slow.log
とした。もし本番で用いるとしたら権限はきちんと考えた方が良いだろう。
こちらもログファイルの権限が問題だと気づいたのは、
confファイルからではなく、ターミナル上でslow_query_logをONにしようと試みた。その結果、
mysql> set global slow_query_log=1;
ERROR 29 (HY000): File '/var/log/mysql/mysql-slow.log' not found (OS errno 13 - Permission denied)
と出力された。slow_query_logの項目がOFFのままになるのは、命令を実行しようとしたときにログファイルを読みに行けないとエラーになってしまうからのようだ。
まとめ
スロークエリのログが出力されない時、以下の点に気をつけるといいことがあるかもしれない。
- mysqld.cnfなどconfファイルの権限(必要十分にする)
- logファイルの権限(mysqlが読みに行けるようにする)
デバッグ的な教訓としては、実際にコンソール上に入ってみて設定を確認すること、コンソール上で実際にやりたい命令を実行してみて、エラーログを確認すると良いだろう。
追記
理解が浅い点、少し前の調査を思い出して書いたので誤っている点があるかもしれません。
もし何か認識の誤りなどあれば指摘いただけると大変ありがたいです。
Discussion