web-dev-qa-db-ja.com

mysqlが死んだときに自動再起動する

私は、自分の個人プロジェクトを実行するためにレンタルしていたラックスペースサーバーを持っています。私は安いので、256MbのRAMであり、正直に多くを処理することはできません。時々、トラフィックが急激に増加すると、サーバーはプロセスの強制終了を決定し、 mysqldはkillに人気のあるもののようです。自分のサイトにアクセスしようとすると、データベース接続の確立中にエラーが発生したというメッセージが表示されます。ログを調べると、mysqldがメモリ不足のためにkillされたことがわかりました。

私はまだ昨日と同じくらい貧しく、ラックスペースVMのRAMをアップグレードしたくないので、mysqldが停止したときに自動的にmysqldを再起動するように指示する方法はありますか?

私はcrontabのようなものを使用することを考えていますが、悲しいかな、そこで何をするか正確にはわかりません。私は「Linux on your desktop」世代の製品だと思います。ほとんどのことをデスクトップとラップトップ(Linuxをほぼ排他的に実行する)で行うことができるからですが、Linuxのサーバー管理スキルはまだまだ足りません。

サーバーはCentOS 6.3を実行します

15
Los Frijoles

これはクリーンなソリューションではありません。そもそも問題を回避した方がいいでしょう。とにかく、CentOSがサービスを管理する方法はわかりませんが、serviceを使用していると思います。その場合、mysqlサービスが実行されているかどうかを確認できます

/sbin/service mysql status

このコマンドは、mysqlが実行されている場合は正常に終了し、実行されていない場合は0以外の終了ステータスを返します。したがって、このコマンドで実行されていない場合は、サービスを開始できます。

/sbin/service mysql status || service mysql start

次の行を/etc/crontabに追加して、毎分コマンドを起動できます。

* * * * * /sbin/service mysql status || service mysql start
16
terdon

これは少し不安です。

mysqld は無限ループがあるため、常に mysqld_safe によって再起動されますmysqld_safeの下部にあり、異常なシャットダウンをチェックします。エラーが非常に深刻な場合、mysqld_safeでさえ、その後の試行でmysqldを再起動できません。

mysqld_safeがそのように設計されている状況を考えると、mysqld_safeが拒否するのであれば、mysqldを強制的に開始することはお勧めできません。

エラーログはmy.cnfにある必要があります。

[mysqld]
log-error=log-filename

または

[mysqld_safe]
log-error=log-filename

テキストファイルを読み取り(おそらくtail -30 log-filenameを実行して)、mysqld処理のシャットダウンのソースを見つけます。

6
RolandoMySQLDBA

低メモリVPSで物事を稼働させ続けるための力ずくの試みで、terdomの answer の変更を使用して、MySQLをチェックして再起動しました。

/sbin/service mysqld status || service mysqld restart

これを機能させるには、mysqlmysqldに変更する必要がありました。それがないと、エラー「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

システムのルートcrontabに次の行を追加してしまいました。 MySQLが実行されているかどうかを毎分チェックし、stdoutをnullにリダイレクトします。サービスを開始しても、問題が発生しない限り何も出力されないため、最後のコマンドにnullリダイレクトを追加する必要はありません。

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

二重パイプ||ORを意味し、最初のコマンドが何らかの理由で失敗した場合に2番目のコマンドを実行します。 (ゼロより大きい終了コードを返します。)

「1番目のコマンドを実行するまたは、1番目のコマンドがなんらかの理由で失敗した場合は2番目のコマンドを実行する」と言っているようなものです。

これは、最初のコマンドが成功した場合にのみ、「最初のコマンドを実行するand」と言うような二重アンパサンド&&とは異なります。 2番目のコマンドを実行します。」.

3
Mike J

以下はからです jonnyreeves.co.uk


そして犯人はphp-fpmです!簡単なグーグルは別のWordpress顧客が同様の症状に苦しんでいることを発見しました;アドバイスはphp-fpmプール設定(/etc/php-fpm.d/www.conf)を微調整し、午後を微調整することでした)構成。主な変更点は、pm = dynamicからpm = ondemand とともに pm.max_childrenの値5(ワーカーあたり最大5%のメモリ使用量の観察に基づく)。構成を変更した後、すべてのサービスを再起動し、メモリ使用量を確認しました。

service php-fpm restart
service nginx restart
service mariadb restart

再起動後、メモリ使用量は劇的に減少しました。

1
AdrianoFerrari