cronで、MySQLの全テーブルを世代バックアップ
2011年10月11日MySQLを利用していて、世代別にバックアップしておきたい要件があったので、作成。
参考にしたサイトは忘れちゃいましたが・・・。
以下を、cronで実行して運用してます。
<?php /** * ------------------------------------------------------------ * Script for MySQL Backup(cron) * ------------------------------------------------------------ * $id$ * Author $Author$ * Date $Date$ * Rev $Rev$ * URL $URL$ * ------------------------------------------------------------ * MySQLのDB内全てのデータベースをバックアップ * バックアップするデータベースへは、スーパーユーザー(root) * でアクセス * バックアップデータはアーカイバの指定可能 * 古い(指定日経過後)バックアップファイルは、保存指定の世代数 * を超えると自動的に古いデータから削除 **/ /* SETTINGS ------------------------------------------------- */ // MySQL rootユーザーパスワード $RootPass = 'password; // バックアップ先(最後にスラッシュ必須) $BackPath = "/home/.backup/.mysql/"; // 世代保存日数 $KeepDay = 14; // アーカイブコマンド $Arc = "/bin/tar zcfp"; // アーカイブ拡張子 $ToExt = "tgz"; // アーカイバ $Dumper = "/usr/bin/mysqldump"; /* ------------------------------------------------- SETTINGS */ /* フォルダ書き込み確認 */ if ( !touch($BackPath) ){ if( !is_dir($BackPath) ){ ErrorOut("フォルダがありません: $BackPath"); }else{ ErrorOut("書き込み権限がありません: $BackPath"); } } ~~~~ /* 保存先フォルダへ移動 */ chdir($BackPath); /* 出力バッファ内データ出力 */ @ob_end_flush(); /* DB接続 */ if ( !($conn = @mysql_connect('localhost', 'root', $RootPass)) ) ErrorOut("MySQL接続エラー: サービス停止 or 接続情報が一致しません"); // データベースの一覧を取得 -> $db[] $rs = @mysql_list_dbs($conn); $db = array(); for ($i = 0; $i < mysql_num_rows($rs); $i++) { $db[count($db)] = mysql_tablename($rs, $i); } // mysqldumpと$Arcを実行 $now = date('Ymd'); for ($i = 0; $i < count($db); $i++) { $cmd = "$Dumper {$db[$i]} -uroot -p$RootPass --opt -r$BackPath{$db[$i]}.mydump"; if (MySystem($cmd)) ErrorOut("次のコマンド実行でエラーになりました。$cmd"); $cmd = "$Arc $BackPath{$db[$i]}.$now.$ToExt {$db[$i]}.mydump"; if (MySystem($cmd)) ErrorOut("次のコマンド実行でエラーになりました。$cmd"); @unlink("$BackPath{$db[$i]}.mydump"); }; // 古いバックアップファイルを削除 $KillDate = (int)date('Ymd', mktime(0,0,0, date('m'), date('d') - $KeepDay, date('Y'))); $dir = opendir($BackPath); while ($fname = readdir($dir)) { $ex = explode('.', $fname); if (count($ex) == 3) { if ((int)$ex[1] < $KillDate) @unlink($BackPath. "/" . $fname); } } closedir($dir); //{{{ function ErrorOut() /** * エラー時の処理。実際の運用では管理者へメールを送信するなどに変える * @param string $msg * @access public **/ function ErrorOut($msg) { echo $msg . "\n"; exit; } //}}} //{{{ function MySystem() /** * コマンドの実行 * @param string $cmd * @access public **/ function MySystem($cmd) { return system($cmd); } //}}} ?>