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]
Для этого давно есть Percona Toolkit и pt-kill
Если вы будите злоупотреблять убийством запросов — убьете таблицы. Апдейты хоть и происходят в транзакциях, но были случаи, когда таблицы ломались.
Вообще мне кажется, что автоматизация убийства запросов — не самый верный путь развития любого сервиса. И надо искать ошибки в сервесе, а не купировать их подобным варварским способом
Вообще мне кажется, что автоматизация убийства запросов — не самый верный путь развития любого сервиса. И надо искать ошибки в сервесе, а не купировать их подобным варварским способом
Да, но иногда бывает нужно убить запросы на сервере чтобы его оживить, а потом уже искать корень проблемы. Для таких случаев и пригодится этот скрипт.
Пример в статье убивает только SELECT-ы, хотя конечно могут быть UPDATE-ы в триггерах или функциях.
Тут может помочь KILL SOFT — вариант KILL-а из MariaDB. Он убивает только тогда, когда это не сломает таблицы. Например, если убить REPAIR, то KILL SOFT будет ждать почти до конца обработки таблицы, а просто KILL рубанет сразу и оставит таблицу нерабочей.
Тут может помочь 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.
Массовая остановка запросов