WordPress – データベース バックアップ

このサイトは、当方の自作サーバーで動いているので、レンタルサーバーのような制約が無い。
レンタルサーバを借りたことがないので、どこまでレンタルサーバーでどこまで制約があるか分からないが・・・
以下は、レンタルサーバーでも出来るかもしれないが、基本的に自鯖の方用ということで。
また、WordPress Database Backupプラグインを入れている方も不要と思われるんですが、データベースが大きくなると、ブラウザでの処理中にタイムアウトが発生する可能性があります。(タイムアウトするほどポストしていないので何とも言えませんが・・・)

日々のデータベースバックアップをどうするかというと、mysqldumpコマンドを使ってごっそり引っこ抜いてしまうという手法を使います。このコマンドで得られたダンプファイルというのは単なるテキストファイルなんですが、このフォーマットはリストアするときにMySQLが分かるような書式になっています。ということなので、このテキストファイルを圧縮し、メールで送れれば、ほぼWordPress Database Backupプラグインと同じことをブラウザのタイムアウトを気にせずバックアップを取ることが可能でやんす。
(当方はこのダンプファイルがテキストファイルであるということで、ブログの引っ越しにこの性質を利用して手間を掛けずに数時間で引っ越しを終わらせました。このことは後で記事にでもしてみます)

さて、では順を追って簡単に説明します。

まずは、mysqldumpコマンド例は以下の通りです。

# mysqldump [DB name] --host=[hostname] -u [DB user name] --password=[DB password] > [backup file name]

で、このままだと手動でコマンドを叩くしかないので、cronに任せたくなりますが、そこをちょっと我慢してメールの送信まで一気に処理しちゃうスクリプトを書いちゃいましょ。

基本的にダンプファイルを作るまではシェルスクリプト(bash)で、メール送信だけPerlスクリプトで書きました。Perl部分は[Bird-Soft]さんのコードを丸写しなので合体させました・・・orz

とりあえず、スクリプト全体のコードはこれ。(エラー処理は端折ってます)

#!/bin/bash

dumpdir='/tmp/'
dumpdate=`date +%Y%m%d`
dumpfilename=senjyuwpdb-$dumpdate.dump
#データベース名
dbname='dbname'
#ホスト名(ほとんどの場合localhost)
dbhost='localhost'
#データベースのユーザ名
dbuser='dbuser'
#データベースユーザのパスワード
dbpasswd='dbpassword'
#圧縮ファイルの拡張子
compress_ext='.tar.gz'
#送信先アドレス
mailtoaddr='hogehoge@foo.com'

#### dump wordpress database
mysqldump $dbname --host=$host -u $dbuser --password=$dbpasswd > $dumpdir$dumpfilename

#### compress to tar.gz
pushd .
cd $dumpdir
tar zcvf $dumpfilename$compress_ext $dumpfilename
popd
#### send a mail with dump file
perl pmail.pl $dumpdir$dumpfilename$compress_ext $mailtoaddr

#
#### End of script

それでもって、メール送信側Perlスクリプト(pmail.pl)がこれ。だが何度も言いますが、[Bird-Soft]さんの所のコードを丸写し・・・です。(ありがとうございます、Bird-Softさん)


#!/usr/bin/perl
#
#       添付ファイル付メール送信スクリプト
#       メール送信については、LANからWANへ出来ているものとする
#       尚、このスクリプトは、LAN内からのSMTP接続のみ想定している
#       ので、外のメールサーバを使う場合はNET::SMTP::SSL認証を
#       必要とする場合がある

use Jcode;
use Net::SMTP;
use MIME::Entity;
use Net::SMTP::SSL;

#### 送信サーバ設定
#メールサーバ名
my $smtp_server = 'mail.foo.com';
#SMTPポート
my $smtp_port = '25';

#SMTP::SSLが必要な場合
#認証ユーザメールアドレスとパスワード
#my $smtp_acc = 'user@foo.com';
#my $smtp_pwd = 'password';
####

#### 日時取得
( $sec, $min, $hour, $date, $month, $year, $youbi ) = localtime;

$year += 1900;
$month++;

@jweek = ( "日", "月", "火", "水", "木", "金", "土" );
$j_youbi = $jweek[ $youbi ];

$hour = sprintf "%02d", $hour;
$min = sprintf "%02d", $min;
$sec = sprintf "%02d", $sec;

$event_time="$year/$month/$date($j_youbi)$hour:$min:$sec";
print "イベント発生:$event_time\n";
#### 日時取得ここまで

$event_name=$ARGV[0];   #添付ファイル名
$event_mailto=$ARGV[1]; #送信アドレス

#### 添付ファイル名
my $file_path_mail=$event_name; #引数より
my $timestamp_string=$event_time;

#BCCが必要な場合
my $mail_bcc = $event_mailto;
#fromアドレス(ここがメールサーバドメインと違った場合は転送と見なされはじかれる場合があります)
my $mail_from = 'senduser@foo.com';

#### 件名
my $mail_subject = 'WordPressデータベースダンプ';

#本文
my $mail_body = <<"_MAILBODY_";

時刻:$timestamp_string
に取得されたデータベースダンプです
_MAILBODY_

#文字コード変換
$mail_subject = jcode($mail_subject)->jis;
$mail_subject = jcode($mail_subject)->mime_encode;
$mail_to = jcode($mail_to)->jis;
$mail_to = jcode($mail_to)->mime_encode;
#$mail_bcc = jcode($mail_bcc)->jis;
#$mail_bcc = jcode($mail_bcc)->mime_encode;
$mail_from = jcode($mail_from)->jis;
$mail_from = jcode($mail_from)->mime_encode;
$mail_body = jcode($mail_body)->jis;

my $err;
my $oSmtp;
my $oMime;

#ここから送信処理
#SSL認証用
#$oSmtp = Net::SMTP::SSL->new($smtp_server,Port => $smtp_port, Debug => 1);
#SMTP認証用
$oSmtp = Net::SMTP->new($smtp_server);

#SSL認証が必要な場合のエラー処理
#if($oSmtp->auth($smtp_acc,$smtp_pwd)){
#サーバ内の特定ユーザからの送信なのでエラー処理は端折ってます
$oSmtp->mail($mail_from);
$oSmtp->to($mail_to);
#    $oSmtp->bcc($mail_bcc);
$oSmtp->data();
$oMime = MIME::Entity->build(
From => $mail_from,
To => $mail_to,
#        Bcc => $mail_bcc,
Subject => $mail_subject,
Data => $mail_body
);
$oMime->attach(
Path => $file_path_mail,
Type => "application/octet-stream",
Encoding => "Base64"
);
$oSmtp->datasend($oMime->stringify);
$oSmtp->dataend();
$oSmtp->quit;

print "ok mail to $mail_to\n";
#}else{
#       $err = 'SMTP Server Authentication Error!!';
#       print "NG \n";
#       print "error : $err \n";
#}

print "end... \n";
exit;

論より証拠?で、Perlのコードは別として、シェルスクリプトの方は汚い・拙い書き方ですが、たいしたことしてません。後はこのスクリプトをcron.dailyなんかに放り込めば、日々のバックアップ処理が自動的に行われますです。と、ここで思い出した、最後にバックアップファイル消してねぇ~、各自適当に願いします・・・ぉぃ

当方の環境は、サーバ内もしくはLAN内から特定のユーザにメールが送られると自動的に外部のアドレスに転送される設定になっているので、今回苦労しなかったが、DDNS等でメールサーバを運用している方は注意が必要かと。

ではでは

Leave a Comment


*


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">