На стартовых тарифах VDS обычно выделяется от 512 до 1024мб оперативной памяти. При размещении на таком хостинге одного или нескольких сайтов под управлением wordpress и при отсутствии корректной настройки окружения (под малые ресурсы), — может возникнуть ситуация, когда при сколько-нибудь высокой нагрузке на сервер, mysql будет аварийно завершён из-за нехватки оперативной памяти. Процесс будет убит операционной системой и сайты перестанут работать. При входе на сайт будет выведено сообщение: Error Establishing a Database Connection. Подобное случаются не только с сайтами под управлением WP, но и с другими CMS. Интересное обсуждение этого явления в русскоязычном сообществе Drupal. Об оптимизации Apache.
Иногда падения mysqld случаются даже с настроенными VDS при некотором подобии DoS атаки, посещении сайта всевозможными спамилками и тому подобных ситуациях. Это может произойти когда угодно. До момента восстановления может пройти сколько угодно часов. За это время сайт потеряет посетителей и получит санкции от поисковых систем.
Как автоматически запустить mysql? Ниже — решение
Создадим .sh файл:
1 |
# vi mysqlcheck.sh |
Я написал скрипт, который проверяет статус процесса mysqld (в Centos7 этот процесс именуется mariadb). Если процесс inactive, то в лог вносится соответствующая запись, процесс запускается и в лог вносится дата/время запуска.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash #check mysqld: running or stopped #if stopped then start it if systemctl status mariadb | grep inactive; then echo "mysqld stopped. We start it! status INACTIVE" systemctl status mariadb | grep inactive >> /home/user123/mysqlcheck.log systemctl start mariadb date >> /home/user123/mysqlcheck.log else echo "mysqld is running" exit 0 fi |
Разрешаем запускать скрипт:
1 |
# chmod +x mysqlcheck.sh |
Добавляем скрипт в крон:
1 |
# crontab -e |
В конец файла добавляем строку:
1 |
# */1 * * * * /root/mysqlcheck.sh |
Скрипт запускается каждую минуту, если фиксируется остановка процесса, то это вносится в лог-файл и процесс запускается.
Для проверки работы скрипта нужно остановить mysql:
1 |
# systemctl stop mariadb |
Данное решение позволяет избежать длительного простоя сайтов. Любое падение mysql должно быть разобрано и приняты соответствующие меры.
Но и это не всё. Дело в том, что остановленный процесс может иметь статус не только inactive, но и failed. Все возможные статусы процессов можно посмотреть тут.
Для отработки этого варианта — надо добавить в скрипт проверку этого состояния и запуска процесса
1 2 3 4 5 6 7 8 9 10 11 |
if systemctl status mariadb | grep failed; then echo "mysqld was stopped. We start it! status FAILED " systemctl status mariadb | grep failed >> /home/user123/mysqlcheck.log systemctl start mariadb date >> /home/user123/mysqlcheck.log else echo "mysqld is running" exit 0 fi |
Скрипт можно модифицировать использовав для выяснения статуса процесса команду is-active:
1 |
systemctl is-active mariadb |
Команда вернёт текущий статус mariadb, который обычно active или inactive. Код выхода будет «0», если он активен, и результат будет проще парсить в скрипты оболочки.
Подробное описание работы с systemctl доступно на этой странице.
После падения mysql надо ознакомиться с логом и обязательно выяснить причины. В Centos7 лог mysql можно посмотреть следующим образом:
1 |
tail -n100 /var/log/mariadb/mariadb.log |
Также много может сказать команда:
1 |
systemctl status mariadb |
Очень часто причина падения mysql — это нехватка памяти из-за отсутствия адекватных настроек или какие-либо ошибки/повреждения в БД.
Свежие комментарии