Автоматический перезапуск MySQL, когда он умирает

15

У меня есть сервер стойки, который я арендовал для запуска моих личных проектов. Так как я дешевый, он имеет 256 Мб оперативной памяти и, честно говоря, не может справиться много. Время от времени, когда происходит резкое увеличение трафика, сервер решает запустить процессы уничтожения, и кажется, что mysqld является популярным средством для уничтожения. Я пытаюсь зайти на свой сайт и получаю сообщение об ошибке при установлении соединения с базой данных. Проверка журналов показывает, что mysqld был убит из-за нехватки памяти.

Так как я все еще беден, как и вчера, и не хочу обновлять оперативную память моей виртуальной машины в стойке, есть ли способ, с помощью которого я могу сказать ей автоматически перезапустить mysqld, когда он умрет?

У меня есть мысль использовать что-то вроде crontab, но, увы, я точно не знаю, что там делать. Я предполагаю, что я являюсь продуктом поколения «Linux на вашем компьютере», так как я могу делать большинство вещей на своем настольном компьютере и ноутбуке (которые работают почти исключительно под Linux), но все еще не хватает навыков администрирования сервера для Linux.

Сервер работает CentOS 6.3

Лос Фрихолес
источник
какой дистрибутив? Я думаю, что выскочка будет делать это на Ubuntu
Путешественник Geek
Упс. Забыл упомянуть эту деталь: CentOS
Los Frijoles
эх. Возможно, вы захотите включить и версию
Journeyman Geek
Чтобы не отвлекать внимание от вопроса, но, возможно, долгосрочное решение состояло бы в том, чтобы вместо этого избежать условия :) Если вы просто хотите использовать простой неуправляемый VPS для своих личных проектов, вы можете получить хорошую цену на большую коробку от провайдер, который специализируется на нижнем конце. Я сделал это с большим удовлетворением. Есть много мест, где можно найти таких VPS-провайдеров, например lowendtalk.com.
Джон Чедвик

Ответы:

16

Это не чистое решение, во-первых, было бы лучше избежать этой проблемы. Во всяком случае, я не уверен, как CentOS управляет услугами, но я думаю, что он использует service. Если это так, вы можете проверить, работает ли mysqlслужба с

/sbin/service mysql status

Эта команда успешно завершится, если mysqlвыполняется, и вернет состояние выхода, отличное от 0, если i - нет. Поэтому вы можете запустить службу, если она не работает с этой командой:

/sbin/service mysql status || service mysql start

Вы можете добавить эту строку /etc/crontabдля запуска команды thes каждую минуту:

* * * * * /sbin/service mysql status || service mysql start
terdon
источник
6

Это немного беспокоит.

mysqld всегда перезапускается mysqld_safe, потому что в нижней части есть бесконечный циклmysqld_safeдля проверки на ненормальное завершение работы. Если ошибка слишком серьезная, дажеmysqld_safeне удастся перезапуститьmysqldпри последующих попытках.

Принимая во внимание ту ситуацию, mysqld_safeдля которой она предназначена, может быть плохой идеей заставить mysqldее начать, если mysqld_safeона все равно ее отвергнет.

Вам нужно найти журнал ошибок в my.cnf, он будет находиться под

[mysqld]
log-error=log-filename

или

[mysqld_safe]
log-error=log-filename

Прочитайте текстовый файл (возможно, запустив tail -30 log-filename) и найдите источник завершения обработки mysqld.

RolandoMySQLDBA
источник
Интересно ... глядя на мой журнал, он говорит, что mysqld был перезапущен, но примерно через 1-2 часа он скажет, что процесс завершился. После этого следующая запись - мой ручной запуск. Возможно, я неправильно настроил mysqld_safe?
Лос-Фриолес
3

В попытке грубой силы сохранить работоспособность VPS с низким объемом памяти я использовал модификацию ответа Тердома для проверки и перезапуска MySQL.

/sbin/service mysqld status || service mysqld restart

Мне нужно изменить , mysqlчтобы mysqldполучить его на работу. Без этого я бы получил ошибку " ERROR! MySQL is running but PID file could not be found".

В моей системе CentOS 7.2 происходит /sbin/serviceперенаправление на /bin/systemctl status, поэтому следующая команда выполняется быстрее.

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

В итоге я добавил следующую строку в корневой каталог системы. Он проверяет каждую минуту, работает ли MySQL, и перенаправляет стандартный вывод на ноль. Запуск службы не выдаст ничего, если что-то пойдет не так, поэтому нет необходимости добавлять нулевое перенаправление в последнюю команду.

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

Двойная труба ||означает ORи выполнит 2-ю команду, если первая команда каким-то образом потерпит неудачу. (Возвращает код выхода больше нуля.)

Это все равно, что сказать: «Запустите 1-ую команду или , если 1-я команда каким-то образом потерпит неудачу, запустите 2-ю команду».

Это не похоже на двойной амперсанд, &&который напоминает: «Запустите 1-ую команду, и , только если 1-я команда была успешной, запустите 2-ю команду».

Майк Дж
источник
1

Следующее от jonnyreeves.co.uk :


И виновник php-fpm! Быстрый Google нашел другого клиента Wordpress, страдающего от подобных симптомов; Совет состоял в том, чтобы настроить конфигурацию пула php-fpm (/etc/php-fpm.d/www.conf) и настроить конфигурацию pm. Основное изменение было перейти от pm = dynamicк pm = ondemandс pm.max_childrenзначением 5(на основе наблюдений ~ 5% использования памяти на одного работника). После изменения конфигурации я перезапустил все сервисы и проверил использование памяти.

service php-fpm restart
service nginx restart
service mariadb restart

После перезапуска использование памяти было резко ниже.

AdrianoFerrari
источник