Mysql Длинный список процессов и автоматический перезапуск - PullRequest
1 голос
/ 29 апреля 2020

У меня есть старый сайт, который использует большую базу данных, и я не хочу обновлять его сейчас. Проблема заключается в том, что база данных mysql выполняет некоторые запросы очень долго, когда высокий трафик c около 4000 онлайн-пользователей приводит к тому, что mysql достигает 600% -800%, и мне приходится вручную перезагружать сервер mysql с WHM. .

Я хочу использовать простой сценарий оболочки cron job, чтобы читать список процессов mysql каждые 10 секунд, и если какое-либо время процесса превышает, например, 10 секунд, этот процесс завершается.

Это запрос, который я нашел для выполнения такой задачи:

mysql -e 'SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where time>10 and command<>"Sleep"'

Я думаю, чтобы получить идентификатор процесса для уничтожения, я должен использовать:

 mysql -e 'SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST where time>10 and command<>"Sleep"'

Вывод так:

+------+
| ID   |
+------+
| 1095 |
| 1094 |
| 1081 |
| 1079 |
| 1078 |
| 1074 |
| 1040 |
| 1038 |
+------+

Теперь у меня есть эта выходная таблица, мне просто нужно обернуть эту задачу в сценарий оболочки, чтобы проанализировать эти идентификаторы процесса и уничтожить их.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вы можете сохранить выходные данные в массиве и использовать grep для фильтрации только цифр.

mapfile -t array < <(mysql .... | grep -Ewo '[[:digit:]]+')

Другой вариант - использовать while read loop

while read -r digits; do
  if [[ $digits =~ .*([[:digit:]]{4}).* ]]; then
    array+=("${BASH_REMATCH[1]}")
  fi
done < <(mysql ....)

Сейчас "${array[@]}" имеет все, что только цифры цифры.

Убейте его, проверьте, работает ли он, l oop через него по одному и т. Д.

0 голосов
/ 30 апреля 2020

Вот то, что я придумал для конкретных c пользователей баз данных "db_user", чтобы избежать системного длительного процесса, такого как резервные копии и т. Д. c:

#!/bin/bash
for i in $(mysql -Ne 'select id from information_schema.processlist where USER="db_user" and time>20 and command<>"Sleep";'); do
  mysql -e "kill ${i}"
done

сохранил его как mysql_kill_high_processes. sh и добавил его в root пользовательский cron для запуска каждую минуту.

...