WordPress データベース接続確立エラー

この記事は約5分で読めます。

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

 

タイトルとURLをコピーしました