Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


5.2.3 一般クエリーログ

一般クエリーログは、mysqld の実行内容の一般的な記録です。サーバーは、クライアントが接続または接続解除したときに情報をこのログに書き込み、クライアントから受け取った各 SQL ステートメントをログに記録します。一般クエリーログは、クライアント側でエラーが疑われるとき、クライアントが mysqld に送信した内容を正確に知りたい場合に非常に役立つことがあります。

mysqld は、ステートメントを受け取った順にクエリーログに書き込みますが、ステートメントが実行された順番とは異なることがあります。このロギング順序はバイナリログの順序とは対照的で、バイナリログの場合、ステートメントはそれが実行されたあと、ロックがリリースされる前に書き込まれます。さらに、クエリーログはデータを選択するだけのステートメントを格納することもあり、そのようなステートメントはバイナリログには一切書き込まれません。

ステートメントベースのロギングを使用する場合、すべてのステートメントはクエリーログに書き込まれますが、行ベースのロギングを使用する場合、更新は SQL ステートメントではなく行の変更として送信されるため、binlog_formatROW のときは、これらのステートメントはクエリーログに一切書き込まれません。使用されるステートメントによっては、この変数が MIXED に設定された場合、所定の更新がクエリーログに書き込まれないこともあります。詳細については、セクション17.1.2.1「ステートメントベースおよび行ベースレプリケーションのメリットとデメリット」を参照してください。

デフォルトでは、一般クエリーログは無効になっています。初期の一般クエリーログ状態を明示的に指定するには、--general_log[={0|1}] を使用します。引数を指定しないか、引数が 1 の場合、--general_log によってログが有効になります。引数が 0 の場合、このオプションによってログが無効になります。ログファイル名を指定するには、--general_log_file=file_name を使用します。ログの出力先を指定するには、(セクション5.2.1「一般クエリーログおよびスロークエリーログの出力先の選択」で説明されている) --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_offON または OFF に設定して、現在の接続についての一般クエリーロギングを無効化または有効化することができます。

MySQL 5.6.3 以降では、一般クエリーログに書き込まれるステートメントのパスワードはサーバーによって書き換えられ、文字どおりに平文で表示されることはありません。一般クエリーログについてのパスワードの書き換えは、--log-raw オプションでサーバーを起動することによって抑制できます。このオプションは、サーバーによって受け取られるステートメントの正確なテキストを表示する際の診断目的で役立つ場合がありますが、セキュリティー上の理由で本番用途では推奨されません。

MySQL 5.6.3 より前では、ステートメント内のパスワードは書き換えられないため、一般クエリーログを保護するようにしてください。セクション6.1.2.3「パスワードおよびロギング」を参照してください。

MySQL 5.6.3 でのパスワード書き換えの導入による 1 つの影響として、(構文エラーなどが理由で) 構文解析できないステートメントがパスワードなしであることを認識できないため、一般クエリーログに書き込まれなくなるということがあります。エラーを持つものを含むすべてのステートメントのロギングを必要とする使用例では、--log-raw オプションを使用しますが、このオプションはパスワードの書き込みをバイパスすることにも留意してください。


User Comments
  Posted by Jason Bibbings on January 14, 2011
On Windows, I could not get the Log Files to work using the default path of "C:/Program Files (x86)/MySQL/MySQL Server 5.1"

This was on Windows Server 2008 using 32-bit MySQL version 5.1.49

Moving the logs out of that directory and into the root C: fixed the issue for me. All I can figure is the logs don't like the parentheses in (x86), I've seen this a couple times before.

Anyway if it helps anyone, my current working my.ini file on Windows now looks like this:

[mysqld]
# Set Slow Query Log
long_query_time = 1
slow_query_log = 1
slow_query_log_file = "C:/slowquery.log"

#Set General Log
log = "C:/genquery.log"

  Posted by Greg Schretter on November 16, 2011
Correct most system do not like "()" also the "." might cause issues, but it might be a good idea to have the files written some where else besides root. Maybe C:\MySql\Logs\(different sub-directory names base on category). Root should be locked down on Windows servers. Hope this helps..

  Posted by Jakob Langgaard on April 21, 2012
The reason why the log file won't work in "C:/Program Files (x86)/MySQL/MySQL Server 5.1" is because programs need to be run with administrator privileges to be able to write or modify files within the program files folder.
  Posted by Programmer Old on April 3, 2013
Find "datadir" in "my.ini": for me the line is
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"

Likly that something along this path is what you want
  Posted by Sebastian Kaiser on September 9, 2015
#
Example: Cleanup log:
I am logging into my database itself... but after 1 day, there will be about 180k queries of log. ( in a file, it would be 30MB per day <.<)
This script is an example to keep the table clean ;) even if you forgot it for a week or 2 you can cleanup even then ;)
You need to add an additional column (event_unix) and then you can use this script to keep the log clean... it will update the timestamp into a Unix-timestamp, delete the logs older than 1 day and then (i don't know why, but in my log, the event_time is setted into the actual time) update the event_time into Timestamp from event_unix... sounds a bit confusing, but it's working great :D Would use it as an event, but the event is disallowe the change from general_log...

Commands for the new column:
"
SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';
#

cleanup script =>

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

##
Hope you like it ;)

Regards, S.K.
Sign Up Login You must be logged in to post a comment.