mongodb备份与恢复(下)(二)
my $return=backup_rotate($mongod_dir,$node->{'interval'});
083
my $return=backup_rotate($config_dir,$node->{'interval'});
084
if(($node->{'user'} ne '') && ($node->{'passwd'} ne '')){
085
my $conn = MongoDB::Connection->new("host" => "mongodb://$mongos_hosts","db_name" => "admin", "username" => "$node->{'user'}", "password" => "$node->{'passwd'}");
086
my $db = $conn->get_database('config');
087
my $coll=$db->get_collection('settings');
088
my $ret=$coll->update({ _id => "balancer" }, { '$set' => { 'stopped'=> 'true' } },{'false'},{'true'});
089
my $retval=system("$mongodump -h $mongos_hosts -u $node->{'user'} -p $node->{'passwd'} --db config -o $config_dir/dump.1 >$tmp_stdout 2>$tmp_stderr");
090
my $retval=system("$mongodump -h $mongod_hosts -u $node->{'user'} -p $node->{'passwd'} --oplog -o $mongod_dir/dump.1 >$tmp_stdout 2>$tmp_stderr");
091
my $ret=$coll->update({ _id => "balancer" }, { '$set' => { 'stopped'=> 'false' } },{'false'},{'true'});
092
}else{
093
my $conn = MongoDB::Connection->new("host" => "mongodb://$mongos_hosts");
094
my $db = $conn->get_database('config');
095
my $coll=$db->get_collection('settings');
096
my $ret=$coll->update({ _id => "balancer" }, { '$set' => { 'stopped'=> 'true' } },{'false'},{'true'});
097
my $retval=system("$mongodump -h $mongos_hosts --db config -o $config_dir/dump.1 >$tmp_stdout 2>$tmp_stderr");
098
my $retval=system("$mongodump -h $mongod_hosts --oplog -o $mongod_dir/dump.1 >$tmp_stdout 2>$tmp_stderr");
099
my $ret=$coll->update({ _id => "balancer" }, { '$set' => { 'stopped'=> 'false' } },{'false'},{'true'});
100
}
101
}else{
102
foreach my $each (@{$node->{'mongodsvr'}}){
103
my $dir = $node->{'backupdir'}.'/'.$each;
104
mkpath $dir unless -e $dir;
105
my $return=backup_rotate($dir,$node->{'interval'});
106
if(($node->{'user'} ne '') && ($node->{'passwd'} ne '')){
107
my $retval=system("$mongodump -h $each -u $node->
{'user'} -p $node->{'passwd'} -o $dir/dump.1 >$tmp_stdout 2>$tmp_stderr");
108
}else{
109
my $retval=system("$mongodump -h $each -o $dir/dump.1 >$tmp_stdout 2>$tmp_stderr");
110
}
111
}
112
}
113
}
114
}
115
116
sub backup_rotate {
117
my $backup_dir=shift;
118
my $retral=shift;
119
my @aa=sort{$b<=>$a} 1..$retral;
120
121
if(chdir "/$backup_dir"){
122
for my $num (@aa){
123
my $old=$num+1;
124
if(-e "dump.$num"){
125
if(-e "dump.$old"){
126
system("rm -rf dump.$old && mv dump.$num dump.$old");
127
}else{
128
system("mv dump.$num dump.$old");
129
}
130
}
131
}
132
}else{
133
return "Failed to change dir $backup_dir : $!";
134
}
135
}
二. MongoDB增量备份方法
如果数据量很大的话,备份整个
数据库将消耗更多的时间和磁盘空间。这时增量备份将会是个必然的选择,记录前一次的完整备份点,后续的备份只备份从该点发生改变的数据。
这种方法需要一台专门的备份服务器backup_server,当然backup_server需要一个完整的备份,然后通过mongooplog工具来拷贝并应用mongodb_server的oplog日志。
在mongodb_server上执行以下操作:
1
> op = db.oplog.rs.find().sort({$natural: -1}).limit(1).next();
2
> start = op['ts']['t']/1000
在backup_server上执行:
1
# mongooplog --from A --seconds SECOND
SECOND值位于start值与当前时间之间。
mongooplog工具介绍:
mongooplog从远程拉取oplog日志并应用。
01
# ./mongooplog --help
02
--help 显示帮助信息
03
-v [ --verbose ]