Database JUNKY

MySQL,MariaDBを中心としたブログです

発行される全てのSQLを全てログ取得する方法

調べればすぐわかるのですが、一応メモ。 MySQLを利用した運用の中で、どんなクエリが発行されているのか見たい時ありますよね? 通常ですと、スロークエリーを見るケースが多いので、そちらを見るのかな? しかしながら、スロークエリーではないのですが、細かいクエリが連発でくるのも負荷の原因になるので、ん?どーしてこんなにサーバのロードアベレージ上昇しているの?というのは確認する時、スロークエリーログだけですと、わからないパターンがあります。

f:id:hit10231023:20180309104332j:plain

んじゃ、そーいう時、どうするか?なんですが。。

そこで登場するのが、general_logってやつです。global variablesでgeneral_loggeneral_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)