【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
コメント