WordPress 「データベース接続確立エラー」
WordPressを運用していると、時々、
「データベース接続確立エラー」
というメッセージが出ることがあります。
その名のとおり、「接続できなくなった!」ということです。
経験上、データベースが落ちている事が多いです。
原因は、メモリ不足、CPU処理能力不足などがあるのかと思います。
サーバーのスペックを上げるのは、予算が許せば簡単ですが、
「とりあえず、回復させたい」
「いつ、落ちているか不安だ」
という方には、自動回復ツールを設置しておくのがいいのかと思います。
「データベース接続確立エラー」自動回復ツール
自動回復ツールは、簡単なプログラムでできます。
以下にある、perlのプログラムを設置すれば、熟睡している間に、回復しているかと思います(笑)。
私も、これで、何度も、助かっています。
「絶体に落ちてはいけない!」という場合には、不向きな対応です。
AWSなどで、マスターと、スレーブを立ち上げて、冗長性を上げましょう!
お金がかかりますが・・・
レンタルサーバーは、「データベース接続確立エラー」を出さないように、サーバー屋さんがDBを監視しているでしょう。
たぶん・・・(笑)
「データベース接続確立エラー」実際のプログラム
以下のプログラムを「Cron」で定期実行させます(例)。
*/5 * * * * /root/db_check.pl
であれば、5分に一度、チェックをしてくれます。
苦労する事はありません、機械が監視してくれます。
自動回復ツールと思って、ゆっくり眠りましょう(笑)
DB起動コマンドと、PSファイルを格納したファイルを指定すれば大丈夫です。
以下、perlプログラムです。適宜変更してください。「起動コマンド」と「Pidファイル」と、「メール2ヶ」(1ヶでもOK)を指定すれば、コピペで動くはずです。
これで、「データベース接続確立エラー」は、障害発生後、5分後には、解消しているはずです。
#!/usr/bin/perl $server = "SampleServer"; # DBを起動するコマンドを登録 ############################ $dbstart = '/usr/local/mysql5/bin/mysqld --defaults-file=/DB/sample.cnf --user=mysql --datadir=/DB/mysql57db/ &'; # Pidのファイルを登録 ###################### $pid_f = '/DB/mysql57db/SampleServer.pid'; open(PID,"$pid_f"); $pid = <PID>; close(PID); $pid =~ s/\n$//g; $ps_cmd = "ps ax |grep ".$pid."|grep mysql"; @ps_ret = `$ps_cmd`; $restart_flag = 1; for ($i = 0 ; $i < @ps_ret ; $i++){ $ps_ret[$i] =~ s/^\s+//g; $ps_ret[$i] =~ s/\n$//g; if ($ps_ret[$i] =~ /^$pid/){ $restart_flag = 0; last; } } # プロセスがない場合、落ちたと判断してリスタート ############################################### if ($restart_flag){ $err_mes = " ps NONE\n"; $err_mes .= " pid is [$pid]\n"; $err_mes .= " ps_cmd is [$ps_cmd]\n"; $err_mes .= " dbstart is [$dbstart]\n"; system("$dbstart"); send_mail($err_mes); } sub send_mail{ my $my_mes = shift; get_current_time(); $my_sub = '[EM] DB ERR ['.$server.']'; $body = "$my_mes\n\n$server\n\n"; $body .= "$date_form1\n"; # メールで、再起動したことを通知 ################################# $mail_send_cmd = "echo \"$body\" | mail -s \"$my_sub\" (メール1) (メール2)"; system("$mail_send_cmd"); } sub get_current_time(){ local ($sec, $min, $hour, $mday, $month, $year, $day); ($sec, $min, $hour, $mday, $month, $year, $day) = localtime(time); $year = 2000 + $year - 100; $month++; $date_form1 = $year.'/'.$month.'/'.$mday.' '.$hour.':'.$min.':'.$sec; }