cronでDB定期バックアップ メール添付編

データベースのダンプファイルを、定期的にメールに添付して送信する、という方法です。DBに直接アクセスできる怖さはみんな駆け出しのころ経験してますよね?(僕だけ?)ちなみに、ここ最近では、Zend_Db の$db->delete(); で久々に冷や汗かきました。

/usr/bin/mysqldump --opt -c -h localhost -u root --password=xxxx dbname | zip |  /usr/bin/php5 /home/www/cron/mailto.php -f dbname_dump.zip

cronからの呼び出しはこんな感じです。
で、上で指定した引数はZend_Console_Getoptで受けられます。便利ですね。

mailto.php

<?php
set_include_path(
    get_include_path() .
    PATH_SEPARATOR . '/home/www/libs/Zend'
);

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

$opts = new Zend_Console_Getopt('f:');
$filename = $opts->getOption('f');

$address = 'yamashita@nusoft.jp';
$body = $filename;

$mail = new Zend_Mail();
$mail->setBodyText($body);
$mail->setFrom('yamashita@nusoft.jp', 'XServer Cron');
$mail->addTo($address, '');
$mail->setSubject('MYSQL DUMP ' . $filename);
$at = $mail->createAttachment(file_get_contents("php://stdin"));
$at->filename = $filename;
$mail->send();

お試しあれ。なお、Gmailの場合はゴミ箱へ直行するフィルタを作っておけば、30日経過後自動的に削除してくれます。

書いてて思い出しましたが、WEBプログラマーにはもっとわかりやすくてメンテしやすい方法があります。覚えておくと便利です。cronへの登録はこんな感じ。

0 0 * * * wget --spider http://nusoft.jp/dbbackup.php >/dev/null 2>&1

ポイントはリクエストするファイル内で、リクエスト元IP(同一サーバー内なら127.0.0.1 かな)からのアクセスのみ処理対象にすることです。これならいつもの感じなのでわかりやすいですね。