Автоматический запуск mysql через cron после падения

На стартовых тарифах VDS обычно выделяется от 512 до 1024мб оперативной памяти. При размещении на таком хостинге одного или нескольких сайтов под управлением wordpress и при отсутствии корректной настройки окружения (под малые ресурсы), — может возникнуть  ситуация, когда при сколько-нибудь высокой нагрузке на сервер, mysql будет аварийно завершён из-за нехватки оперативной памяти. Процесс будет убит операционной системой и сайты перестанут работать. При входе на сайт будет выведено сообщение: Error Establishing a Database Connection. Подобное случаются не только с сайтами под управлением WP, но и с другими CMS. Интересное обсуждение этого явления в русскоязычном сообществе Drupal. Об оптимизации Apache.

Иногда падения mysqld случаются даже с настроенными VDS при некотором подобии DoS атаки, посещении сайта всевозможными спамилками и тому подобных ситуациях. Это может произойти когда угодно. До момента восстановления может пройти сколько угодно часов. За это время сайт потеряет посетителей и получит санкции от поисковых систем.

Как автоматически запустить mysql? Ниже — решение

Создадим .sh файл:

Я написал скрипт, который проверяет статус процесса mysqld (в Centos7 этот процесс именуется mariadb). Если процесс inactive, то в лог вносится соответствующая запись, процесс запускается и в лог вносится дата/время запуска.

Разрешаем запускать скрипт:

Добавляем скрипт в крон:

В конец файла добавляем строку:

 

Скрипт запускается каждую минуту, если фиксируется остановка процесса, то это вносится в лог-файл и процесс запускается.

Для проверки работы скрипта нужно остановить mysql:

 

Данное решение позволяет избежать длительного простоя сайтов. Любое падение mysql должно быть разобрано и приняты соответствующие меры.

Но и это не всё. Дело в том, что остановленный процесс может иметь статус не только inactive, но и failed. Все возможные статусы процессов можно посмотреть тут.

Для отработки этого варианта — надо добавить в скрипт проверку этого состояния и запуска процесса

 

Скрипт можно модифицировать использовав для выяснения статуса процесса команду is-active:

Команда вернёт текущий статус mariadb, который обычно active или inactive. Код выхода будет «0», если он активен, и результат будет проще парсить в скрипты оболочки.

Подробное описание работы с systemctl доступно на этой странице.

После падения mysql надо ознакомиться с логом и обязательно выяснить причины. В Centos7 лог mysql можно посмотреть следующим образом:

Также много может сказать команда:

Очень часто причина падения mysql — это нехватка памяти из-за отсутствия адекватных настроек или какие-либо ошибки/повреждения в БД.