MySQLで実行された最後のクエリを表示する方法は?


471

すべてのサーバーで実行された最後のクエリを表示するクエリ/方法はありますか?

回答:


793

MySQL> = 5.1.12に恵まれている場合は、実行時にこのオプションをグローバルに制御できます。

  1. 実行する SET GLOBAL log_output = 'TABLE';
  2. 実行する SET GLOBAL general_log = 'ON';
  3. テーブルを見てください mysql.general_log

テーブルではなくファイルに出力したい場合:

  1. SET GLOBAL log_output = "FILE"; デフォルト
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

次の理由により、.cnfファイルの編集よりもこの方法を使用します。

  1. my.cnfファイルを編集しておらず、ログを永続的にオンにしている可能性があります
  2. クエリログを探すファイルシステムを探し回っているわけではありません。さらに悪いことに、完全な宛先の必要性に気を取られています。 /var/log /var/data/log /opt /home/mysql_savior/var
  3. サーバーを再起動して、サーバーへの現在の接続を中断する必要はありません。
  4. サーバーを再起動すると、開始した場所が残ります(ログはデフォルトではまだオフです)

詳細については、MySQL 5.1リファレンスマニュアル-サーバーシステム変数-general_logを参照してください。


4
素晴らしいUIデザイン。とにかく、MySQLログテーブルは実際にはCSVエンジンを使用しているので、general_logテーブルへのロギングの有効化に関する回答でFlipMcFが言ったことをすべて実行でき、次のようにgeneral_logのtail -fを使用できます。tail -f / var / lib / mysql / mysql / general_log.CSV

2
ちなみに、このためのmysqlのドキュメントでは、テーブルパラメータも撮影されていません。どうもありがとう。
Abhishek Dujari


6
終了したら、一般的なログテーブルをクリアすることを忘れないでください。「テーブルmysql.general_logを切り捨て」
pdwalker

1
この方法で結果を取得しましたが、パラメーターは疑問符で示されています。たとえば、select foo from bar where x =?です。完全なクエリを取得するにはどうすればよいですか?
okwap 2015年

43

そのような診断の一般クエリログを有効にすることができます。ただし、一般に、運用サーバーですべてのSELECTクエリをログに記録するわけではありませんが、これはパフォーマンスキラーです。

/etc/mysql/my.cnfなどのMySQL設定を編集します-このような行を探すか追加します

[mysqld]
log = /var/log/mysql/mysql.log

mysqlを再起動してその変更を取得します。

tail -f /var/log/mysql/mysql.log

ねえpresto、あなたは彼らが入ってくるクエリを見ることができます。


4
my.cnfのgeneral_log_fileおよびgeneral_log
Martin Thoma

あなたが知っているしたい場合、これは働いている再起動のmysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanheクマール

1
Mac OS Xの新しいバージョン(少なくともMac OS X)では、単に "log ="の代わりに、general_log_fileおよびgeneral_logオプションが必要です。そうしないと、次のようなエラーが発生します。ERROR / usr / local / mysql / bin / mysqld:ambiguous option '--log = / tmp / mysql_queries.log'(log-bin、log_slave_updates)
Jay Sheth

@ JaySheth、Mariadb 10.2でそのエラーが発生したため、Mac OSのみに関連しているのかわかりません。
user10089632 2018年

16

mysqlクエリログを監視するためのフローを実行できます。

mysql構成ファイルmy.cnfを開きます。

sudo nano /etc/mysql/my.cnf

[mysqld]見出しの下の次の行を検索し、これらの行のコメントを外してログを有効にします

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

mysqlサーバーを再起動して変更を反映します

sudo service mysql start

端末で次のコマンドを使用してmysqlサーバーログを監視する

tail -f /var/log/mysql/mysql.log

15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;

9

1)一般的なmysqlロギングが有効になっている場合は、構成で言及した内容に基づいて、ログファイルまたはテーブルでクエリを確認できます。次のコマンドで何が有効になっているかを確認します

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

テーブルにクエリ履歴が必要な場合

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

テーブルmysql.general_logを見てください。

ファイルに出力したい場合:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2).mysql_historyファイルcat〜/ .mysql_historyでクエリを確認することもできます



4

場合はMySQLのバイナリログが有効になっているあなたは、コマンドを確認することができビンログディレクトリをMySQLへの閲覧により、Linuxコンソールで次のコマンドを実行することで、ユーザが走りました

mysqlbinlog binlog.000001 >  /tmp/statements.sql

有効にする

[mysqld]
log = /var/log/mysql/mysql.log

または一般的なログはmysqlのパフォーマンスに影響を与えます


可能ですが、痛みを伴います。あなたが過去に何が起こったのかを見たいと思っているなら、より役に立ちます。
pdwalker 2014年


2

Paulの回答を読んだ後、https://dev.mysql.com/doc/refman/5.7/en/query-log.htmlの詳細を掘り下げました

人が本当に役立つコードを見つけました。これがコンテキストの要約です。

(注:次のコードは私のものではありません)

このスクリプトは、テーブルサイズを小さくするのに役立つテーブルをクリーンに保つための例です。1日後のように、ログのクエリは約180kになります。(ファイルでは、1日あたり30MBになります)

追加の列(event_unix)を追加する必要があり、このスクリプトを使用してログをクリーンに保つことができます...タイムスタンプをUnix-timestampに更新し、1日より古いログを削除して、event_timeをTimestampに更新しますevent_unixから...少しわかりづらいように聞こえますが、うまく機能しています。

新しい列のコマンド:

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';

クリーンアップスクリプト:

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';

クレジットはSebastian Kaiser(コードの元のライター)に提供されます。

誰かが私と同じようにそれが役立つと思うことを願っています。


面白い。最初にすべてのdbをロックしない限り、クリーンアップ中にクエリが失敗します。ここで発生する可能性のある他の問題があります。この時点で「継続的」なロギングになっている場合は、ファイルロギングまたはビンログと既成のログローテーターを使用します。
FlipMcF

1

あなたはlinuxで以下を見ることができます

cd /root

ls -al

vi .mysql_history 役立つかもしれません


6
これは、公式のコマンドラインmysqlクライアントでのみ機能し、rootユーザーによって実行されるクエリでのみ機能するようです
golimar

質問は「すべてのサーバー」と言っているため、この答えは正しくありません。これにより、単一のクライアントによって実行されたすべてのクエリが表示されます。
FlipMcF 2013

mysql binlogが有効になっている場合は、mysqlコンソールのmysql binlogディレクトリを参照して次のコマンドを実行し、ユーザーが実行したコマンドを確認できます。mysqlbinlogbinlog.000001> /tmp/statements.sql enabled [mysqld] log = / var / log / mysql / mysql.logまたはgenralログはmysqlのパフォーマンスに影響します
Avinash Singh

とにかく、これの一部のエントリはデフォルトで抑制されます。たとえば、「パスワード」を含む文字列。
mckenzm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.