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;
}


