SVNリポジトリの引越のためにバックアップのスクリプトを書いた。
関連リンク: SVNリポジトリをリビジョン番号付きでバックアップする
要件
- サーバまるごと一気に飛び移る。
- サーバ多重化して軟着陸?やりません(キリッ)
- リポジトリは沢山ある。
- 全てフルダンプはかなり時間がかかる。
- 日時を指定してそれ以降に更新があったリポジトリだけ差分ダンプしたい。
- 日付の比較はどうするか?
- SVNリポジトリのファイル更新日とバックアップファイルの更新日の比較は何か怖い気がする。
-
svnlook date
を使うべし。
メモ
- 日付処理には
date
コマンドが使える。- ただし、
date
コマンドはLinuxとUNIXとではオプションが異なるので注意する。
- ただし、
- SVNのリポジトリの日付の取得には
svnlook date
が使える。- ただし、これを
date
コマンドに食わせてもうまく解釈くれなかった。 - Rubyの
DataTime
は食べてくれた。
- ただし、これを
スクリプト
- SVNリポジトリをバックアップする。
- バックアップには
svnadmin dump
に加えてgzip
による圧縮を使う。 - バックアップファイルが存在しない場合はバックアップを実行する。
- バックアップファイルが存在する場合でも
TARGET_DATE
より更新日が新しい場合は上書きバックアップする。
- バックアップには
backup_svn.sh
TARGET_DATE=`date --date '2014-06-05' +%s`
ACCOUNTS=`ls -1 /srv/svn/`
for ACCOUNT in $ACCOUNTS; do
SRC=/srv/svn/$ACCOUNT
DST=/var/backups/svn/$ACCOUNT.svn.dump.gz
SRC_DATE=`svnlook date $SRC | ruby -e "require 'date'; puts DateTime.parse(gets).to_time.to_i"`
DST_DATE=`date -r $DST +%s`
if [ ! -e $DST ]; then
time svnadmin dump $SRC 2> backup_svn.log | gzip > $DST
echo "backup svn from $SRC to $DST: `ls -hs $DST`"
elif [ $SRC_DATE -gt $TARGET_DATE ]; then
time svnadmin dump $SRC 2> backup_svn.log | gzip > $DST
echo "backup svn from $SRC to $DST: `ls -hs $DST`"
fi
done
めでたし。