はじめに
MySQLの一般クエリーログについて学習したことを簡単にまとめます。
検証に使用した環境
DB:MySQL8.0
一般クエリーログとは
一般クエリーログは、mysqlの実行内容が記録されるログファイルです。
クライアントが接続/解除したときの情報に加え、クライアントから受け取ったSQLステートメントをロギングします。
そのため、何かエラーが発生した時にクライアントが送信した内容を正確に知るのに利用します。
出力先を変更でき、ログファイル、DB内のgeneral_logテーブル、または両方に出力できます。
ファイル名
ファイル名を指定しない限り、データディレクトリ内に「ホスト名(host_name).log」でファイルを作成します。
全てのログはWindows上のエラーログを除き、デフォルトでは無効化されています。
そのため、システム変数を設定して有効化する必要があります。
システム変数
general_log
一般クエリーログのロギングの有効・無効を設定できます。
「1」を指定するとロギングが有効になり、「0」を指定すると無効になります。
※「general_log」とだけ記載した引数なしの状態でも有効になります
general_log_file
ファイルロギングでデフォルト以外のファイル名を指定します。
log_output
ログの出力先を指定します。
log_outputには以下の単語をカンマ区切りで指定します。
TABLE → テーブルに出力
FILE → ファイルに出力
NONE → テーブル、ファイルに記録しない
※NONEがある場合、他よりも優先されます。
起動時にlog_outputを指定していない場合、デフォルトのロギング先はFILEになります。
log_timestamps
一般クエリーログに書き込まれるメッセージのタイムスタンプのタイムゾーンを指定します。
※スロークエリーログとエラーログにも反映されます
セッション変数
sql_log_off
現在のセッションに対する一般クエリーログのロギングを無効または有効に設定する
※一般クエリーログ自体が有効になっていることが前提
ログの内容
前述の通り、一般クエリーログには、クライアントが接続/解除したときの情報に加え、受け取ったSQLステートメントがロギングされます。
以下、
MySQLに接続して「SHOW VARIABLES;」を実行した例です。
sh-4.2# tail -f 2476896863b5.log
/usr/sbin/mysqld, Version: 8.0.29 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
2022-07-18T10:01:36.501366Z 9 Connect devuser@localhost on using Socket
2022-07-18T10:01:36.501868Z 9 Query select @@version_comment limit 1
2022-07-18T10:02:16.887064Z 9 Query SHOW VARIABLES
2022-07-18T10:02:19.546411Z 9 Quit
注意
出力順
実際に実行された順番通りに出力されるとは限らない。
パスワードの扱い
一般クエリーログにロギングされたステートメント内のパスワードは、プレーンテキストで出力しないようにサーバーによって書き換えられます。
一応、「--log-raw」オプションでパスワードの書き換えを抑制できます。
MySQLが受け取ったステートメントの正確なテキストが必要な時などに便利ですが、セキュリティー上の理由により本番用には非推奨とされています。
参考文献