Jak mogę zatrzymać działające zapytanie MySQL?


258

Łączę się mysqlz mojej powłoki Linux. Od czasu do czasu uruchamiam SELECTzbyt duże zapytanie. Drukuje i drukuje i już wiem, że nie o to mi chodziło. Chciałbym zatrzymać zapytanie.

Trafienie Ctrl+C(kilka razy) zabija mysqlcałkowicie i zabiera mnie z powrotem do powłoki, więc muszę się ponownie połączyć.

Czy można zatrzymać zapytanie bez samobójstwa mysql?


1
Warto wspomnieć, że MySQL 5.7 obsługuje limit czasu instrukcji SELECT po stronie serwera. Więcej informacji na ten temat tutaj: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Odpowiedzi:


462
mysql>show processlist;

mysql> kill "number from first col";

1
Dzięki, wiedziałem, jak to zrobić w phpmyadmin!
Zilverdistel

5
ale mysqldrukuje ... Nie widzę monitu
David B

34
Zgadzam się z tym podstawowym podejściem, ale myślę, że w tym przypadku KILL QUERYnieco lepiej jest używać KILL. W ten sposób zapytanie zostaje zabite, ale nie połączenie.
Ike Walker

3
Przydatną wskazówką, jeśli lista procesów przewija się obok bufora, jest ustawienie pagera. Po prostu wpisz „\ P więcej” w wierszu polecenia. Więcej informacji na ten temat można znaleźć
Scott

1
Jeśli używasz MySQL na AWS RDS, nie będziesz mieć uprawnień do uruchamiania KILL, ale możesz uruchomić:CALL mysql.rds_kill(12345)
Kip

70

Tylko dodać

KILL QUERY **Id** skąd Id to identyfikator połączenia show processlist

jest bardziej zalecane, jeśli nie chcesz przerywać połączenia zwykle podczas uruchamiania z jakiejś aplikacji.

Aby uzyskać więcej informacji, możesz przeczytać dokument mysql tutaj


Pytanie z tym związane, czy połączenie odradza się ponownie, czy też zabijanie połączeń ostatecznie powoduje, że rozmiar puli jest zbyt mały, aby aplikacja mogła działać?
Wujek Iroh

48

Połącz z mysql

mysql -uusername -p  -hhostname

pokaż pełną listę procesów:

mysql> show full processlist;
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| Id      | User   | Host              | db      | Command | Time | State | Info             |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| 9255451 | logreg | dmin001.ops:37651 | logdata | Query   |    0 | NULL  | show processlist |
+---------+--------+-------------------+---------+---------+------+-------+------------------+

Zabij określone zapytanie. Tutaj id = 9255451

mysql> kill 9255451;

Jeśli otrzymasz odmowę dostępu, wypróbuj ten SQL:

CALL mysql.rds_kill(9255451)

13
Uwaga: To ostatnie zapytanie jest wymagane, jeśli używana jest instancja AWS RDS.
Kip

13

Użyj, mysqladminaby zabić niekontrolowane zapytanie:

Uruchom następujące polecenia:

mysqladmin -uusername -ppassword pr

Następnie zanotuj identyfikator procesu.

mysqladmin -uusername -ppassword kill pid

Uciekające zapytanie nie powinno już zużywać zasobów.


9

Jeśli masz mysqladmindostępne, możesz uzyskać listę zapytań z:

> mysqladmin -uUSERNAME -pPASSWORD pr

+-----+------+-----------------+--------+---------+------+--------------+------------------+
| Id  | User | Host            | db     | Command | Time | State        | Info             |
+-----+------+-----------------+--------+---------+------+--------------+------------------+
| 137 | beet | localhost:53535 | people | Query   | 292  | Sending data | DELETE FROM      |
| 145 | root | localhost:55745 |        | Query   | 0    |              | show processlist |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

Następnie możesz zatrzymać proces mysql, który obsługuje długo działające zapytanie:

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

Musisz uruchomić następujące polecenie, aby zabić proces.

> show processlist;  
> kill query processId;

Parametr zapytania określa, że ​​musimy zabić proces polecenia zapytania.

Składnia procesu zabijania jest następująca

KILL [POŁĄCZENIE | QUERY] processlist_id

Aby uzyskać więcej informacji, zapoznaj się z tym linkiem.


1

Autor tego pytania wspomina, że ​​zwykle dopiero po wydrukowaniu przez MySQL danych wyjściowych zdaje sobie sprawę, że wykonane zostało nieprawidłowe zapytanie. Jak wspomniano, w tym przypadku Ctrl-Cnie pomaga. Zauważyłem jednak, że przerwie bieżące zapytanie - jeśli złapiesz je przed wydrukowaniem jakiegokolwiek wyniku. Na przykład:

mysql> select * from jos_users, jos_comprofiler;

MySQL jest zajęty generowaniem produktu kartezjańskiego z powyższych dwóch tabel i wkrótce zauważysz, że MySQL nie wydrukował żadnych danych wyjściowych na ekranie (stan procesu to Wysyłanie danych ), więc wpisujesz Ctrl-C:

Ctrl-C -- sending "KILL QUERY 113240" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted

Ctrl-Cpodobnie można użyć do zatrzymania UPDATEzapytania.

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.