MySQLクエリログを有効にする方法


252

クライアントから受信した各SQLクエリステートメントとそのクエリステートメントが送信した時間をログに記録するMySQL関数を有効にするにはどうすればよいですか?phpmyadminまたはNaviCatでそれを行うことはできますか?ログを分析するにはどうすればよいですか?

回答:


301

まず、このログファイルは、ビジー状態のサーバーでは非常に大きくなる可能性があることに注意してください。

mysql <5.1.29の場合:

クエリログを有効にするには、この中を置く/etc/my.cnf[mysqld]セクション

log   = /path/to/query.log  #works for mysql < 5.1.29

また、MySQLコンソールから有効にするには

SET general_log = 1;

http://dev.mysql.com/doc/refman/5.1/en/query-log.htmlを参照してください

mysql 5.1.29以降の場合

mysql 5.1.29+では、このlogオプションは廃止されています。ログファイルを指定してロギングを有効にするには、[mysqld]セクションのmy.cnfでこれを使用します。

general_log_file = /path/to/query.log
general_log      = 1

または、MySQLコンソールからロギングをオンにします(ログファイルの場所を何らかの方法で指定するか、デフォルトの場所を見つける必要があります)。

SET global general_log = 1;

また、遅いクエリ、またはインデックスを使用しないクエリのみをログに記録する追加オプションがあることにも注意してください。


1
これはMySQL 5.6.19では機能しません。彼らは再びそれを変更しましたか?
Alex R

5
general_log = on general_log_file = / path / to / query.logが機能しました
Siva

27
これは、(Windows上のMySQL 5.6.12)私の仕事:SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
youenが

ログファイルのmysqlユーザーアクセス権限を確認してください。そうしないと、MySQLコンソールでgeneral_logパラメーターを設定するときに「見つかりません」エラーが返されます
Will R.

5.6.22の場合、@ youenはそれを正しく理解しました。ありがとう!確認する唯一のことは、書き込まれるディレクトリとファイルが存在し、mysqlによって書き込み可能であることです。
NightOwlPrgmr 2018

189

別の関連する質問に対するこの回答を見てください。再起動せずにライブサーバーのログを有効化、無効化、および確認する方法を示します。

mysqlにすべてのクエリを記録する


ここに要約があります:

MySQLサーバーが不要または再起動できない場合は、実行中のサーバーで次のように処理できます。

  • ログテーブルを作成します(回答を参照)

  • データベースでクエリログを有効にします(文字列 'table'は文字どおりに配置し、テーブル名で置き換えないようにしてください。おかげでNicholas Pickering

SET global general_log = 1;
SET global log_output = 'table';
  • ログを見る
select * from mysql.general_log;
  • データベースのクエリロギングを無効にする
SET global general_log = 0;

19
「テーブル」は文字どおりに入力するためのものであり、データベース内のテーブル名で置き換えられるものではないことに注意してください。
ニコラスピカリング2013

1
Mac OS Xでは、MySQLソフトウェアインストーラーがCSVタイプのgeneral_logテーブルを自動的に作成したようです。これは、対応するCSVファイルをテールすることもできることを意味します:sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

グローバルlog_output = 'table'を設定した後; 遅いクエリはファイルに書き込みますか?SET global general_log = 0の後と思います。あなたはそれが可能性BE「ファイル」、前回の「log_output」の値を設定する必要があります
user2602807

59

さまざまなページの読み込みをすばやく最適化したい場合は、この方法でログを記録します。ちょっとしたヒントです...

TABLEへのロギング

SET global general_log = 1;
SET global log_output = 'table';

次に、私のmysql.general_logテーブルから選択して、最近のクエリを取得できます。

その後tail -f、mysql.log と同様のことを行うことができますが、さらに改良されています...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

これにより、自分のクエリを簡単に確認して、削減することができます。8秒間隔を使用して、最後の8秒以内に実行されたクエリのみをフェッチします。


57

これはすでにコメントにありましたが、独自の答えに値します:構成ファイルを編集せずに:mysqlで、rootとして、

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

後でオフにすることを忘れないでください:

SET global general_log = off;

1
Linux systemdで、にファイルにログを記録しようとすると/tmp/、最終的に次のような場所になることがあります/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley

15

(すべてのクエリを記録する)一般的なクエリログを無効または有効にできます。

SET GLOBAL general_log = 1 # (or 0 to disable)

私の場合、共有ホスティングサーバーで一般クエリログを有効にできません。スロークエリログのみを有効にすることができ、システム管理者はリクエストに応じてアカウントに関連するエントリを提供できます。
Feng-Chun Ting

9

また、MySQLログファイルでクエリを表示できるようにしたかったので、以下の手順でこれを解決しました

  1. に行く /etc/mysql/mysql.conf.d
  2. mysqld.cnfを開きます

以下の行を有効にします

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. このコマンドでMySQLを再起動します /etc/init.d/mysql restart
  2. /var/log/mysql/ログに移動して確認する

MySQLが起動するたびに適用されるように、これらの設定をconfファイルに保存しても問題ありませんが、この構成を適用するためにMySQLを再起動する必要はありません。他の人が言ったように「SETグローバル」を使用して設定できます。
エンジェル


3

Windowsでは、単純に

C:\wamp\bin\mysql\mysql5.1.53\my.ini

この行をmy.iniに挿入します

general_log_file = c:/wamp/logs/mysql_query_log.log

my.iniファイルは、最終的にはこのようになります

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...

3

MySQL 5.6バージョンにバグがあります。mysqldでも次のように表示されます。

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

実際の設定は次の順序で読み取っています:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

ファイルを確認してください: "C:\ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

それが誰かを助けることを願っています。


このバグのどこかにバグレポートがありますか?
mwfearnley

1

ため> = 5.5のMySQLだけ遅いクエリの(1秒以上) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes

1
これは誤りです。クエリログではなく、スロークエリログが有効になります。
Sam Dufel、2014

ダッシュを使う必要があると思います。
AFA Med

1

MACマシンでクエリログを有効にするには:

次のファイルを開きます。

vi /private/etc/my.cnf

次のように、「mysqld」セクションの下にクエリログのURLを設定します。

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

いくつかのマシンはクエリを適切にロギングしていません。そのため、MySQLコンソールから有効にできます。

mysql> SET global general_log = 1;

1

質問はすでに素晴らしい答えを持っているので、質問に対する正確な答えではありません。これは副次的な情報です。general_logを有効にすると、MySQLのパフォーマンスが低下します。私はgeneral_log =1誤って運用サーバーに立ち去り、パフォーマンスが他のサーバーの同様のセットアップに匹敵しない理由を見つけるのに何時間も費やしました。次に、これを見つけて、一般的なログを有効にすることの影響を説明します。http://www.fromdual.com/general_query_log_vs_mysql_performance

ストーリーの要点general_log=1.cnfファイルに入れないでください。代わりset global general_log =1に、あなたが見つけようとしていることを見つけ、それをオフにするのに十分なログを取るために、短い期間使用してください。


0

phpMyAdmin 4.0では、[ステータス]> [監視]に移動します。そこでは、低速クエリログと一般ログを有効にし、ライブモニターを表示し、グラフの一部を選択し、関連クエリを表示して分析できます。


0

一般的なログを一度に削除して再作成する必要がありました。レクリエーション中に、文字セットがめちゃくちゃになり、ログに次のエラーが表示されました。

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

したがって、「ロギングがオンになっていることを確認する」という標準的な回答が機能しない場合は、フィールドに適切な文字セットがあることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.