LoginSignup
6
6

More than 5 years have passed since last update.

特定の日付より新しいSVNリポジトリをバックアップする

Last updated at Posted at 2014-06-06

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

めでたし。

6
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6