MySQLサーバーで実行されるクエリをキャプチャする方法は?


14

サーバーパフォーマンスのデバッグを試みていますが、数分かけてMySQLサーバーで実行されているクエリのスナップショットをキャプチャしたいと思います。

私はMySQLに精通していますSHOW FULL PROCESSLISTが、ファイルにダンプして後処理できるように、コマンドラインからこれを実行できるようにしたいと思います。

このクエリをファイルに出力し、1秒ごとに実行する方法はありますか?

実行中のすべてのクエリをキャプチャするより良い方法はありますか?

スロークエリだけに興味があるわけではないことに注意してください(スロークエリログに精通しています)。


どのOSを実行していますか?これはLinux上で非常に簡単ですので、Windowsを推測していますか?
パトリック

@Patrick GladはLinuxで簡単だと聞いてくれました!火を
消す...-hafichuk

1
ほとんどのクエリは1秒未満で実行および終了し、リストには表示されません。
ジョエルCoel

さらに、より長いクエリがループごとに1回何度も表示されますが、bashのループでは、必要に応じてループをecho show full processlist | mysql改善できますSELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"。数行を追加すると、同じクエリ機能よりを得るでしょうinnotoppt-kill
有神論

回答:


10

スロークエリログを使用します。long_query_time = 0に設定すると、遅いクエリだけでなく、すべてのクエリをキャプチャします。

また、すべてのクエリもキャプチャしますが、これはここで説明したTCPスニッフィング技術には当てはまりません。これらは、ソケットを介して実行されるクエリをキャプチャしません。SHOW PROCESSLISTを見るのと同じです。高速で実行されるクエリを見逃すことになります。

プロセスリストまたはTCPトラフィックを介してクエリをキャプチャする場合は、Percona Toolkitのpt-query-digestを使用することをお勧めします。それはあなたのためにプロセスリストをポーリングすることができます(そして、あなたがそれのサンプルの束をキャプチャしている場合、それは非常に難しい結果から意味をなします)、そしてMySQLのTCPプロトコルを解釈できるので、いくつかのTCPをつかむことができますトラフィックと分析。もちろん、これはこれまでに書かれた最高のクエリアグリゲータ/プロファイラ/レポーターでもありますが、クエリをキャプチャした後、クエリで何をしたいかは言いませんでした。


13

最も一般的な方法は、すべてのクエリをキャプチャする「一般クエリログ」を使用することです。http//dev.mysql.com/doc/refman/5.1/en/query-log.html

MySQLサーバーのバージョンは指定しませんが、5.1.12以降を使用している場合は、SQLを介してグローバル変数で有効化および無効化できます。詳細については、ドキュメントを参照してください。


ありがとう、ダニエル。これをオンにしましたが、ログにタイムスタンプ情報はありません。そこにタイムスタンプを取得する方法はありますか?
-hafichuk

申し訳ありませんが、いいえ、マニュアルを指し示す以外に何もありません。
ダニエルピットマン

2
long_query_time = 0のスロークエリログは、より良いオプションです。それでもすべてのクエリをキャプチャします。
バロンシュワルツ

男爵の+1:一般的なクエリログには、必要なパフォーマンスメトリックが含まれていません。MySQLサーバーにバンドルされているperlスクリプトもあり、スロークエリログを分析します(述語からリテラル値を削除します)。しかし、MySQLの古いバージョンは1秒未満のlong_query_timeをサポートしないことに注意してください-その場合は、アップグレードしてください-最近のバージョンではさらに多くのパフォーマンスが強化されています。
symcbean

5

rootでこのコマンドを試してください(またはを使用してくださいsudo):

tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'

http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/が見つかりました


4

承知しました:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

乾杯


ああ... mysqladmin。パーフェクト、ありがとう@ HTTP500
hafichuk

1
これは実際には1秒ごとにprocesslistコマンドを実行します。いくつかの非常に高速なクエリでもキャプチャを回避できます。負荷が少数の大きなクエリで構成されている場合は機能し、多数の小さなクエリで構成されている場合は機能しない可能性があります。
LSerni

@ Isemi、OPは「毎秒かそこら」を要求しました。
HTTP500

3

これはMysqlプロキシの場所かもしれません。基本的に、送信されるクエリをキャプチャ(および操​​作)できます。傍受する基本的な設定は非常に簡単です。次に、すべての要求をキャプチャできるように、プロキシを指すようにクライアント構成を変更します。


3

端末ベースのWiresharkプログラムtsharkは、次のことに役立ちます。

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharkAmazon Linuxでsudo apt-get install tsharktsharkを提供し、Ubuntu 14+でtsharkを提供します


2

「Rui Pedro Bernardinoのソリューションを使用しました。以下に詳述するように、最初の行でいくつかのことを変更したことを除いて、素晴らしい動作をします...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

私は検索して検索していましたが、最終的にはmysqlサーバーで実行されるすべてのクエリをリアルタイムで監視するためにMONyogに行きました。 MySQL 5.6.14以降で利用可能です。

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