MySQL道普請便り
第27回 実行されるSQLステートメントをすべて取得・確認する
稼働中のMySQLに対して,
- 一般クエリーログから取得する方法
- スロークエリーログから取得する方法
ただし,
検証環境
今回のMySQLのバージョンは5.
をyumを使用してインストールしたものを使用します。サーバのホスト名はtest-host
です。
一般クエリーログから取得する方法
一般クエリーログはクライアントから受け取ったSQLステートメントをすべてログに出力します。設定方法はパラメータgeneral_
を1またはONで有効,general_
は,
mysql> show variables like 'general_log'; +------------------+---------------------------------+ | Variable_name | Value | +------------------+---------------------------------+ | general_log | OFF | +------------------+---------------------------------+
SET GLOBAL general_
で一般クエリーログを有効化します。
mysql> SET GLOBAL general_log=ON; Query OK, 0 rows affected (0.00 sec)
一般クエリーログはON
にしたタイミングで現在接続中のセッションを含めてすべてのセッションに対して有効となります。
一般クエリーログファイルに以下のような形でステートメントが記述されます。デフォルトのファイル名はHOSTNAME.
となります。ファイル名を変更する場合はオンラインで変更可能なパラメータgeneral_
を変更してください。
# vi /var/lib/mysql/test-host.log Time Id Command Argument 2016-08-19T09:44:02.578750Z 12 Query select 1 2016-08-19T09:44:08.571657Z 12 Query SELECT count(*) FROM tbl_a
一般クエリーログから取得できる項目は以下となります。
- Time … 対象のステートメントが実行された時間
- Id … 接続識別子
( SHOW PROCESSLIST
で表示されるid列) - Command … 対象のステートメントのコマンドタイプ
- Argument … 実行されたステートメント
そして,general_
の値をOFF
へ戻します。
mysql> SET GLOBAL general_log=OFF; Query OK, 0 rows affected (0.00 sec)
こうすることで,
スロークエリーログから取得する方法
スロークエリーログの内容や設定方法は第7回 スロークエリーログを使って遅いクエリを収集するを参照してください。
一般的にスロークエリーログはパラメータlong_
に指定した秒数よりも処理に時間がかかるクエリを抽出して,
スロークエリーログから実行されるすべてSQLステートメントを取得するためには,
- パラメータ
long_
の値をquery_ time 0
に変更します。値を0
にすることで0秒以上経過したSQLステートメントが出力されるようになります。 - パラメータ
log_
をslow_ admin_ statements 1
に変更します。デフォルト設定の0
では管理ステートメント(ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, および REPAIR TABLE) が含まれないためです。
また,
パラメータlong_
とパラメータlog_
は稼働中のMySQLに対してオンラインで変更可能です。
mysql> SET GLOBAL long_query_time=0; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL log_slow_admin_statements=1; Query OK, 0 rows affected (0.00 sec)
ここで注意として,SET GLOBAL long_
を実行したタイミングで現在接続中のセッションについてはこの変更は適用されません。設定した以降に接続されたセッションから有効となります。よって,
セッションを再接続することで,
mysql> show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 0.000000 | +-----------------+----------+ 1 row in set (0.01 sec)
スロークエリーログファイルに以下のような形でステートメントが記述されます。デフォルトのファイル名はHOSTNAME-slow.
となっています。ファイル名を変更する場合は,slow_
を変更してください。
# vi /var/lib/mysql/test-host-slow.log # Time: 2016-08-19T09:48:29.216211Z # User@Host: root[root] @ localhost [] Id: 15 # Query_time: 0.000112 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp=1471600109; SELECT 1; # Time: 2016-08-19T09:48:37.049002Z # User@Host: root[root] @ localhost [] Id: 15 # Query_time: 0.000073 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 SET timestamp=1471600117; SELECT count(*) FROM tbl_a;
そして,long_
の値を元の値へ戻します。
mysql> SET GLOBAL long_query_time=10; Query OK, 0 rows affected (0.00 sec)
このようにすることで,
まとめ
今回はスロークエリーログと一般クエリーログを使用して稼動中のMySQLに対して実行されるすべてのSQLステートメントを出力する方法をご紹介しました。
実行されたホストや処理にかかった実行時間などの付加情報が必要な場合はスロークエリーログを使用したり,
バックナンバー
MySQL道普請便り
- 第27回 実行されるSQLステートメントをすべて取得・確認する
- 第26回 SysBenchを使ってMySQLの負荷テストをする
- 第25回 GTIDを使用したレプリケーション構成を作成する[2]
- 第24回 GTIDを使用したレプリケーション構成を作成する[1]
- 第23回 mysqlslapを使って負荷テストをしてみよう
- 第22回 特定のSQL文が原因で発生したレプリケーション遅延の調査方法
- 第21回 MySQLのユーザー管理について[その3]
- 第20回 mycliを使って快適にSQLを実行する
- 第19回 MySQLのユーザー管理について[その2]
- 第18回 MySQL5.7のデフォルトのSQLモードを確認してみる