MySQL sunucusunda çalıştırılan sorguları nasıl yakalayabilirim?


14

Bazı sunucu performansı hata ayıklama yapmaya çalışıyoruz ve birkaç dakikalık bir süre içinde MySQL sunucumuzda çalıştırılan sorguların bir anlık görüntüsünü yakalamak istiyorum.

MySQL en tanıdık SHOW FULL PROCESSLIST, ancak bunu bir dosyaya dökmek ve işlem sonrası böylece komut satırı üzerinden çalıştırmak istiyorum.

Bu sorguyu bir dosyaya çıkarmanın ve her saniye çalışmasını sağlamanın bir yolu var mı?

Çalıştırılan tüm sorguları yakalamanın daha iyi bir yolu var mı?

Sadece yavaş sorgularla ilgilenmiyorum (yavaş sorgu günlüğüne aşinayım).


Hangi işletim sistemini kullanıyorsunuz? Bu linux üzerinde yapmak son derece kolaydır, bu yüzden pencereleri tahmin ediyorum?
Patrick

@Patrick Linux'ta kolay olduğunu duyduğuma sevindim! Ateş etmek ...
hafichuk

1
Çoğu sorgu bir saniyeden daha kısa sürede çalışır ve biter ve asla listenizde gösterilmez.
Joel Coel

Buna ek olarak, her döngü için birçok kez daha uzun sorgular görünecektir, ancak istediğinizden emin olursanız, bash içindeki bir döngüde sadece echo show full processlist | mysqlveya daha iyisi yapabilirsiniz SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root". Birkaç satır ekleyin ve innotopor ile aynı sorgu işlevselliğini elde edeceksinizpt-kill
theist the

Yanıtlar:


10

Yavaş sorgu günlüğünü kullanırdım. Long_query_time = 0 değerini ayarlarsanız, yalnızca yavaş olanları değil, tüm sorguları yakalar.

Ayrıca burada belirtilen TCP-koklama teknikleri için geçerli olmayan TÜM sorguları da yakalar; bunlar bir soket aracılığıyla yürütülen sorguları yakalamaz. PROSESLİSTEYİ GÖSTER için Ditto; hızlı çalışan sorguları kaçırırsınız.

İşlem listesi veya TCP trafiği aracılığıyla sorguları yakalamak istiyorsanız Percona Toolkit'in pt-query-digest kullanmanızı öneririz. İşlem listesini sizin için yoklayabilir (ve bir sürü örneği kendiniz yakalarsanız yapmak çok zor olan sonuçlardan anlam çıkarabilir) ve MySQL'in TCP protokolünü yorumlayabilir, böylece bazı TCP'leri alabilirsiniz trafik ve analiz. Tabii ki, aynı zamanda şimdiye kadar yazılmış en iyi sorgu toplayıcı / profiler / muhabir, ancak bunları yakaladıktan sonra sorgularla ne yapmak istediğinizi söylemediniz.


13

En sağlam yol, tüm sorguları yakalayacak "genel sorgu günlüğünü" kullanmak olacaktır: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

MySQL sunucu sürümünü belirtmezsiniz, ancak 5.1.12 veya daha yeni bir sürümüne sahipseniz, bunu SQL aracılığıyla genel bir değişkenle etkinleştirebilir ve devre dışı bırakabilirsiniz; ayrıntılar için belgelere bakın.


Teşekkürler @ Daniel. Bunu açtık, ancak günlükte zaman damgası bilgisi yok. Oraya nasıl zaman damgası getirileceğine dair bir fikrin var mı?
hafichuk

Üzgünüm, hayır, sizi kılavuza yönlendirmekten başka bir şey yok.
Daniel Pittman

2
Long_query_time = 0 ile yavaş sorgu günlüğü daha iyi bir seçenektir; yine de tüm sorguları yakalar.
Baron Schwartz

Baron için +1: genel sorgu günlüğü, ihtiyacınız olan performans metriklerini içermez. Yavaş sorgu günlüğünü analiz etmek için MySQL sunucusuyla birlikte gelen perl betikleri de vardır (bu, değişmez değerleri tahminlerden kaldırır). Ancak, MySQL'in eski sürümlerinin 1 saniyeden daha kısa bir long_query_time değerini desteklemeyeceğini unutmayın.
symcbean


4

Elbette:

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

Şerefe


Ah ... Mysqladmin. Mükemmel, teşekkürler @ HTTP500
hafichuk

1
Bu aslında işlem listesi komutunu her 1 saniyede bir çalıştırır. Bazı çok hızlı sorgular ele geçirilmeden kaçabilir; Eğer yük birkaç büyük sorgudan oluşuyorsa işe yarayacaktır, eğer birçok küçük sorgudan oluşmuşsa çalışmayabilir.
LSerni

@Isemi, OP "her saniye" istedi.
HTTP500

4

Burası Mysql Proxy'si için bir yer olabilir . Temel olarak, gönderilen sorguları yakalamanızı (ve değiştirmenizi) sağlar. Durdurmak için temel bir kurulum oldukça kolaydır. Ardından, tüm istekleri yakalayabilmeniz için istemci yapılandırmanızı proxy'yi gösterecek şekilde değiştirin.


4

Terminal tabanlı Wireshark programı tshark yardımcı olabilir:

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

sudo yum install wiresharkAmazon Linux sudo apt-get install tsharküzerinde tshark verecek ve Ubuntu 14+ üzerinde tshark verecek


3

'Rui Pedro Bernardino'nun çözümünü kullandım. Aşağıda ayrıntılı olarak ilk satırda birkaç şey değiştirdim dışında harika çalışıyor ...

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

Ben arama ve arama ve nihayet mysql sunucusunda yürütülen gerçek zamanlı olarak tüm sorguları izlemek için MONyog indi. Dikkat edilmesi gereken tek şey "Performance_schema" ve "statements_digest" tablo etkinleştirilmesi ve Performance_schema olduğunu MySQL 5.6.14 ve üstü ile kullanılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.