Bagaimana cara menangkap kueri yang dijalankan di server MySQL?

14

Kami mencoba melakukan debugging kinerja server dan saya ingin menangkap snapshot dari kueri yang dijalankan di server MySQL kami selama beberapa menit.

Saya kenal dengan MySQL SHOW FULL PROCESSLIST, namun saya ingin dapat menjalankan ini melalui baris perintah sehingga saya dapat membuangnya ke file dan memposting prosesnya.

Apakah ada cara untuk menampilkan kueri ini ke file dan menjalankannya setiap detik?

Apakah ada cara yang lebih baik untuk menangkap semua pertanyaan yang sedang dijalankan?

Perhatikan bahwa saya tidak tertarik hanya pada kueri lambat (Saya kenal dengan log kueri lambat).

hafichuk
sumber
OS apa yang Anda jalankan? Ini sangat mudah dilakukan di linux, jadi saya menebak windows?
Patrick
@ Patrick senang mendengarnya dengan mudah di linux! Tembakan ...
hafichuk
1
Sebagian besar kueri akan berjalan dan selesai dalam waktu kurang dari sedetik, dan tidak pernah muncul di daftar Anda.
Joel Coel
Selain itu, permintaan yang lebih lama akan muncul beberapa kali satu kali untuk setiap loop, tetapi pasti jika Anda mau, Anda bisa echo show full processlist | mysqlatau lebih baik SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"dalam satu loop dalam bash. Tambahkan beberapa baris dan Anda akan mendapatkan fungsionalitas permintaan yang sama dari innotopatau pt-kill
theist

Jawaban:

10

Saya akan menggunakan log permintaan lambat. Itu menangkap semua pertanyaan, bukan hanya yang lambat, jika Anda menetapkan long_query_time = 0.

Itu juga menangkap SEMUA pertanyaan, yang tidak benar dari teknik sniffing TCP yang disebutkan di sini; mereka tidak akan menangkap permintaan yang dieksekusi melalui soket. Ditto untuk menonton SHOW PROCESSLIST; Anda akan melewatkan pertanyaan yang berjalan cepat.

Jika Anda ingin menangkap kueri melalui daftar proses atau melalui lalu lintas TCP, saya sarankan menggunakan pt-query-digest Percona Toolkit. Ini dapat polling daftar proses untuk Anda (dan masuk akal dari hasilnya, yang sangat sulit dilakukan jika Anda mengambil banyak sampel itu sendiri), dan itu dapat menafsirkan protokol TCP MySQL, sehingga Anda dapat mengambil beberapa TCP lalu lintas dan menganalisisnya. Tentu saja, ini juga agregator / profiler / reporter kueri terbaik yang pernah ditulis, tetapi Anda tidak mengatakan apa yang ingin Anda lakukan dengan kueri setelah Anda menangkapnya.

Baron Schwartz
sumber
13

Cara yang paling kuat adalah dengan menggunakan "log kueri umum", yang akan menangkap semua pertanyaan: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Anda tidak menentukan versi server MySQL, tetapi jika Anda memiliki 5.1.12 atau yang lebih baru, Anda dapat mengaktifkan dan menonaktifkannya dengan variabel global melalui SQL; lihat dokumentasi untuk detailnya.

Daniel Pittman
sumber
Terima kasih @aniel. Kami telah mengaktifkan ini, namun tidak ada informasi cap waktu di log. Adakah yang tahu bagaimana mendapatkan cap waktu di sana?
hafichuk
Maaf, tidak, tidak lain mengarahkan Anda ke manual.
Daniel Pittman
2
Log kueri lambat dengan long_query_time = 0 adalah opsi yang lebih baik; masih akan menangkap semua permintaan.
Baron Schwartz
+1 untuk baron: log kueri umum tidak menyertakan metrik kinerja yang Anda butuhkan. Ada juga skrip perl yang dibundel dengan server MySQL untuk menganalisis log kueri lambat (yang menghapus nilai literal dari predikat). Tetapi perhatikan bahwa versi MySQL yang lebih lama tidak akan mendukung long_query_time kurang dari 1 detik - jika itu yang Anda lakukan kemudian tingkatkan - ada lebih banyak peningkatan kinerja di versi terbaru.
symcbean
5

Coba perintah ini sebagai root (atau gunakan 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.=" $_";
  }
}'

Ditemukan http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/

Rui Pedro Bernardino
sumber
4

Tentu:

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

Bersulang

HTTP500
sumber
Ah ... mysqladmin. Sempurna, terima kasih @ HTTP500
hafichuk
1
Ini sebenarnya menjalankan perintah processlist setiap 1 detik. Beberapa pertanyaan yang sangat cepat mungkin masih lolos dari penangkapan; jika beban terdiri dari beberapa kueri besar itu akan berfungsi, jika terdiri dari banyak kueri kecil itu mungkin tidak.
LSerni
@ Isemi, OP meminta "setiap detik".
HTTP500
4

Ini mungkin tempat untuk Proksi Mysql . Ini pada dasarnya memungkinkan Anda untuk menangkap (dan memanipulasi) kueri yang dikirim. Pengaturan dasar untuk mencegat cukup mudah. Kemudian cukup ubah konfigurasi klien Anda untuk menunjuk pada proxy sehingga Anda dapat menangkap semua permintaan.

Sakit kepala
sumber
4

Program Wireshark berbasis terminal tshark dapat membantu:

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

sudo yum install wiresharkakan memberi Anda tshark di Amazon Linux dan sudo apt-get install tsharkakan memberi Anda tshark di Ubuntu 14+

SoMoSparky
sumber
3

Saya menggunakan solusi 'Rui Pedro Bernardino. Bekerja bagus kecuali saya mengubah beberapa hal di baris pertama seperti yang dijelaskan di bawah ini ...

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.=" $_";
  }
}'
pengguna1038090
sumber
0

Saya sedang mencari dan mencari dan akhirnya saya mendarat di MONyog untuk memantau semua pertanyaan secara real-time yang dieksekusi di server mysql. Satu-satunya hal yang perlu dicatat adalah "Performance_schema" dan tabel "statement_digest" harus diaktifkan dan Performance_schema diaktifkan tersedia dengan MySQL 5.6.14 ke atas.

Mathew
sumber