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ń).


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.


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.


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


4

Pewnie:

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

Twoje zdrowie


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.


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+


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.