Backup

Subversion のバックアップ。」

日頃はダンプだけで間に合っていたのだが、恩師のところに Subversion 環境を構築すると、リポジトリが巨大だったため、急遽、差分バックアップで運用することにした。いいスクリプトがあれば…と検索したが、見つけられなかったため、リファレンスを見ながら Ruby で自作してみた。役立つようなら使ってくだされ。

月に 1 度だけフルバックアップして、その後は差分バックアップをする想定で作成したスクリプトだが、先にフルバックを行いさえすれば、サイクルは任意。使い方は次の通り。

FreeBSD で動作確認してるので、Ruby のパスさえ注意すれば Mac OS XUnix 系なら問題なく動くはず。差分バックアップの方は変更がなければ何もしないので、気軽に cron で動かしておくのがいいかもしれない。まあ、両方とも cron で動かすつもりで書いているのだが…。Windows 環境で動くのかどうかは未確認だが、来週には確認することになる予定。

--- フルバックアップ用 (svnbackup_full.rb)
#!/usr/local/bin/ruby

require 'pathname'

USAGE = <<EOS
USAGE :
ruby svnback_full <repository> <backup directory>
EOS

if ARGV.size < 2
  puts USAGE
  exit
end

backup_base = Pathname.new ARGV[1]
latest_file = Pathname.new backup_base.to_s + '/latest'

youngest = `svnlook youngest #{ARGV[0]}`.to_i

latest_file.open("w") {|file|
  file.print youngest
}

dump_name = backup_base.to_s + "/dump_0_#{youngest}.bak"
`svnadmin dump #{ARGV[0]} --revision 0:#{youngest} > #{dump_name}`
--- 差分バックアップ用 (svnbackup_diff.rb)
#!/usr/local/bin/ruby

require 'pathname'

USAGE = <<EOS
USAGE :
ruby svnback_diff <repository> <backup directory>
EOS

if ARGV.size < 2
  puts USAGE
  exit
end

backup_base = Pathname.new ARGV[1]
latest_file = Pathname.new backup_base.to_s + '/latest'

latest = latest_file.read.to_i
youngest = `svnlook youngest #{ARGV[0]}`.to_i

exit if latest == youngest

latest_file.open("w") {|file|
  file.print youngest
}

latest += 1
dump_name = backup_base.to_s + "/dump_#{latest}_#{youngest}.bak"
`svnadmin dump #{ARGV[0]} --revision #{latest}:#{youngest} --incremental > #{dump_name}`