MySQL のダンプを Gmail でお手軽に定期バックアップ

用意するもの

  • perl
  • cron
  • sendmail (もしくは sendmail ラッパを持った他の MTA)
  • zip
  • Gmail アカウント
  • jcode.pl
  • mimew.pl

対象者

  • 「用意するもの」に書かれているものの意味が分かる
  • 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 thoughts on “MySQL のダンプを Gmail でお手軽に定期バックアップ

  1. なかなか面白そうな機能ですな。
    Gmailへメインメールの移行が済んだら是非TRY予定。
    GmailはIMAP+Beckyで暗礁に乗り上げて棚上げ状態…。

  2. この記事は Gmail をただのオンラインストレージとして使おうという発想なので、メインメールとは違っていても問題ないですよ。
    逆に容量がかさむようなら、メインとは切り離した方がいいかもしれないです。

    元々メールで添付するのに抵抗がない程度の容量を、気軽にバックアップしたいという用途ですので、圧縮後のファイル容量が 100MB とかを越えるようなら、もっと別の手段を検討した方が良さそうですし。

  3. ピンバック: Bowz::Notebook

コメントを残す

メールアドレスが公開されることはありません。