PHPとlaunchdでデータベースをローカルに自動でバックアップ
ファーストサーバーの件もあり、レンタルサーバーで管理するデータベースの数も増えてきてPHPMyAdminから手作業でバックアップとるのも結構大変になってきたのでデータベースのバックアップの自動化をしました。
流れとしては、
- サーバー側でデータベースをバックアップ
- 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回データベースを自動バックアップできるようになりました。