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のページ トップへ
|