Go言語製の重複排除付きバックアップツール restic を試してみる

Duplicacy とてもいい感じだったのですが、ライセンス周り が少し不親切な感じ(値段が公開されていない?)だったので、Dupilicacy と比べると Lock-free ではないのとかWindowsのvssに対応していないなど少しだけ 機能面では劣りますが、操作性としては同じぐらい使いやすそうな restic を試してみます。

restic/restic: Fast, secure, efficient backup program

こちらはライセンスは BSD 2-Clause License ですね。

インストール

go get github.com/restic/restic
cd $GOPATH/src/github.com/restic/restic
go run build.go
mv restic $GOPATH/bin/

バックアップテスト用のディレクトリ作成

mkdir ~/dev/private/restic_test
mkdir ~/dev/private/restic_test/backup_shitai
mkdir ~/dev/private/restic_test/storage

初期化

Duplicacyではバックアップ対象のディレクトリに .duplicacy というディレクトリが できていましたが、resticでは出来ないです。ただバックアップ保存先を設定するだけ。

$ restic init --repo ~/dev/private/restic_test/storage

# パスワードが要る

enter password for new backend:
enter password again:
created restic backend de2229d3e9 at /Users/tmnm/dev/private/restic_test/storage

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

バックアップ

環境変数の RESTIC_REPOSITORYRESTIC_PASSWORD を export しておいた方が良さそうです。 (-r-p オプションが毎回要るので)

$ export RESTIC_REPOSITORY=/Users/tmnm/dev/private/restic_test/storage
$ export RESTIC_PASSWORD=komekomekomekome
$ restic backup ~/dev/private/restic_test/backup_shitai

scan [/Users/tmnm/dev/private/restic_test/backup_shitai]
scanned 1 directories, 0 files in 0:00
[0:00]   0B/s  0B / 0B  1 / 1 items  0 errors  ETA 0:00
duration: 0:00, 0.00MiB/s
snapshot f2ff1200 saved

もう一回バックアップ

$ restic backup ~/dev/private/restic_test/backup_shitai

using parent snapshot f2ff1200
scan [/Users/tmnm/dev/private/restic_test/backup_shitai]
scanned 1 directories, 0 files in 0:00
[0:00]   0B/s  0B / 0B  1 / 1 items  0 errors  ETA 0:00
duration: 0:00, 0.00MiB/s
snapshot 9e97ab4c saved

ファイル作ってバックアップ

$ echo READMEEEEEEEEEEEEEEEEEEEEEEEEEEE >> ~/dev/private/restic_test/backup_shitai/README.md
$ restic backup ~/dev/private/restic_test/backup_shitai

using parent snapshot 9e97ab4c
scan [/Users/tmnm/dev/private/restic_test/backup_shitai]
scanned 1 directories, 1 files in 0:00
[0:00] 100.00%  0B/s  33B / 33B  2 / 2 items  0 errors  ETA 0:00
duration: 0:00, 0.00MiB/s
snapshot 0947e582 saved

ファイルを更新してバックアップ

$ echo りーどみいいいいいいいいいいいいいいいいいいい >> ~/dev/private/restic_test/backup_shitai/README.md
$ restic backup ~/dev/private/restic_test/backup_shitai

using parent snapshot 0947e582
scan [/Users/tmnm/dev/private/restic_test/backup_shitai]
scanned 1 directories, 1 files in 0:00
[0:00] 100.00%  0B/s  103B / 103B  2 / 2 items  0 errors  ETA 0:00
duration: 0:00, 0.01MiB/s
snapshot 15310c56 saved

リストア

まずは一覧を確認

$ restic snapshots

ID        Date                 Host            Tags        Directory
----------------------------------------------------------------------
f2ff1200  2017-06-10 17:51:18  tmnm-mac.local              /Users/tmnm/dev/private/restic_test/backup_shitai
9e852aa8  2017-06-10 17:54:49  tmnm-mac.local              /Users/tmnm/dev/private/restic_test/backup_shitai
966ff6e5  2017-06-10 17:56:28  tmnm-mac.local              /Users/tmnm/dev/private/restic_test/backup_shitai
93a3a0c9  2017-06-10 18:00:02  tmnm-mac.local              /Users/tmnm/dev/private/restic_test/backup_shitai
9e97ab4c  2017-06-10 18:03:27  tmnm-mac.local              /Users/tmnm/dev/private/restic_test/backup_shitai
0947e582  2017-06-10 18:05:24  tmnm-mac.local              /Users/tmnm/dev/private/restic_test/backup_shitai
15310c56  2017-06-10 18:07:11  tmnm-mac.local              /Users/tmnm/dev/private/restic_test/backup_shitai

0947e582 (README.mdを作った時)に戻します。

ディレクトリごとリストアされるので、上書きする場合は以下の通り。ファイルがあっても上書きされます。

restic restore 0947e582 --target ~/dev/private/restic_test/

リストア対象を絞り込む場合は --include--exclude--path オプションで指定 出来るほか、マウントすればファイルシステムの操作で戻せるので良さそうですね(これは良いですね!)

mkdir ~/dev/private/restic_test/mnt
restic mount ~/dev/private/restice_test/mnt

cannot locate OSXFUSE
unable to umount (maybe already umounted?): unmount /Users/tmnm/dev/private/restic_test/mnt: invalid argument

Macではでけんかった、、、OSXFUSEが要るのか

mysqlのバックアップ

mysqldumpから標準出力を受け取ってっていうのが出来るんですね。

タグをつけた方が判りやすそうなので、以下の例では --tag オプションを足しています。

mysqldump [...] | restic backup --stdin --tag nantokadb

リストア

restic restore --target ./

stdin というファイルにリストアされます

リテンションポリシー

やっぱりこれが出来んとね。forget サブコマンドでやるそうです。以下は公式のマニュアルに記載のあったサンプルです。

restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --keep-yearly 75

--keep-daily 7 : 7日分のスナップショットを保管
--keep-weekly 5 : 4週分のその週の最後のスナップショットを保管(1つは keep-daily に含まれるので 5 で正解)
--keep-monthly 12 : 11か12ヶ月分の月末のスナップショットを保管(5週ある月とかが影響する)
--keep-yearly 75 : 75年分の年末のスナップショットを保管

それ以外は削除。だそうです。

resticも便利そうです!