Na pewno wpadliście kiedyś w pułapkę, w której podczas testowania wydajności / sposobu działania wpisaliście w okienko phpMyAdmina lub bezpośrednio w konsolę MySQLa nie do końca przemyślane zapytanie. Jeśli zawierało jakiś błąd składniowy, to sprawa jest prosta – na ekranie szybko pojawił się błąd. Co jednak w przypadku tych zapytań, które „mieliły się” przez dobre kilkanaście minut lub po prostu nie miały szans na zakończenie (w sensownym czasie) ze względu na dostępne zasoby systemowe? Jeśli zechcecie przeczytać niniejszy artykuł, powiem Wam co można z tym zrobić.

Dla ścisłości: restart serwera oczywiście jest pewną opcją, ale to raczej ostateczność, do której powinniśmy uciekać się jak najrzadziej. To tak, jakbyście burzyli cały dom tylko dlatego, że jeden pokój ma krzywe ściany. :)

Aby przerwać działanie zapytania w trakcie przetwarzania w cywilizowany sposób, musimy zdobyć jego wewnętrzny identyfikator – z pomocą przychodzi tutaj zapytanie:

SHOW FULL PROCESSLIST;

Przykładowy zrzut wyniku jego wykonania w phpMyAdminie:

Jak widać, mamy od razu możliwość „unicestwienia” (jak to brzmi: „unicestwić” zapytanie :)) zapytania, czyli przerwania go bez „brudzenia rąk” fizyczną pracą – klepaniem w konsoli. BTW Usunąłem tu kolumny User, Host, Db i Command, żeby obrazek zmieścił się ładnie we wpisie.

Jeśli znajdziemy w tej tabeli wpis z naszym „feralnym” zapytaniem (kolumna Time przedstawia nam ilość sekund, jaką „wisi” ono w systemie), odczytujemy liczbową wartość identyfikatora i wykonujemy:

KILL QUERY <ID>;

za <ID> podstawiamy odczytany numer, a więc jeśli chcielibyśmy przerwać ostatnie z przedstawionej wyżej tabeli, musielibyśmy wykonać:

KILL QUERY 34936;

Tym sposobem przywrócimy serwer do życia pozwalając na wykonywanie kolejnych zapytań. Można też pominąć słowo kluczowe QUERY, wtedy zapytanie przyjmie postać:

KILL 34936;

jednak warto przeczytać stronę manuala zapytania KILL, żeby wiedzieć, jakie są tego konsekwencje – ja staram się zawsze pisać kod jak najbardziej szczegółowo (konia z rzędem za dobre tłumaczenie słowa „verbose”), także sam używam raczej pierwszego rozwiązania.

Na koniec mały żarcik w temacie Facebooka - jeśli masz pytanie – lajk, jeśli nie masz – komentarz. :) Ok, nie był śmieszny, trudno się mówi. Do zobaczenia w kolejnym wpisie!