Как я могу остановить запущенный MySQL запрос?


258

Я подключаюсь mysqlиз моей оболочки Linux. Время от времени я запускаю SELECTслишком большой запрос. Он печатает и печатает, и я уже знаю, что это не то, что я имел в виду. Я хотел бы остановить запрос.

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

Можно ли остановить запрос, не убивая mysqlсебя?


1
Стоит отметить, что MySQL 5.7 поддерживает время ожидания оператора SELECT на стороне сервера. Больше информации об этом здесь: mysqlserverteam.com/server-side-select-statement-timeouts
Морган Токер

Ответы:


462
mysql>show processlist;

mysql> kill "number from first col";

1
Спасибо, я только знал, как это сделать в phpmyadmin!
Зилвердистел

5
но mysqlпечатает ... Я не вижу подсказку
Дэвид Б.

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

3
Полезный совет, если ваш список процессов прокручивается мимо вашего буфера, это установить пейджер. Просто введите «\ P more» в командной строке. Подробнее об этом читайте
Скотт

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
Примечание. Последний запрос необходим при использовании экземпляра AWS 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 указывает, что нам нужно убить процесс запроса команды.

Синтаксис для процесса уничтожения выглядит следующим образом

УБИТЬ [СОЕДИНЕНИЕ | 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.