rubyでscpによるリモートホストのファイルのバックアップ
仕事でいつも活用している自作のバックアップツールをrubyforgeに
登録したけど、私以外は誰も使っていないようだ。
remote ssh backup
どういうツールかというと、サーバー等のリモートホスト上にある
ディレクトリをローカルにscpでコピーすることでバックアップを
行う。しかも、ファイルの更新日時を見て、初回以外は更新されて
いるファイルだけをコピーしてきて、リストアする際に日付を指定
して、指定された日付の状態をリストアできる。
このプログラムはたかだか500行程度のrubyでできている。
リモートサーバのバックアップはrsyncが一般的だと思うが、過去の
データをとれないから、間違ってサーバのファイルをいじった時に
元にもどせない。
インストール手順
sudo gem install remotebackup
バックアップ手順
1.まず、下記のフォーマットでバックアップを行うための設定ファイル
を作成する。デフォルトはカレントディレクトリのbackup.xmlという名前。
<backups>
<backup>
<name>バックアップ名(適当な英数字)</name>
<server>ホスト名</server>
<user>ホストにログインできるユーザ名</user>
<password>ユーザのパスワード</password>
<path>バックアップしたいディレクトリのフルパス</path>
<ignore_list>
<ignore>無視したいディレクトリおよびファイルの正規表現</ignore>
:
</ignore_list>
</backup>
:
</backups>
例
<backups>
<backup>
<name>web</name>
<server>192.168.0.10</server>
<user>takesy</user>
<password>openthesesami</password>
<path>/www</path>
<ignore_list>
<ignore>\.svn</ignore>
<ignore>\.bk</ignore>
</ignore_list>
</backup>
<backup>
<name>nfs</name>
<server>192.168.0.12</server>
<user>bkuser</user>
<password>passforbkuser</password>
<path>/export</path>
<ignore_list/>
</backup>
</backups>
2. 下記のコマンドを実行することにより、バックアップ開始.
remote_backup [-f 設定ファイル。デフォルトはbacup.xml] [-o 出力したいディレクトリ デフォルトはカレントディレクトリ] [-v どのファイルをコピーしているか等の情報を表示]
上記実行により、レポジトリとしてカレントディレクトリもしくは-oで指定したディレクトリに<name>で指定したディレクトリが作成される。
上記例だとwebとnfsという名前のディレクトリができる。
その中にバックアップされたファイルとさらにファイル情報として、実行日時.ymlというバックアップしたファイルの属性等が記述されたファイルが作成される。
このファイルはリストアする時に使用する。
また、前回のバックアップ時と比較して変更がなかった場合は作成されない。
------------------------------------------------------------------------------
リストア手順
1.リストアするためには下記のコマンドを実行する。
restore_backup -f file -o output_dir [-v vervose]
fileには、バックアップで作成された日付+ymlを指定する。
output_dirにはリストアしたいディレクトリのパスを指定する。
例:
restore_backup -f ./web/2008_06_25_06_40.yml -o /tmp/www
------------------------------------------------------------------------------
既知のバグ
1. ファイル、ディレクトリ名に日本語等のマルチバイトを使用している
場合は強制的にバックアップされない。
理由:ファイル名によっては、scpでエラーが出てしまうため、プログラム
強制的に除外している。(s-jisのみ?)別に問題がないようだったら、
その部分をコメントアウトしてください。
2. 30Mを越えるファイルがあるとエラーになる。
理由: プログラムで使用しているnet/scpのバグだと思います。他の
ブログでも同じことを言っていたから.net/scpの修正を待つか、以前
net/scpが登場する前に自作したscpの処理を持ってくれば対応できる
はず。
| 固定リンク | コメント (0) | トラックバック (0)


最近のコメント