MySQL のダンプを Gmail でお手軽に定期バックアップ
用意するもの
対象者
- 「用意するもの」に書かれているものの意味が分かる
- perl スクリプトを作成して実行権限を与える方法が分かる
- 作成したスクリプトを cron に登録する事が出来る
上記にあてはまらない方は、知識を身につけてから再度お越し下さい。
設置
下記のスクリプトを作成して、パスとかを適宜修正します。
※cron から動かすためにパスは全てフルパスで。
#!/usr/bin/perl
require "/path/to/library/jcode.pl";
require "/path/to/library/mimew.pl";
#### Setting
$sendmail = '/usr/sbin/sendmail';
$tmp = '/tmp';
$mysqldump = '/usr/bin/mysqldump';
$zip = '/usr/bin/zip';
$debug = 0;
$dbname = 'your_db_name';
$dbuser = 'your_db_username';
$dbpass = 'your_db_password';
$from = 'mail@from.address';
$to = 'mail@to.address';
$subject = 'Subject of mail';
$boundary = 'BOUNDARYBOUNDARYBOUNDARYBOUNDARY';
#### Header
$header = <<"EOH";
Content-Type: Multipart/Mixed; boundary="$boundary"
Content-Transfer-Encoding: Base64
From: $from
To: $to
Subject: $subject
EOH
#### Backup
($sec, $min, $hour, $mday, $mon, $year) = localtime(time);
$filename = sprintf($dbname . '_%04d%02d%02d%02d%02d%02d.dump', $year + 1900, $mon + 1, $mday, $hour, $min, $sec);
`$mysqldump -u $dbuser --password=$dbpass --skip-lock-tables --skip-extended-insert $dbname > $tmp/$filename`;
`$zip $tmp/${filename}.zip $tmp/${filename}`;
unlink("$tmp/${filename}");
#### File
$filename = "$tmp/${filename}.zip";
open(FILE, $filename);
binmode FILE; # For Win
while (read(FILE, $buf, 1024)) {
$contents .= $buf;
}
close(FILE);
$base64 = &bodyencode($contents);
$base64 .= &benflush();
#### Body
$body = <<"EOB";
--$boundary
Content-Type: application/octet-stream; name="$filename"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$filename"
$base64
--$boundary--
EOB
if ($debug) {
open(MAIL, ">> dbbackup.txt");
} else {
open(MAIL, "| $sendmail -t");
}
print MAIL qq($header);
print MAIL qq(\n\n);
print MAIL $body;
close(MAIL);
unlink($filename);
スクリプトを試しに動かしてみて、問題ないようならcron に以下を設定します。
※毎日 3:00 AM にメールを送る場合。
00 3 * * * /path/to/script/script_name.pl
これで、DB のダンプが zip 圧縮されて Gmail のメールボックスに毎日たまっていきます。
やったね!
カスタマイズのヒント
mysqldump コマンドのオプション –skip-extended-insert は、ダンプ時に INSERT 文を 1 行ずつはき出す設定です。
ダンプデータをエディタで開いて見る事があるので、可読性を高めるために指定していますが、リストアの速度は劣るので、用途によっては外しましょう。
バックアップデータは Windows で扱う事が多いので、zip を使っていますが、tar に変えてもいいでしょう。
mysqldump の部分を色々と変えれば、PostgreSQL 等の他の DB はもとより、様々なバックアップ用途に使う事が出来ます。
Otchy は、SVN のバックアップにも使用してます。
zip コマンドを工夫すれば、複数ファイルのバックアップも出来るでしょう。
Gmail のアドレスは、userid+suffix@gmail.com の様に、任意のサフィックスを付けても同じメールボックスで受け取る事が出来ます。
たとえば、userid+dbbackup@gmail.com 宛にバックアップを送信するようにして、userid+dbbackup でフィルタすれば、バックアップメールだけ受信トレイに入れずにそのままアーカイブ出来るので、バックアップメールも邪魔にならずに済みます。
備考
今更、jcode.pl ?と思われるかもしれませんが、「おけば動く」という事と、昔からお世話になっていて慣れている、という理由で選択してます。
特に必要性を感じなかったので Subject の日本語化には対応してません。
[追記]すごい事に気がついた!jcode.pl 使ってない!途中で日本語使うのやめちゃったんだな<過去のおれ
3件のコメント »
RSS feed for comments on this post. TrackBack URL
なかなか面白そうな機能ですな。
Gmailへメインメールの移行が済んだら是非TRY予定。
GmailはIMAP+Beckyで暗礁に乗り上げて棚上げ状態…。
この記事は Gmail をただのオンラインストレージとして使おうという発想なので、メインメールとは違っていても問題ないですよ。
逆に容量がかさむようなら、メインとは切り離した方がいいかもしれないです。
元々メールで添付するのに抵抗がない程度の容量を、気軽にバックアップしたいという用途ですので、圧縮後のファイル容量が 100MB とかを越えるようなら、もっと別の手段を検討した方が良さそうですし。
perl + shell + cron で MySQL のデータを Gmail に定期バックアップ
WordPress のバックアッププラグイン ( WP-DB-Backup ) がうまく動かないので、cron を使って MySQL のデータを Gmail に定期バックアップする方法を調べてみました。
この方法だと WordPress に…