Як я можу зупинити запущений запит MySQL?


258

Я підключаюся до mysqlсвоєї оболонки Linux. Раз у раз я запускаю SELECTзанадто великий запит. Це друкує і друкує, і я вже знаю, що це не те, що я мав на увазі. Я хотів би зупинити запит.

Удар Ctrl+C(пару разів) mysqlповністю вбиває і відводить мене назад до снарядів, тому мені доведеться знову підключитися.

Чи можна зупинити запит, не вбиваючи mysqlсебе?


1
Варто зазначити, що MySQL 5.7 підтримує тайм-аут оператора SELECT на стороні сервера. Більше інформації про це тут: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Відповіді:


462
mysql>show processlist;

mysql> kill "number from first col";

1
Дякую, я лише знав, як це зробити в phpmyadmin!
Zilverdistel

5
але mysqlдрукує ... Я не бачу підказок
David B

34
Я погоджуюся з цим базовим підходом, але я вважаю, що використання KILL QUERYв KILLцьому випадку трохи краще . Таким чином запит вбивається, але не з'єднання.
Айк Уокер

3
корисна порада, якщо ваш список процесів прокручується повз ваш буфер, - це встановити пейджер. Просто введіть "\ P більше" у відповідь. Більше про цю пораду дивіться тут dbasquare.com/2012/03/28/…
Скотт

1
Якщо ви використовуєте MySQL на AWS RDS, ви не матимете дозволу на запуск KILL, але можете запустити:CALL mysql.rds_kill(12345)
Kip

70

Просто додати

KILL QUERY **Id** де Id - ідентифікатор з'єднання show processlist

є більш кращим, якщо ви не хочете вбивати з'єднання, як правило, під час запуску з якоїсь програми.

Більш детально ви можете прочитати файл mysql тут


Питання, яке у мене було пов’язане з цим, чи з'єднання просто відновлюється, чи в кінцевому підсумку вбиття з'єднань призводить до того, що розмір пулу буде занадто малим для запуску програми?
Дядько Ірох

48

Підключення до mysql

mysql -uusername -p  -hhostname

показати повний список процесів:

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

Убити конкретний запит. Тут id = 9255451

mysql> kill 9255451;

Якщо вам відмовлено в дозволі, спробуйте цей SQL:

CALL mysql.rds_kill(9255451)

13
Примітка. Цей останній запит необхідний, якщо використовується екземпляр ADS RDS.
Кіп

13

Використовуйте mysqladminдля вбивства запиту:

Виконайте такі команди:

mysqladmin -uusername -ppassword pr

Потім запишіть ідентифікатор процесу.

mysqladmin -uusername -ppassword kill pid

Запитуючий запит більше не повинен витрачати ресурси.


9

Якщо у вас є mysqladminдоступ, ви можете отримати список запитів за допомогою:

> 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 |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

Тоді ви можете зупинити процес mysql, який розміщує тривалий запит:

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

Вам потрібно виконати наступну команду, щоб вбити процес.

> show processlist;  
> kill query processId;

Параметр запиту вказує, що нам потрібно вбити процес командного запиту.

Синтаксис процесу вбивства наступний

Убити [З'ЄДНАННЯ | QUERY] processlist_id

Будь ласка , зверніться по цьому посиланню для отримання додаткової інформації.


1

Автор цього запитання зазначає, що звичайно лише після того, як MySQL надрукує свої результати, він зрозуміє, що був виконаний неправильний запит. Як зазначалося, в цьому випадку Ctrl-Cце не допомагає. Однак я помітив, що він скасує поточний запит - якщо ви його вловите до того, як надрукується будь-який вихід. Наприклад:

mysql> select * from jos_users, jos_comprofiler;

MySQL зайнятий створенням декартового продукту з двох вищезгаданих таблиць, і ви незабаром помітите, що MySQL не надрукував жодного виводу на екран (стан процесу - Надсилання даних ), тому ви вводите Ctrl-C:

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

Ctrl-Cаналогічно можна використовувати для зупинки UPDATEзапиту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.