010.MongoDB备份恢复
程序员文章站
2022-06-29 08:16:11
一 MongoDB备份1.1 备份概述mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport。mongodump备份的原理是通过一次查询获取当前服务器快照,并将快照写入磁盘中,因此这种方... ......
一 mongodb备份
1.1 备份概述
mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport。
mongodump备份的原理是通过一次查询获取当前服务器快照,并将快照写入磁盘中,因此这种方式保存的也不是实时的。在获取快照后,服务器还会有数据写入,为了保证备份的安全,可以利用fsync锁使服务器数据暂时写入缓存中。
mongodb备份恢复方式通常有以下三种:
- 文件快照方式
- 复制数据文件方式
- 使用mongodump和mongorestore方式
1.2 文件快照方式
此方式相对简单,需要系统文件支持快照和mongod必须启用journal。可以在任何时刻创建快照。
恢复时,确保没有运行mongod,执行快照恢复操作命令,然后启动mongod进程,mongod将重放journal日志。
1.3 复制数据文件方式
直接拷贝数据目录下的一切文件,但是在拷贝过程中必须阻止数据文件发生更改。因此需要对数据库加锁,以防止数据写入。
1 > db.fsynclock() #锁定,将阻塞写入操作,并将脏数据刷新到磁盘上,确保数据一致。 2 # cp -r /data/db/* /backup #拷贝数据文件到备份目录下 3 > db.fsyncunlock() #文件复制完成后,对数据库进行解锁,允许写操作
注意: 在执行db.fsynclock()和db.fsyncunlock()时,不能关闭当前的shell窗口,否则可能无法连接而需要重新启动mongod服务。
恢复时,确保mongod没有运行,清空数据目录,将备份的数据拷贝到数据目录下,然后启动mongod
1 # cp -r /backup/* /data/db/ 2 # mongod -f mongod.conf
1.4 mongodump数据备份
在mongodb中我们使用mongodump命令来备份mongodb数据。该命令可以导出所有数据到指定目录中。
mongodump命令可以通过参数指定导出的数据量级转存的服务器。
语法格式:
1 > mongodump -h ip --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径
参数解释:
提示:
如果没有用户谁,可以去掉-u和-p;
如果导出本机的数据库,可以去掉-h;
如果是默认端口,可以去掉--port;
如果想导出所有数据库,可以去掉-d。
fsynclock与mongodump不能一起使用,如果数据库被锁定了,mongodump将永远挂起。使用mongodump备份比较慢。通常mongodump用来备份单个数据库、集合、子集合。
1.5 mongorestore数据恢复
在mongodb中我们使用mongorestore命令来恢复mongodb数据。该命令可以从指定目录恢复相应数据。
语法格式:
1 > mongorestore -h ip --port 端口 -u 用户名 -p 密码 -d 数据库 <path> --dir 文件存在路径
参数解释:
注意:不能同时指定 <path> 和 --dir 选项。
二 mongodump备份实例
2.1 模拟插入数据
1 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin 2 > use admin 3 > db.grantrolestouser( "admin",[{ role: "dbowner",db:"mydb" }]) 4 > db.grantrolestouser( "admin",[{ role: "restore",db:"admin" }]) 5 > db.grantrolestouser( "admin",[{ role: "backup",db:"admin" }]) 6 > use mydb 7 > for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
2.2 备份所有数据
1 [root@client ~]# mongodump --host 172.24.8.71 -u admin -p admin -o allbackup/
2.3 备份指定数据
1 [root@client ~]# mongodump --host 172.24.8.71 -d mydb -u admin -p admin -o mydbbackup/ --authenticationdatabase admin
2.4 备份指定集合
1 [root@client ~]# mongodump --host 172.24.8.71 -d mydb -c user -u admin -p admin -o usercobackup/ --authenticationdatabase admin
提示:严格来说,备份只需要读权限即可。
三 mongorestore还原实例
3.1 恢复所有数据库
1 [root@client ~]# mongorestore --host 172.24.8.71 -u admin -p admin --dir allbackup/
3.2 恢复指定数据
1 [root@client ~]# mongorestore --host 172.24.8.71 -d mydb -u admin -p admin --dir mydbbackup/mydb/ --authenticationdatabase admin
3.3 恢复指定集合
1 [root@client ~]# mongorestore --host 172.24.8.71 -d mydb -c user -u admin -p admin --dir usercobackup/mydb/user.bson --authenticationdatabase admin
提示:严格来说,恢复只需要读写权限即可。
四 mongoexport导出
4.1 mongoexport导出
4.2 导出指定数据库集合
1 [root@client ~]# mongoexport --host 172.24.8.71 -d mydb -c user -u admin -p admin -o allexport/myuser.json --authenticationdatabase admin
五 mongoimport导入
5.1 mongoimport导出
5.2 导入指定数据库集合
1 [root@client ~]# mongoimport --host 172.24.8.71 -d mydb -c user -u admin -p admin --file allexport/myuser.json --authenticationdatabase admin
六 复制集和分片备份恢复
参考:https://blog.csdn.net/zhu_tianwei/article/details/44514673
七 其他备份方式
7.1 脚本备份
1 #!/bin/sh 2 dump=mongodump 3 out_dir=/data/backup/mongod/tmp // 备份文件临时目录 4 tar_dir=/data/backup/mongod // 备份文件正式目录 5 date=`date +%y_%m_%d_%h_%m_%s` // 备份文件将以备份时间保存 6 db_user=<user> // 数据库操作员 7 db_pass=<password> // 数据库操作员密码 8 days=14 // 保留最新14天的备份 9 tar_bak="mongod_bak_$date.tar.gz" // 备份文件命名格式 10 cd $out_dir // 创建文件夹 11 rm -rf $out_dir/* // 清空临时目录 12 mkdir -p $out_dir/$date // 创建本次备份文件夹 13 $dump -u $db_user -p $db_pass -o $out_dir/$date // 执行备份命令 14 tar -zcvf $tar_dir/$tar_bak $out_dir/$date // 将备份文件打包放入正式目录 15 find $tar_dir/ -mtime +$days -delete // 删除14天前的旧备份 16 chmod +x ~/crontab/mongod_bak.sh 17 vi /etc/crontab 18 0 2 * * * root ~/crontab/mongod_bak.sh
参考链接:https://blog.csdn.net/zhu_tianwei/article/details/44514673
https://brickyang.github.io/2017/03/02/linux-%e8%87%aa%e5%8a%a8%e5%a4%87%e4%bb%bd-mongodb/
https://segmentfault.com/a/1190000006236494