Pengertian histori back-up Apa maksudnya backup dengan histori? Artinya, back-up yang telah dilakukan pada periode sebelumnya (misal: kemarin, 2 hari lalu, seminggu lalu, dan seterusnya), tidak dihapus melainkan tetap disimpan. Umumnya, standar di dunia TI dalam back-up korporat adalah menyimpan backup data terbaru, 7 histori backup harian, 4 histori backup mingguan, dan beberapa histori backup bulanan (mis: 12). Sehingga periode histori total adalah 12 bulan. Back-up dengan histori lebih berguna karena dapat membantu menyelamatkan data yang rusak atau terhapus tapi tidak segera diketahui. Misalnya Anda secara tak sadar menghapus sebuah direktori yang dirasa tidak dibutuhkan lagi karena proyek sudah selesai. Ternyata sebulan kemudian, proyek diteruskan. Jika tidak menyim pan histori back-up, maka setelah Anda menghapus direktori tersebut, pada run back-up harian berikutnya data backup terbaru pun tidak akan lagi berisi data direktori tersebut, karena back-up terbaru mengikuti perkembangan data terbaru. Atau, katakanlah Anda menggunakan atau mengembangkan program versi baru. Ternyata setelah beberapa saat baru diketahui bahwa program ini mengandung bug dan sedikit demi sedikit merusak atau menghapus sebagian kecil data. Agar yakin tidak kehilangan data berharga, Anda ingin membandingkan data yang ada sekarang dengan kondisi 6 bulan yang lalu. Atau, Anda ingin kembali pada kondisi konfi gurasi seminggu yang lalu sebelum Anda melakukan instal ulang OS. Jika Anda melakukan back-up dengan histori pada direktori /etc, hal ini mudah saja dilakukan. Tinggal mengambil data histori backup yang sesuai.
Program back-up-with-history Berikut ini implementasi sistem back-up harian dengan histori menggunakan rsync, dalam sekitar 100 baris Perl. Save program ini dengan nama back-up-with-history.pl.
#!/usr/bin/perl -w
use strict;
use Cwd qw(abs_path);
use POSIX;
use Time::Local;
# --- config
my $HISTORIES = [ -7, 4, 3 ];
# --- subs
sub esc {
local $_ = shift;
s/’/’”’”’/g;
“’$_’”;
}
# --- main
@ARGV == 2 or die “Usage: $0
\n”;
my ( $src, $dst ) = @ARGV;
for ( $src, $dst ) {s!/$!!}
( -d $src ) or die “Src haruslah
direktori yang sudah ada: $src\n”;
system “mkdir -p “ . esc(“$dst/
current”);
( -d “$dst/current” ) or die “Gagal
membuat creating $dst/current\n”;
print “Membuat backup terbaru $src
ke $dst/ ...\n”;
system “nice -n19 rsync -av --del
--force “
. “--link-dest “
. esc( abs_path(“$dst”) . “/
current” ) . “ “
. esc(“$src/”) . “ “
. esc(“$dst/.work/”) . “\n”;
warn “Perintah rsync tidak sukses,
sebaiknya Anda periksa\n” if $?;
chdir($dst) or die “Tidak bisa chdir
ke $dst: $!\n”;
system “touch .current.timestamp”;
my $now = time;
my @st = stat(“.current.timestamp”);
my $tstamp
= POSIX::strftime( “%Y-%m-
%d\@%H:%M:%S+00”, gmtime( $st[9] ||
$now ) );
rmdir “current” or rename “current”,
“hist.$tstamp”;
rename “.work”, “current”;
print “Menghapus histori backup yang
sudah terlalu lama ...\n”;
for my $level ( 1 .. @$HISTORIES ) {
my $is_highest_level = $level ==
@$HISTORIES;
my $prefix = “hist” . ( $level ==
1? : $level );
my $prefix_next_level = “hist” .
( $level + 1 );
my $n = $HISTORIES->[ $level
- 1 ];
my $moved = 0;
if ( $n > 0 ) {
print “Hanya menyimpan $n
buah histori backup L$level ...\n”;
my @f = reverse sort grep
{!/\.work$/ } glob “$prefix.*”;
my $any_tagged = ( grep {/
t$/} @f )? 1: 0;
for my $f ( @f[ $n .. @f - 1
] ) {
my ( $st, $tagged ) = $f
=~ /[^.]+\.(.+?)(t)?$/;
my $f2 = “$prefix_next_
level.$st”;
if ( !$is_highest_level
&&!$moved
&& ( $tagged
||!$any_tagged ) )
{
print “Memindahkan
level histori backup: $f -> $f2\n”;
system “mv “ .
esc($f) . “ “ . esc($f2);
$moved++;
if ( $f ne $f[0] ) {
my $e3 = esc(
$f[0] );
system “mv $e3
${e3}t”;
}
}
else {
print “Menghapus
histori backup: $f ...\n”;
system “nice -n19 rm
-rf “ . esc($f);
}
}
}
else {
$n = -$n;
print “Hanya menyimpan
histori backup L$level sd $n hari
...\n”;
my @f = reverse sort grep
{!/\.work$/ } glob “$prefix.*”;
my $any_tagged = ( grep {/
t$/} @f )? 1: 0;
for my $f (@f) {
my ( $st, $tagged ) = $f
=~ /[^.]+\.(.+?)(t)?$/;
my $f2 = “$prefix_next_
level.$st”;
my $t;
$st =~ /(\d\d\d\d)-
(\d\d)-(\d\d)\@(\d\d):(\d\d):(\d\
d)\+00/;
$t = timegm( $6, $5, $4,
$3, $2 - 1, $1 ) if $1;
$st && $t or do {
print “Histori
backup salah format: $f, diabaikan\
n”;
next;
};
if ( $t > $now ) {
print “Histori
backup di masa depan? $f, diabaikan\
n”;
next;
}
my $delta = ( $now - $t
) / 86400;
if ( $delta > $n ) {
if ( !$is_highest_
level
&&!$moved
&& ( $tagged
||!$any_tagged ) )
{
print
“Memindahkan level histori backup:
$f -> $f2\n”;
system “mv “ .
esc($f) . “ “ . esc($f2);
$moved++;
if ( $f ne $f[0]
) {
my $e3 =
esc( $f[0] );
system “mv
$e3 ${e3}t”;
}
}
else {
print “Menghapus
history backup: $f ...\n”;
system “nice -
n19 rm -rf “ . esc($f);
}
}
}
}
}
__END__
Cara menggunakan skrip ini:
$ backup-with-history DIR DIRBACKUP
DIR adalah direktori yang ingin di-backup, misalnya /home/steven. DIRBACKUP adalah lokasi back-up yang diinginkan, misal: /backup/home-steven. Sebaiknya / backup berada pada harddisk yang berbeda, karena tujuan back-up lokal adalah menghindari kehilangan data akibat kerusakan harddisk. Selesai proses back-up, skrip akan membentuk direktori DIRBACKUP/current/ yang berisi backup terbaru, dan serangkaian direktori DIRBACKUP/hist.*, hist2.*, dan hist3.* yang berisi histori backup harian, mingguan, bulanan. Untuk melakukan backup itu sendiri intinya pada baris 27-31, yaitu mengandalkan rsync. Rsync sudah akan menangani transfer dan sinkronisasi struktur direktori beserta metadata setiap fi le (permission, kepemilikan, tanggal, dan seba gainya). Dengan opsi --link-dest, rsync juga akan membandingkan data yang ada dengan back-up terakhir (current/) dan melakukan hardlinking jika memungkinkan. Sisa dari skrip sebagian besar adalah penanganan rotasi histori back-up. Skrip ini masih sederhana. Bisa Anda tambah agar dapat dikonfi gurasi (misal: opsi --exclude rsync, dan lain-lain). Selamat mencoba
Title : Back-up Filesystem dengan Histori Menggunakan rsync 1
Description : Pengertian histori back-up Apa maksudnya backup dengan histori? Artinya, back-up yang telah dilakukan pada periode sebelumnya (misal: kem...