虽然有复制集的高可用性保证,数据丢失的可能很低,但仍然需要备份
-
防止硬件故障引起的数据丢失
-
防止人为错误误删数据
-
时间包溯
-
监管要求
1.) 备份恢复工具介绍
mongoexport/mongoimport说明
mongoexport/mongoimport可以实现逻辑备份,类似于mysqldump,可以导出json或csv格式文件 应用场景总结
-
异构平台迁移,比如:MySQL和MongoDB
-
同平台跨大版本的MongoDB数据导出导入:比如mongodb2->mongodb3
mongodump/mongorestore说明
物理备份,日常备份恢复时使用,导出的二进制文件
mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘,但是存在的问题时使用 mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,则备份出来的文件可能不完全Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。 使用mongodump备份最灵活,但速度上也是最慢的
mongodump出来的数据不能表示某个时间点,只是某个时间段
mongoexport/mongoimport与mongodump/mongorestore的对比
mongoexport/mongoimport导入/导出的是JSON格式
而mongodump/mongorestore导入/导出的是BSON格式,
JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。
在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。
当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。
备份工具安装
下载工具地址:https://www.mongodb.com/try/download/database-tools
root@mongdb-1:~# tar xf mongodb-database-tools-ubuntu2204-x86_64-100.11.0.tgz -C /
root@mongdb-1:~# cp /mongodb-database-tools-ubuntu2204-x86_64-100.11.0/bin/* /usr/local/bin/
2.)mongoexport/mongoimport使用
导出工具mongoexport
mongoexport具体用法如下所示:
参数说明:
-h #指明数据库宿主机的IP
-u #指明数据库的用户名
-p #指明数据库的密码
-d #指明数据库的名字
-c #指明collection(表)的名字
-f #指明要导出那些列
-o #指明到要导出的文件名
-q #指明导出数据的过滤条件
--type=csv 或 --csv #指定导出为csv格式,默认json格式
--authenticationDatabase <验证库> #指定验证库
范例:
myrepl [direct: primary] test> show databases
admin 220.00 KiB
config 272.00 KiB
local 552.00 KiB
test 156.00 KiB
myrepl [direct: primary] test> show collections
teacher
myrepl [direct: primary] test> show tables
teacher
#单表备份至json格式
root@mongdb-1:~# mongoexport -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -c teacher -o /mongodb/teacher.json
2025-03-05T21:06:41.659+0800 connected to: mongodb://localhost:27017/
2025-03-05T21:06:41.682+0800 exported 999 records
root@mongdb-1:~# head /mongodb/teacher.json -n 2
{"_id":{"$oid":"67c71b777d36d2901c51e945"},"uid":1,"name":"tang1","age":18,"date":{"$date":"2025-03-04T15:25:43.251Z"}}
{"_id":{"$oid":"67c71b777d36d2901c51e946"},"uid":2,"name":"tang2","age":18,"date":{"$date":"2025-03-04T15:25:43.257Z"}}
#单表备份至csv格式,则需要使用--type=csv参数(test库的teacher 字段uid,name,age,date做为CSV表头)
root@mongdb-1:~# mongoexport -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -c teacher --type=csv -f uid,name,age,date -o /mongodb/teacher.csv
root@mongdb-1:~# head /mongodb/teacher.csv -n3
uid,name,age,date
1,tang1,18,2025-03-04T15:25:43.251Z
2,tang2,18,2025-03-04T15:25:43.257Z
导入工具mongoimport
参数说明:
mongoimport --help
-h #指明数据库宿主机的IP
-u #指明数据库的用户名
-p #指明数据库的密码
-d #指明数据库的名字
-c #指明collection(表)的名字
-f #指明要导出那些列
--type=csv 或 --csv #指定导入为csv格式,默认json格式
-j,--numInsertionworkers=<number> #同时插入的数量,默认为
--authenticationDatabase <验证库> #指定验证库
--headerline #指明第一行是列名,不需要导入
范例: 数据恢复
# 还原
# 删除表数据
myrepl [direct: primary] test> db.teacher.drop()
true
myrepl [direct: primary] test> db.teacher.countDocuments()
0
#导入json格式表数据到test库的teacher表中
root@mongdb-1:~# mongoimport -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -c teacher /mongodb/teacher.json
myrepl [direct: primary] test> db.teacher.countDocuments()
999
#导入CSV格式表数据到test库的teacher表中(#导入标准的csv格式(文件第一行有列名字)的文件到teacher表中)
root@mongdb-1:~# mongoimport -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -c teacher --type=csv --headerline --file /mongodb/teacher.csv
# 导入非标准的csv格式(第一行没有列名字)的文件到teacher表中
# (前提导出时不带表头)
root@mongdb-1:~# mongoimport -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -c teacher --type=csv -f uid,name,age,date --file /mongodb/teacher.csv
3.) mongodump/mongorestore使用
mongodump备份
-h #指明数据库宿主机的IP
-u #指明数据库的用户名
-p #指明数据库的密码
-d #指明数据库的名字
-c #指明collection(表)的名字
-o #指明到要导出的文件名
-q #指明导出数据的过滤条件
--authenticationDatabase #验证数据的名称
--gzip #备份时压缩
--oplog # 启动副本集上拍摄时间点快照
范例:mongodump
#全库备份
#注意:完全备份不会备份config和local库,但会备份admin库和test库及用户库
root@mongdb-1:~# mkdir -p /backup/full
root@mongdb-1:~# mongodump -uroot -p123456 --port 27017 --authenticationDatabase admin -o /backup/full
root@mongdb-1:~# tree /backup/full/
/backup/full/
├── admin
│ ├── system.users.bson
│ ├── system.users.metadata.json
│ ├── system.version.bson
│ └── system.version.metadata.json
├── config
│ ├── settings.bson
│ └── settings.metadata.json
└── test
├── teacher.bson
└── teacher.metadata.json
#备份指定库test
root@mongdb-1:~# mkdir -p /backup/test_db
root@mongdb-1:~# mongodump -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -o /backup/test_db
2025-03-05T21:43:45.513+0800 writing test.teacher to /backup/test_db/test/teacher.bson
2025-03-05T21:43:45.516+0800 done dumping test.teacher (999 documents)
root@mongdb-1:~# tree /backup/test_db/
/backup/test_db/
└── test
├── teacher.bson
└── teacher.metadata.json
#备份test库下的teacher集合(表)
root@mongdb-1:~# mkdir -p /backup/test_db_teather
root@mongdb-1:~# mongodump -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -c teacher -o /backup/test_db_teather
2025-03-05T21:45:44.797+0800 writing test.teacher to /backup/test_db_teather/test/teacher.bson
2025-03-05T21:45:44.799+0800 done dumping test.teacher (999 documents)
root@mongdb-1:~# tree /backup/test_db_teather
/backup/test_db_teather
└── test
├── teacher.bson
└── teacher.metadata.json
#完全备份并压缩备份
root@mongdb-1:~# mkdir -p /backup/full_gzip
root@mongdb-1:~# mongodump -uroot -p123456 --port 27017 --authenticationDatabase admin -o /backup/full_gzip --gzip
2025-03-05T21:47:18.887+0800 writing admin.system.users to /backup/full_gzip/admin/system.users.bson.gz
...
2025-03-05T21:47:18.898+0800 done dumping test.teacher (999 documents)
root@mongdb-1:~# tree /backup/full_gzip/
/backup/full_gzip/
├── admin
│ ├── system.users.bson.gz
│ ├── system.users.metadata.json.gz
│ ├── system.version.bson.gz
│ └── system.version.metadata.json.gz
├── config
│ ├── settings.bson.gz
│ └── settings.metadata.json.gz
└── test
├── teacher.bson.gz
└── teacher.metadata.json.gz
mongorestore还原
-h #指明数据库宿主机的IP
-u #指明数据库的用户名
-p #指明数据库的密码
-d #指明数据库的名字
-c #指明collection(表)的名字
-q #指明导出数据的过滤条件
--authenticationDatabase#验证数据的名称
--gzip #备份时压缩
--oplogReplay #恢复完数据文件后再重放oplog。默认重放dump/oplog.bson
--oplogFile=<filename> #指定需要重放的op10g文件位置
--oplogLimit=<seconds>[:ordinal] #重放op10g 时截止到指定时间点
--drop #恢复的时候把之前的集合dr op掉
范例: mongorestore
#恢复完全备份
root@mongdb-1:~# mongorestore -uroot -p123456 --port 27017 --authenticationDatabase admin /backup/full
#从完全备份的压缩备份中的test库恢复至test1库
root@mongdb-1:~# mongorestore -uroot -p123456 --port 27017 --authenticationDatabase admin -d test1 /backup/full_gzip/test/ --gzip
2025-03-05T21:54:49.703+0800 The --db and --collection flags are deprecated for this use-case; please use --
...
2025-03-05T21:54:49.757+0800 999 document(s) restored successfully. 0 document(s) failed to restore.
myrepl [direct: primary] test> use test1
switched to db test1
myrepl [direct: primary] test1> db.teacher.find().limit(2)
[
{
_id: ObjectId('67c8517fb39473133aaacf42'),
uid: 1,
name: 'tang1',
age: 18,
date: '2025-03-04T15:25:43.251Z'
},
{
_id: ObjectId('67c8517fb39473133aaacf43'),
uid: 2,
name: 'tang2',
age: 18,
date: '2025-03-04T15:25:43.257Z'
}
#从完全备份中的teacher表恢复到test库中的test库的表teacher1中
root@mongdb-1:~# mongorestore -uroot -p123456 --port 27017 --authenticationDatabase admin -d test -c teacher1 --gzip /backup/full_gzip/test/teacher.bson.gz
2025-03-05T21:56:42.597+0800 The --db and --collection flags are deprecated for this use-case; please use --nsInclude instead, i.e. with --nsInclude=${DATABASE}.${COLLECTION}
...
2025-03-05T21:56:42.661+0800 999 document(s) restored successfully. 0 document(s) failed to restore.
myrepl [direct: primary] test1> use test
switched to db test
myrepl [direct: primary] test> db.teacher1.find().limit(1)
[
{
_id: ObjectId('67c8517fb39473133aaacf42'),
uid: 1,
name: 'tang1',
age: 18,
date: '2025-03-04T15:25:43.251Z'
}
]
#默认不允许覆盖恢复会报错,可以使用选项--drop实现覆盖恢复,表示恢复的时候先之前的集合drop掉(危险),再恢复
root@mongdb-1:~# mongorestore -uroot -p123456 --port 27017 --authenticationDatabase admin -d test --drop /backup/full
文章评论