SOFTELメモ

</> 技術者募集

【MySQL】一般クエリログをデータベースに保存する

問題

実行したSQLをログに残しておくと、開発、デバッグのときに便利です。何か問題があったときやチューニングなどに、なにげに大活躍します。

そういうわけでSQLはログに残したいのですが、プログラム側で自力でログを残すのではなく、MySQLさんにログ保存をお願いできるでしょうか。

答え

MySQLのログには、復旧等にも重要な役目のあるバイナリログという更新系のSQLのログ、遅いSQLを教えてくれるスローログ、エラーを教えてくれるエラーログなどのほかに、一般クエリログという、SELECE文なども含めてすべてのSQLを残せるログがある。

MySQL5.5(5.1でも同じでよいらしい)で一般クエリログを有効にするには、my.cnfの[mysqld]セクションで以下のように記述する。

log-output=TABLE
general_log=1

スロークエリログも取るときはslow_query_log=1を指定する。

log-output=TABLE
general_log=1
slow_query_log=1

以下のような情報が、mysql.general_logのテーブルに残る。

複数のシステムが1つのMySQLサーバーを利用しているとき、どのプログラムからのSQLなのかが判断しにくい。接続ユーザーを変えて区別できるようにするのがよさそう。

general_logの例

event_time user_host thread_id server_id command_type argument
2012-11-18 18:26:54 [root] @ localhost [::1] 4 1 Connect root@localhost on データベース名
2012-11-18 18:26:54 root[root] @ localhost [::1] 4 1 Query select
*
from
m_authority
2012-11-18 18:26:54 root[root] @ localhost [::1] 4 1 Query select SQL_CALC_FOUND_ROWS
m_member.*
fro…
2012-11-18 18:26:54 root[root] @ localhost [::1] 4 1 Query select found_rows()
2012-11-18 18:26:54 root[root] @ localhost [::1] 4 1 Quit

なお、mysql.general_log、mysql.slow_logのストレージエンジンはデフォルトでCSVのようなので、何かしらの事情があれば、ログを停止して、ALTER TABLEして、MyISAMに変更をしてもよい。

操作例

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
SET GLOBAL slow_query_log = @old_log_state;

参考

http://dev.mysql.com/doc/refman/5.5/en/server-logs.html
http://dev.mysql.com/doc/refman/5.5/en/log-destinations.html
http://dev.mysql.com/doc/refman/5.5/en/query-log.html

http://dev.mysql.com/doc/refman/5.1/ja/log-files.html
http://dev.mysql.com/doc/refman/5.1/ja/log-tables.html
http://dev.mysql.com/doc/refman/5.1/ja/query-log.html

関連するメモ

コメント