2017年ももうあとわずか。年末といえば大掃除ですね〜。
会社で製作したWEBサイトのデータをSVNで管理しているのですが、バックアップやメンテナンスがあんまりできてないので年末メンテナンスを行うことにしました。

前提

  • 社内LAN内サーバー(Mac OS El Capitan)でSVNを動かしている
  • クライアント端末はMac、svnXを利用中
  • SVNはMacPortsでインストール
  • SVNにパスが通してある

SVNの利用状況

まずは現状について。

2012年ごろ、よくわからないながらソース管理を始める。
2、3人で5年くらい使って来て、現在のリビジョン番号はRev 4319。
リポジトリはひとつしか立ててません。分割するメリットがよくわからず不便もないのでそのままにw

フルバックアップしたファイルを見ると5GBを超えるデータ容量。なかなか重いですね〜。軽くしたい。
一応毎日フルバックアップを回していたつもりが、いつの間にか動かなくなってて現在はバックアップなしの状態。

シェルで自動バックアップ作ってMacのcronみたいなやつで毎日動かしていたつもりなのですが、
空のフォルダが自動生成されてローカルとサーバーにダブルバックアップされていました・・・
厳重に無意味なお仕事をさせていたようですね。昔は動いてたんだけどなー。

という感じでめっちゃ適当に使ってます。
定期バックアップを直したいけど容量が重すぎるので軽量化も合わせてやりたいですね。
あんまり古いファイルや作ったけどいらないフォルダもちょこちょこあるのでその辺りをどうにかできればいいんですけど。

フルバックアップ

何はともあれまずは壊れたらお終いな状況なので1回フルバックアップをします。
念のため使ってる人全員コミットしてもらってからやりました。使用途中でも問題はないらしい?詳しくないから保険で。

調べたところ「svnadmin dump」と「svn-backup-dumps.py」の二つのコマンドがあるそうです。
が、svn-backup-dumps.pyはsvnadmin dumpのラッパーなので実質はsvnadmin dumpで実行されるとのこと。
安心機能がついてるらしいのでsvn-backup-dumps.pyを使えるならそっちの方を使いましょう。

【参考】
Subversionリポジトリのバックアップ [svn-backup-dumps.py の利用方法]

こちらの参考サイト様を見れば以下読まなくても分かる人は分かると思いますが、一応流れを残しておきます。

ターミナルで実行します。
コマンドにパスが通ってる前提なのでコマンドがないよエラーが出たら・・・頑張ってください^^;

$ cd 【SVN_HOME】  // SVNのリポジトリが入ってるところに移動して
$ mkdir 【backupdir】  // バックアップしたファイルを入れるフォルダを作成
$ svn-backup-dumps.py 【リポジトリ名】 【backupdir】 > 【backup.log】 // フルバックアップを実行してログを取る

ちなみにMac PortsでSVNを入れたうちの環境ではsvn-backup-dumps.py使えました。
SVN_HOMEは「/opt/local/apache2/htdocs/svn」でしたがこれは環境によります。

5GBの重さだったので結構時間がかかりました。
コマンド実行したら特に何も表示されず止まってるように見えましたが、しばらく待ってたら静かに終了していました。

web.000000-004320.svndmp

といった感じの名前のダンプファイルが出来上がります。

差分バックアップ

フルバックアップと同様のコマンドにオプションをつけると、差分ごとのバックアップができます。

$ cd 【SVN_HOME】  // SVNのリポジトリが入ってるところに移動して
$ mkdir 【backupdir】  // バックアップしたファイルを入れるフォルダを作成
$ svn-backup-dumps.py -c 100 【リポジトリ名】 【backupdir】 > 【backup.log】 // 差分ごとバックアップを実行してログを取る

「-c 100」っていうところが増えました。
これをやると何ができるのか。

web.000000-000099.svndmp
web.000100-000199.svndmp
web.000200-000299.svndmp
web.000300-000399.svndmp
web.000400-000499.svndmp
・・・(略)・・・
web.004200-004299.svndmp
web.004300-004320.svndmp

こんな風にファイルが分割されてバラバラ〜っと出来上がりました。

「-c 100」としたので、100リビジョンごとのかたまりができています。50とか10に変えれば、50リビジョンごと、10リビジョンごと、といった感じに変更できるわけです。トータルリビジョン数に応じて変更してください。

差分っていっといて全部出てきてるじゃん!って思ったのですが、
リビジョンを更新して、もう一度全く同じコマンドを実行すると、差分だけが追加されるらしいです。
定期的にcronとかで実行しておけば、かなり細かくバックアップが取れますね。

じゃあ差分って何がいいことがあるんだっていう話になるんですが、バックアップファイルが破損して生成されるといったリスクが実はあるのです。フルバックアップしかとってなくて、それが破損してしまったら?復旧の可能性はゼロです。
フルバックアップが重い場合、毎日毎日回すのが大変な場合があります。
そういう場合に、週1回のフルバックアップと日々の差分バックアップを併用するというのが良いですね。

リストア(復元)、リポジトリを複製

バックアップが取れたらどうやって使うのか気になりますよね。
今回は、SVNを軽量化したいなぁと思っているので、色々いじっておかしくなっては困るので今のSVNを丸っと複製した新しいリポジトリを作って万一に備えようと考えました。

ということで新しくリポジトリを作成します。

$ cd 【SVN_HOME】  // SVNのリポジトリが入ってるところに移動して
$ svnadmin create 【新しいリポジトリ名】  // 新規リポジトリを作成します

新しいリポジトリができました。ここに、先のコマンドで作ったフルバックアップファイルをリストアします。
5GBありますんでここもま〜時間かかります。
あんまり重いと処理が長くなるし、エラーが出た時ショックなのでやはり重たすぎるファイルというのは扱いづらいですね。

$ svnadmin load 【新しいリポジトリ名】 < web.000000-004320.svndmp  // ダンプファイルを復元します

実行すると今度は逐一ログが表示されます。
数時間レベルで時間がかかりそうなのでエラーが出ないことを祈りながら待ちます。
もしかして差分バックアップの方でちょこちょこやったほうが安全だったかもしれないですね・・・w

処理が終わったら、実際にSVNクライアントから新しいリポジトリに接続してみて、
うまく使えるか確認して終了です。

とりあえずこれで年末年始を安らかに過ごせそうです。
軽量化はまた別の機会に。