発行される全てのSQLを全てログ取得する方法
調べればすぐわかるのですが、一応メモ。 MySQLを利用した運用の中で、どんなクエリが発行されているのか見たい時ありますよね? 通常ですと、スロークエリーを見るケースが多いので、そちらを見るのかな? しかしながら、スロークエリーではないのですが、細かいクエリが連発でくるのも負荷の原因になるので、ん?どーしてこんなにサーバのロードアベレージ上昇しているの?というのは確認する時、スロークエリーログだけですと、わからないパターンがあります。
んじゃ、そーいう時、どうするか?なんですが。。
そこで登場するのが、general_logってやつです。global variablesでgeneral_logとgeneral_log_fileがきもになります。 サービスによってものすごーく、大量のログを出力するので、ここは通常、下記通り、OFFにしている方が多いと思います。
mysql> show global variables like '%gene%' ; +------------------+----------------------------------+ | Variable_name | Value | +------------------+----------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/ip-10-0-1-155.log | +------------------+----------------------------------+
例えば、現在進行形で、データベースサーバの負荷が上昇し、スロークエリーログにも特に何もでていない場合、数秒、数分どんなクエリーが流れているか確認したいっていうケースは多いかとおもいます。
その場合、こんな感じで設定します。
mysql> SET GLOBAL general_log = 'ON'; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL general_log_file = '/var/lib/mysql/general_log.log'; Query OK, 0 rows affected (0.03 sec) mysql> FLUSH LOGS ; Query OK, 0 rows affected (0.05 sec)
設定を上記のように変更して、全てのSQLをログ化することが可能です、FLUSH LOGS コマンドはかならず発行するように注意してください。
上記の設定を変更した結果、環境変数は以下のように変わりました。
mysql> show global variables like '%gene%' ; +------------------+--------------------------------+ | Variable_name | Value | +------------------+--------------------------------+ | general_log | ON | | general_log_file | /var/lib/mysql/general_log.log | +------------------+--------------------------------+
まあ、そういう風に設定したので、当たり前ですが(笑) これで、例として、/var/lib/mysql/general_log.logに全てのクエリーがgeneral_log_fileに出力されているかわかるかと思います。
こちら調査的なものが終わったら必ず、general_log='OFF' にするように注意してください。でないと大量にログを出力し続けることになり、ログでディスクがパンクしちゃうかもしれませんよ!!
mysql> SET GLOBAL general_log='OFF'; Query OK, 0 rows affected (0.02 sec) mysql> FLUSH LOGS ; Query OK, 0 rows affected (0.01 sec)