Jak przechwytywać zapytania uruchamiane na serwerze MySQL?

14

Próbujemy przeprowadzić debugowanie wydajności serwera i chciałbym uchwycić migawkę zapytań uruchamianych na naszym serwerze MySQL w ciągu kilku minut.

Znam MySQL SHOW FULL PROCESSLIST, jednak chciałbym móc uruchomić to za pomocą wiersza poleceń, aby móc zrzucić go do pliku i przetworzyć.

Czy istnieje sposób na wyprowadzenie tego zapytania do pliku i uruchamianie go co sekundę?

Czy istnieje lepszy sposób na przechwycenie wszystkich uruchomionych zapytań?

Zauważ, że nie interesują mnie tylko powolne zapytania (znam powolny dziennik zapytań).

hafichuk
źródło
Z jakiego systemu operacyjnego korzystasz? Jest to niezwykle łatwe w Linuksie, więc zgaduję okna?
Patrick
@Patrick Cieszę się, że Linux jest łatwy! Odpal ...
hafichuk,
1
Większość zapytań zostanie uruchomiona i zakończona w czasie krótszym niż sekunda i nigdy nie będzie wyświetlana na liście.
Joel Coel
dodatkowo dłuższe zapytania pojawią się wiele razy dla każdej pętli, ale na pewno, jeśli chcesz, możesz po prostu echo show full processlist | mysqllub lepiej SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"w pętli w bash. Dodać kilka wierszy i dostaniesz taką samą funkcjonalność zapytań niż innotoplub pt-kill
Theist

Odpowiedzi:

10

Chciałbym użyć dziennika powolnych zapytań. Przechwytuje wszystkie zapytania, nie tylko te, które są wolne, jeśli ustawisz long_query_time = 0.

Przechwytuje również WSZYSTKIE zapytania, co nie jest prawdą w przypadku wspomnianych tutaj technik podsłuchu TCP; nie przechwycą one zapytań wykonanych przez gniazdo. To samo dotyczy oglądania SHOW PROCESSLIST; przegapisz szybko działające zapytania.

Jeśli chcesz przechwytywać zapytania za pośrednictwem listy procesów lub ruchu TCP, sugerowałbym użycie Per -ona-Toolkit-pt-query-digest. Może sondować listę procesów dla Ciebie (i mieć sens z wyników, co jest bardzo trudne, jeśli sam przechwytujesz kilka próbek), a także może interpretować protokół TCP MySQL, abyś mógł pobrać trochę TCP ruch i analizuj go. Oczywiście jest to również najlepszy agregator zapytań / profiler / reporter, jaki kiedykolwiek napisano, ale nie powiedziałeś, co chcesz zrobić z zapytaniami po ich przechwyceniu.

Baron Schwartz
źródło
13

Najsolidniejszym sposobem byłoby użycie „ogólnego dziennika zapytań”, który przechwytuje wszystkie zapytania: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Nie określasz wersji serwera MySQL, ale jeśli masz wersję 5.1.12 lub nowszą, możesz ją włączać i wyłączać za pomocą zmiennej globalnej za pomocą SQL; szczegóły w dokumentacji.

Daniel Pittman
źródło
Dzięki @Daniel. Włączyliśmy to, jednak w dzienniku nie ma informacji o znacznikach czasu. Masz pomysł, jak zdobyć tam znacznik czasu?
hafichuk
Przepraszamy, nie, nic innego jak wskazanie ci instrukcji.
Daniel Pittman
2
Wolniejszym dziennikiem zapytań z long_query_time = 0 jest lepszym rozwiązaniem; nadal będzie przechwytywać wszystkie zapytania.
Baron Schwartz
+1 dla barona: ogólny dziennik zapytań nie zawiera wymaganych parametrów wydajności. Istnieją również skrypty perla dołączone do serwera MySQL do analizy dzienników wolnych zapytań (które usuwają dosłowne wartości z predykatów). Należy jednak pamiętać, że starsze wersje MySQL nie będą obsługiwały długiego_pytania_czasu krótszego niż 1 sekunda - jeśli tak właśnie jest, należy dokonać aktualizacji - w najnowszych wersjach jest znacznie więcej ulepszeń wydajności.
symcbean
5

Wypróbuj to polecenie jako root (lub użyj 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.=" $_";
  }
}'

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

Rui Pedro Bernardino
źródło
4

Pewnie:

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

Twoje zdrowie

HTTP500
źródło
Ach ... mysqladmin. Idealne, dzięki @ HTTP500
hafichuk
1
To faktycznie uruchamia polecenie processlist co 1 sekundę. Niektóre bardzo szybkie zapytania mogą nadal uchwycić przechwytywanie; jeśli ładunek składa się z kilku dużych zapytań, zadziała, jeśli składa się z wielu małych zapytań, może nie.
LSerni,
@Isemi, OP poprosił o „co sekundę”.
HTTP500
4

To może być miejsce dla serwera proxy MySQL . Zasadniczo umożliwia przechwytywanie (i manipulowanie) wysyłanych zapytań. Podstawowa konfiguracja przechwytywania jest dość łatwa. Następnie wystarczy zmienić konfigurację klienta, aby wskazywała na serwer proxy, aby można było przechwytywać wszystkie żądania.

Zoredache
źródło
4

Program tshark oparty na terminalach może pomóc:

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

sudo yum install wiresharkda tshark na Amazon Linux i sudo apt-get install tsharkda tshark na Ubuntu 14+

SoMoSparky
źródło
3

Użyłem rozwiązania „Rui Pedro Bernardino”. Działa świetnie, ale zmieniłem kilka rzeczy w pierwszej linii, jak wyszczególniono poniżej ...

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.=" $_";
  }
}'
użytkownik1038090
źródło
0

Szukałem i szukałem, aż w końcu wylądowałem w MONyogu, aby monitorować wszystkie zapytania w czasie rzeczywistym, które są wykonywane na serwerze mysql. Jedyną rzeczą, na którą należy zwrócić uwagę, jest włączenie tabeli „Performance_schema” i „statement_digest” i Performance_schema to dostępne z MySQL 5.6.14 i nowszymi.

Mathew
źródło