世代バックアップについて考えてみた。あまりにアタリマエのこと。当たり前ッす。
バックアップを何世代かにまたがってとっておく、それはそんなに難しいことでもないし、単純なことから考えていけばいいんじゃないかと。
ファイルを何回つくってmv するだけじゃないのかな
Apacheのログローテーションのように、/var/logにあるsyslogのログローテーションと同じじゃん?バックアップを取っておくときにマナエを連番でつければ世代バックアップ
1回目
- /var/www を /var/backup/var-www.tgz にバックアップ
2回目
- /var/backup/var-www.tgz を /var/backup/var-www.tgz.1 にリネーム
- /var/www を /var/backup/var-www.tgz にバックアップ
3回目
- /var/backup/var-www.tgz.1 を /var/backup/var-www.tgz.2 にリネーム
- /var/backup/var-www.tgz を /var/backup/var-www.tgz.1 にリネーム
- /var/www を /var/backup/var-www.tgz にバックアップ
n回目
- /var/backup/var-www.tgz.(n-1) を /var/backup/var-www.tgz.n にリネーム
- /var/backup/var-www.tgz.(n-2) を /var/backup/var-www.tgz.(n-1) にリネーム
- (繰り返し)
- /var/backup/var-www.tgz を /var/backup/var-www.tgz.1 にリネーム
- /var/www を /var/backup/var-www.tgz にバックアップ
何かに似ている。そうかFIFOか。コマンドを作ってスタックに積んでいって、上から順に片付けるとN世代のローテーションバックアップか
つまり、N世代のバックアップの基本はN-1回のMoveということか。
#!/usr/bin/env ruby require 'pp' cmds = [] cmds << "mv /www/backups/flv-videos.tgz /www/backups/flv-videos.old.tgz" cmds << "tar cvzf /www/flv-videos.tgz /www/flv-videos" cmds << "mv /www/flv-videos.tgz /www/backups" cmds.each{|cmd| `#{cmd}` }
コードで表現してみる。
#!/usr/bin/env ruby require 'pp' cmds = [] n.times{|i| e = i cmd << " mv /var/backup/var-www.tgz.#{(e-1)} /var/backup/var-www.tgz.#{e} " } cmd << " tar zxvf /var/www /var/backup/var-www.tgz.0 " cmds.each{|cmd| `#{cmd}` }
日付でもいいんだけど、日付でもいいんだけどさ。「何世代」ってのが見てわかるほうが嬉しいと思ったり。
同じファイルはバックアップ作ってると無駄
Cory On Writeを使えば、同じファイルをそのまま使えるので便利ですね。ハードリンク使えばはかどりますね。
そういう時はrsyncのオプションを使えばいいと。