mongodb备份与恢复(下)(二)

2014-11-24 15:41:45 · 作者: · 浏览: 5
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 ]