一般クエリーログは、mysqld の実行内容の一般的な記録です。サーバーは、クライアントが接続または接続解除したときに情報をこのログに書き込み、クライアントから受け取った各 SQL ステートメントをログに記録します。一般クエリーログは、クライアント側でエラーが疑われるとき、クライアントが mysqld に送信した内容を正確に知りたい場合に非常に役立つことがあります。
mysqld は、ステートメントを受け取った順にクエリーログに書き込みますが、ステートメントが実行された順番とは異なることがあります。このロギング順序はバイナリログの順序とは対照的で、バイナリログの場合、ステートメントはそれが実行されたあと、ロックがリリースされる前に書き込まれます。さらに、クエリーログはデータを選択するだけのステートメントを格納することもあり、そのようなステートメントはバイナリログには一切書き込まれません。
ステートメントベースのロギングを使用する場合、すべてのステートメントはクエリーログに書き込まれますが、行ベースのロギングを使用する場合、更新は SQL ステートメントではなく行の変更として送信されるため、binlog_format
が ROW
のときは、これらのステートメントはクエリーログに一切書き込まれません。使用されるステートメントによっては、この変数が MIXED
に設定された場合、所定の更新がクエリーログに書き込まれないこともあります。詳細については、セクション17.1.2.1「ステートメントベースおよび行ベースレプリケーションのメリットとデメリット」を参照してください。
デフォルトでは、一般クエリーログは無効になっています。初期の一般クエリーログ状態を明示的に指定するには、--general_log[={0|1}]
を使用します。引数を指定しないか、引数が 1 の場合、--general_log
によってログが有効になります。引数が 0 の場合、このオプションによってログが無効になります。ログファイル名を指定するには、--general_log_file=
を使用します。ログの出力先を指定するには、(セクション5.2.1「一般クエリーログおよびスロークエリーログの出力先の選択」で説明されている) file_name
--log-output
を使用します。
一般クエリーログファイルの名前を指定しない場合、デフォルト名は
です。サーバーは、別のディレクトリを指定する絶対パス名が指定されないかぎり、データディレクトリ内にファイルを作成します。
host_name
.log
実行時に一般クエリーログを無効化または有効化したり、ログファイル名を変更したりするには、グローバルな general_log
および general_log_file
システム変数を使用します。general_log
を 0 (または OFF
) に設定するとログが無効化され、1 (または ON
) にすると有効化されます。ログファイルの名前を指定するには、general_log_file
を指定します。ログファイルがすでに開いている場合、ログファイルが閉じて新しいファイルが開きます。
一般クエリーログが有効な場合、サーバーは --log-output
オプションまたは log_output
システム変数によって指定されたあらゆる出力先に出力を書き込みます。ログを有効にすると、サーバーはログファイルを開き、ログファイルに起動メッセージを書き込みます。ただし、FILE
ログの出力先が選択されないかぎり、ファイルに対するそれ以上のクエリーのロギングは実行されません。出力先が NONE
の場合、一般ログが有効な場合であってもサーバーはクエリーを書き込みません。ログ出力先の値に FILE
が含まれていない場合、ログファイル名を設定してもロギングへの影響はありません。
サーバー再起動およびログフラッシュを行なっても、新しい一般クエリーログファイルは生成されません (ただし、フラッシュではファイルが閉じて再オープンします)。ファイルを名前変更して新しいファイルを作成するには、次のコマンドを使用します。
shell> mv host_name.log host_name-old.log
shell> mysqladmin flush-logs
shell> mv host_name-old.log backup-directory
Windows では、mv の代わりに rename を使用してください。
また、ログを無効にすることによって、実行時に一般クエリーログファイルを名前変更することができます。
SET GLOBAL general_log = 'OFF';
ログが無効化されている場合、コマンド行などの外部からログファイルを名前変更してください。そのあと、ログをふたたび有効にします。
SET GLOBAL general_log = 'ON';
この方法はすべてのプラットフォームで動作し、サーバー再起動を必要としません。
セッション変数 sql_log_off
を ON
または OFF
に設定して、現在の接続についての一般クエリーロギングを無効化または有効化することができます。
MySQL 5.6.3 以降では、一般クエリーログに書き込まれるステートメントのパスワードはサーバーによって書き換えられ、文字どおりに平文で表示されることはありません。一般クエリーログについてのパスワードの書き換えは、--log-raw
オプションでサーバーを起動することによって抑制できます。このオプションは、サーバーによって受け取られるステートメントの正確なテキストを表示する際の診断目的で役立つ場合がありますが、セキュリティー上の理由で本番用途では推奨されません。
MySQL 5.6.3 より前では、ステートメント内のパスワードは書き換えられないため、一般クエリーログを保護するようにしてください。セクション6.1.2.3「パスワードおよびロギング」を参照してください。
MySQL 5.6.3 でのパスワード書き換えの導入による 1 つの影響として、(構文エラーなどが理由で) 構文解析できないステートメントがパスワードなしであることを認識できないため、一般クエリーログに書き込まれなくなるということがあります。エラーを持つものを含むすべてのステートメントのロギングを必要とする使用例では、--log-raw
オプションを使用しますが、このオプションはパスワードの書き込みをバイパスすることにも留意してください。