Pull to refresh

Comments 9

Для таких целей, обычно, использую скрипт:

#!/bin/bash

for i in `/usr/bin/mysql -e "show full processlist" |grep "$1" |grep "$2"|grep "$3"| awk '{print $1}'`;
do
KILL_STR="kill $i";
    /usr/bin/mysql -e "$KILL_STR";
    echo $KILL_STR;
done;
echo "DONE";


Пример вызова:
./kill.sh [filter_1]  [filter_2]  [filter_3] 
Простите, вместо предпосмотра опубликовал коммент (

Этот вариант, предназначен для остановки по фильтрам. Его можно спокойно переписать под тот же «SELECT id FROM information_schema.processlist WHERE ...».

Если вы будите злоупотреблять убийством запросов — убьете таблицы. Апдейты хоть и происходят в транзакциях, но были случаи, когда таблицы ломались.
Вообще мне кажется, что автоматизация убийства запросов — не самый верный путь развития любого сервиса. И надо искать ошибки в сервесе, а не купировать их подобным варварским способом
Да, но иногда бывает нужно убить запросы на сервере чтобы его оживить, а потом уже искать корень проблемы. Для таких случаев и пригодится этот скрипт.
Пример в статье убивает только SELECT-ы, хотя конечно могут быть UPDATE-ы в триггерах или функциях.

Тут может помочь KILL SOFT — вариант KILL-а из MariaDB. Он убивает только тогда, когда это не сломает таблицы. Например, если убить REPAIR, то KILL SOFT будет ждать почти до конца обработки таблицы, а просто KILL рубанет сразу и оставит таблицу нерабочей.

А чем отличается KILL SOFT от просто_подождать, пока не закончится? Как он определяет что запросы можно или нельзя убивать?
внутри сервера сам определяет, разные критерии, серверу видней. Можно убивать, если это не вызовет table corruption.

просто-подождать можно, но это может быть гораздо дольше. Например ALTER выполняется в несколько этапов и может быть можно его прервать между ними. Или — простой пример — REPAIR TABLE t1, t2, t3; можно всегда спокойно и безопасно остановить между таблицами.
Вот одной строкой (с условиями можно поиграться):
for i in `mysql -uroot -hhost -ppassword -Ddatabase --default-character-set=utf8 -e"SELECT id FROM information_schema.processlist WHERE command='Sleep' and (state IS NULL or state='') and time>5" | grep -e'^[0-9]*$'`; do mysql -uroot -hhost -ppassword -Ddatabase --default-character-set=utf8 -e"KILL $i;"; done
Sign up to leave a comment.

Articles