2006-10-06 Fri

吉野家の牛丼

吉野家の牛丼が10月で最終日。なので、つい食べてしまった。

画像

食べて分かったことは、私にとって吉野家の牛丼は仕事の味。

アルバイトの合間に食べていた味なので、
ノスタルジーよりも当時のバイトのツライ思い出が
浮かびまくってションボリしてしまった。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |

tar+gzではなくafio+gzでバックアップしてみる

先日から運用しているSubversionのリポジトリとtracのプロジェクトを
cronでバックアップしようと思います。

いろいろ調べたのですが、手軽そうでtar+gzより微妙に安全そうな
afio+gzでバックアップしてみます。

ちなみにaflo(アフロ)じゃないっす。読みはアフィオ?エーエフアイオー?
ま、いいか。

とりあえず、afio+gzを使ってバックアップを作成します。

debianなのでapt-getでサクッとインストール。

# apt-get install afio


違いを見てみたいので、afioとtarの両方でバックアップします。
実際にcronを運用するときは以下のようなshファイルを作り、
crontabに登録します。
# もちろん、tarとafioの両方でバックアップする必要はないです。
# 好みの方だけ残しましょう。

#!/bin/sh
#svnreposのコピーを安全にとる
rm -rf /root/backup/svnrepos_back
svnadmin hotcopy /pass/to/svnrepos $HOME/backup/svnrepos_back
# バックアップをするファイルがあるディレクトリへ移動。
cd $HOME/backup
#日付を取得(date +%Y%m%dとすると、"20070101"などを取得可)
date=`date +%d`
#日付の定数による剰余を取得(以下では5で割ってるので概ね5日分)
num=`expr $date % 5`
# ディレクトリをafioでバックアップ
find ./svnrepos_back | afio -oZ $HOME/backup/svnrepos-$num.afz
# ディレクトリをtarでバックアップ
tar cfz $HOME/backup/svnrepos-$num.tar.gz ./svnrepos_back


ちなみにafioの主なコマンドオプションのリストは以下のとおり。
圧縮時にはfindコマンドであらかじめバックアップ対象を検索して、
結果をafioに渡す必要があります。1年後には忘れそう。

オプション詳細
-oバックアップ作成(findによる検索結果のパイプが必須)
-Zgzipで圧縮
-i解凍する
-v詳細出力
-rバックアップが正常かチェック


作成したafzファイルの中身は、以下のように確認します。
lvでもlessでも何でも良いです。

# afio -tZ svnrepos-0.afz | lv


圧縮ファイルのファイルサイズはtar+gzとafio+gzに大差はありません。
若干afioの方が容量を食うようです。

さて、ここまででファイルのバックアップはできました。
今度はafioとtarの違いを実際に見てみることにします。

参考文献によるとafioの方が、ファイルの破損に強いようです。
参考文献:なぜ tar+gzip はよくないか?

beavというバイナリエディタを使って、先頭から200バイト目を00に書き
換えてみました。
bervは非常に軽快に動くので編集が楽でした。
ちなみにbeavにおけるファイル保存コマンドはC-x C-s、終了はC-x C-c。
# Emacsと同じですね。

# beav svnrepos-0.tar.gz
編集
# beav svnrepos-0.afz
編集


無事ファイルを破損したので、解凍してみます。

まずはtar+gzから。

# tar xfvz ./svnrepos-0.tar.gz
./overlast/
./overlast/dav/
./overlast/locks/
./overlast/locks/db.lock
tar: Skipping to next header
tar: Archive contains obsolescent base-64 headers
gzip: stdin: invalid compressed data--crc error
gzip: stdin: invalid compressed data--length error
tar: Child returned status 1
tar: Error exit delayed from previous errors


うわー。ほんとだ、tar+gzは解凍できない。
バックアップ中に破損したことは無いけれど、
万が一を考えると、これは怖すぎるな。

次にafio+gzを解凍してみます。

# afio -ivZ ./svnrepos-0.afz
overlast -- okay
overlast/dav -- okay
overlast/locks -- okay
gzip: stdin: invalid compressed data--crc error
gzip: stdin: invalid compressed data--length error
afio: "inentry xwait()": Exit 1
overlast/locks/db.lock -- uncompressed
overlast/locks/db-logs.lock -- uncompressed
overlast/hooks -- okay
overlast/hooks/start-commit.tmpl -- uncompressed
overlast/hooks/pre-commit.tmpl -- uncompressed
overlast/hooks/pre-revprop-change.tmpl -- uncompressed
overlast/hooks/post-commit.tmpl -- uncompressed
overlast/hooks/post-revprop-change.tmpl -- uncompressed
overlast/conf -- okay
overlast/conf/svnserve.conf -- uncompressed
overlast/README.txt -- uncompressed
overlast/db -- okay
overlast/db/fs-type -- okay
overlast/db/DB_CONFIG -- uncompressed
overlast/db/__db.001 -- uncompressed
overlast/db/__db.002 -- uncompressed
overlast/db/__db.003 -- uncompressed
overlast/db/__db.004 -- uncompressed
overlast/db/__db.005 -- uncompressed
overlast/db/log.0000000501 -- uncompressed
overlast/db/nodes -- uncompressed
overlast/db/revisions -- uncompressed
overlast/db/transactions -- uncompressed
overlast/db/copies -- uncompressed
overlast/db/changes -- uncompressed
overlast/db/representations -- uncompressed
overlast/db/strings -- uncompressed
overlast/db/uuids -- uncompressed
overlast/db/log.0000000500 -- uncompressed
overlast/format -- okay


一見分かりにくいですが、多分overlast/locks/db.lockが破損していました。
他のファイルは無事でした。

Subversionのリポジトリのようなデータベースをバックアップする場合は、
破損箇所によっては無事に復帰できないですけれど、
途中が壊れて、あとが解凍できないよりは助かりますね。

ということで、これでcronを使って昼休みごろにバックアップすれば、
昼食を食べている間にバックアップが取れて幸せです。
仕事が終わったときにもバックアップすれば、なお良いかもしれません。

私は個人用途なので沢山バックアップできませんが、
企業や研究室ならバックアップしたい放題ですし
ファイル名を変えて、Raidじゃない領域に保存するのが良いでしょう。
# Raidが死んだら立ち直れません。

[2006-10-12]追記
Subversionのリポジトリのバックアップをする際に、
直接リポジトリを自動でバックアップするのは、
バックアップ中にコミットしてしまう可能性があって危険でした。
そこで、svnadmin hotcopyでリポジトリのコピーを作って
そのコピーをバックアップするようにスクリプトを変更しました。
なので、圧縮ファイルを壊す例の出力は少し変わります。
svnadmin dumpを使わない理由はとくにないので、
svnadmin dumpでも良いと思います。
svnadmin hotcopyでコピーを作ると、svnrepos/db/*.dbなど
一部のファイルがコピーされませんけれど、
svn co file:///pass/to/svnrepos-copyでcoできるので、
まったく問題なさそうです。
Googleではhotcopyしたあとrsyncしているらしいです。へえ。

投稿者:としのり  日時:23:59:59 | コメント | トラックバック |