MySQLのバックアップ

2005/01/12 変更

MySQLのバックアップにも色々な方法があると思いますが、もっとも簡単な方法はmysqldumpを利用することです。

たとえば、全データベースをバックアップするのなら次のようにします。Linuxではこれをcronから起動させれば深夜に無人バックアップさせることが出来ます。
mysqldump -A -uroot -pルートのパスワード -Q --opt -rバックアップ先ファイル名

特定のデータベースだけをバックアップする場合は以下のようにします。
mysqldump データベース名 -uroot -pルートのパスワード -Q --opt -rバックアップ先ファイル名

なお、innoDBのデータをバックアップするときには「--single-transaction」オプションを付けないとうまくいかないようです。 また、外部キーを設定してあるinnoDBテーブルではリストア時にエラーとなる可能性がありますので、テーブル別にバックアップするなど、工夫が必要のようです。

mysqldumpでバックアップしたファイルを使ってリストアするにはmysqlコマンドを使います。なお、mysqlデータベースも復元したら、「/etc/init.d/mysql restart」としてください。

全データベースをバックアップした場合のリストア
mysql -uroot -pルートのパスワード < バックアップ・ファイル名

特定のデータベースをバックアップした場合のリストア
mysql -uroot -pルートのパスワード データベース名 < バックアップ・ファイル名


バックアップのスクリプト

私はPHPを使ってMySQLのバックアップをしています。たとえば、次のようなスクリプトを使ってます。

このスクリプトでは、次の利点があります。

  • すべてのデータベースをバックアップする。また、スクリプトを変えれば特定のデータベースのみ除外することも比較的簡単にできる。
  • データベース別にバックアップするのでリストアする時は便利。
  • バックアップ後、圧縮するのでディスク効率が良い。
  • 一定期間、バックアップデータが残る。

<?php
$RootPass = 'MySQLのrootパスワード';
$BackPath = "バックアップ保存先ディレクトリ (/bac/など、最後に「/」を付ける)";
$KeepDay  = 10; 			   // バックアップの保存日数
$Arc	  = "/bin/tar cpzf";   // アーカイバ。 Windowsでは'lha32.exe a'などを利用します。
$ToExt	  = "tar.gz";		   // 圧縮後ファイルの拡張子

ob_end_flush();
if (!($conn = @mysql_connect('localhost', 'root', $RootPass)))
   ErrorOut("MySQL接続エラー");

// データベースの一覧を取得 -> $db[]
$rs = @mysql_list_dbs($conn);
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 = "/usr/local/bin/mysqldump {$db[$i]} -uroot -p$RootPass --opt -r$BackPath{$db[$i]}";
	if (MySystem($cmd)) ErrorOut("次のコマンド実行でエラーになりました。$cmd");
	$cmd = "$Arc $BackPath{$db[$i]}.$now.$ToExt $BackPath{$db[$i]}";
	if (MySystem($cmd)) ErrorOut("次のコマンド実行でエラーになりました。$cmd");
	@unlink("$BackPath{$db[$i]}");
}

// 古いバックアップファイルを削除
$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) == 4) {
		if ((int)$ex[1] < $KillDate)
			@unlink($BackPath . $fname);
	}
}
closedir($dir);

// エラー時の処理。実際の運用では管理者へメールを送信するなどに変える
function ErrorOut($msg) {
	echo $msg . "\n";
	exit;
}

// コマンドの実行
function MySystem($cmd) {
	echo "$cmd\n";
	return system($cmd);
}
?>

このようなスクリプトをファイルへ保存しておいて、「php -f backup.php」などとしてバックアップさせてます。

MySQLのページ トップへ

Copyright©2001-2019 釣ったよ! All Right Reserved.    sg@tsuttayo.jpn.org