2013 9 4月

PHPとlaunchdでデータベースをローカルに自動でバックアップ

ファーストサーバーの件もあり、レンタルサーバーで管理するデータベースの数も増えてきてPHPMyAdminから手作業でバックアップとるのも結構大変になってきたのでデータベースのバックアップの自動化をしました。

流れとしては、

  1. サーバー側でデータベースをバックアップ
  2. PCが立ち上がっているとき、1日1回サーバー側でとったバックアップをローカルに保存

って感じです。
ちなみに環境は、レンタルサーバーがLinuxでPCがOS X Mountain Lionです。

1. サーバー側でデータベースをバックアップ

まず、サーバー側でバックアップです。
公開ディレクトリの外にデータベースのバックアップを保存する「/db/」ディレクトリと下記の「backup.php」を作成します。

backup.php

<?php
// バックアップファイルを保存するディレクトリまでのフルパス
$dir = “dbディレクトリまでのパス/db/”;
//データベースの情報(複数のデータベースをバックアップするので配列で)
$db_array = array(
	“hoge” => array(
		“host” => “ホスト名”,
		“user” => “ユーザー名”,
		“pass” => “パスワード”
	),
	“hoge2″ => array(
		“host” => “ホスト名”,
		“user” => “ユーザー名”,
		“pass” => “パスワード”
	)
);

foreach ( $db_array as $key => $value ) { $dbName = $key; $dbHost = $value["host"]; $dbUser = $value["user"]; $dbPass = $value["pass"]; $fileName = $dir.$dbName.”.sql”; $command = “mysqldump –default-character-set=binary “.$dbName.” –host=”.$dbHost.” –user=”.$dbUser.” — password=”.$dbPass.” > “.$fileName; system($command); }


上記ファイルを実行すると「/db/」ディレクトリ内にhoge.sqlというバックアップファイルが作られると思います。
このファイルをcron等で定期的に実行させればサーバー側でのバックアップは完了です。

2.PCが立ち上がっているとき、サーバー側でとったバックアップをローカルに保存

次に、ローカル側でのバックアップです。
ユーザーディレクトリの直下に「/backup/」ディレクトリを作成し、下記のPHP「download.php」を作成します。

download.php

<?php
$local_dir = “/Users/ユーザー名/backup/db/”;
date_default_timezone_set(“Asia/Tokyo”);
$y_dir = $local_dir.date(“Y”).”/”;
$m_dir = $y_dir.date(“m”).”/”;
$d_dir = $m_dir.date(“d”).”/”;
$host = “FTPサーバー名”;
$user = “FTPユーザー名”;
$pass = “FTPパスワード”;
$server_dir = “サーバーでバックアップしたファイルまでのパス”;

// 日付ディレクトリ作成 if( !is_dir($y_dir) ) mkdir($y_dir); if( !is_dir($m_dir) ) mkdir($m_dir); if( !is_dir($d_dir) ) mkdir($d_dir);

$ftp = ftp_connect($host); $result = ftp_login($ftp, $user, $pass); // 接続確認 if( !$result ) { echo(“FTPに接続に失敗しました。\n”); return; } else { print(“FTPに接続に成功しました。\n”); } // ダウンロードディレクトリ確認 if( ftp_chdir($ftp, $server_dir) ) { print(“ダウンロードディレクトリを確認しました。\n”.ftp_pwd($ftp).”\n\n”); } else { print(“ダウンロードディレクトリが存在しません。\n”); return; }

// ファイル取得 if( $list_file = ftp_rawlist($ftp, “./”.$dir_name) ) { // ファイル処理 foreach( $list_file as $value ) { if( substr($value, 0, 1) != “d” ) { $file = array_pop(explode(” “, $value)); //ダウンロード if( ftp_get($ftp, $d_dir.”/”.$file, $server_dir.”/”.$file, FTP_BINARY) ) { print(“{$file}・・・・・・ダウンロードが完了しました。\n”); } else { print(“{$file}・・・・・・ダウンロードに失敗しました。\n”); } } } } else { print(“ファイルがありません。\n”); }

// 接続解除 print(“\n接続を解除しました。\n”); ftp_quit($ftp);


今回は1日1回バックアップをとることを目標としたので「/年/月/日/」となるディレクトリを作成し、そこにバックアップファイルを格納させるかたちとしました。

実際に動作するか確認するため、ターミナルで

$ /Users/ユーザー名/backup/db/download.php

を実行させて「/年/月/日/hoge.sql」が作成されれば成功です。

手動でローカルにバックアップできるとこまできたら、あとはlaunchdで定期的に実行するだけ。

hoge.plist

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
	<key>Label</key>
	<string>hoge</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/ユーザー名/db/download.php</string>
	</array>
	<key>StartCalendarInterval</key>
	<dict>
		<key>Minute</key>
		<integer>0</integer>
		<key>Hour</key>
		<integer>0</integer>
	</dict>
</dict>
</plist>

上記のhoge.plistを/Library/LaunchDaemons/に作成し、
権限をrootに変更。
$ sudo chown root /Library/LaunchDaemons/hoge.plist

パーミッションを644に変更。
$ sudo chmod 644 /Library/LaunchDaemons/hoge.plist

最後に
$ sudo launchctl load /Library/LaunchDaemons/hoge.plist

と打ち込んでロード。

これでPCが立ち上がっていれば1日1回データベースを自動バックアップできるようになりました。