cronで、MySQLの全テーブルを世代バックアップ

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);

}

//}}}

?>