MongoDB数据备份与迁移
MongoDB备份工具简介
- mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式
- mongodump/mongorestore 导入/导出的是BSON格式
- JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性
- JSON虽然具有较好的跨版本通用性,
但其只保留了数据部分,不保留索引(后边版本支持恢复时保留索引信息了,但是目前网络上主流的博客都说不支持,有点NT),账户等其他基础信息
。使用时应该注意
MongoDB数据备份/还原(mongodump/mongorestore)
MongoDB环境: 6.0.3
- 如果你的数据库比较小(<100GB),并想完全控制你的备份文件。那么 MongoDump 和 MongoRestore 就是最佳搭档。通过这两个 mongo 脚本命令你可以手动备份数据库或集合(collections)。Mongodump 会将将所有数据以 Binary JSON(BSON)格式转储到指定位置。 Mongorestore 可以将这些 BSON 文件来还原到你的数据库
默认情况下 mongodump 不获取 local 数据库里面的内容
全库备份还原(针对副本集)
# 1.随便进入mongodb容器,一般情况下是-0为主节点
root@tcs-x-1 ~]# kubectl exec -it pdos-mongodb-0 -n pdos /bin/bash
# 2. 查询当前哪个节点为主节点(二个方式都可以), .primary为返回Json的字段
I have no name!@pdos-mongodb-0:/$ mongosh --port 27017 -u root -p rootPassword --authenticationDatabase admin --eval "rs.isMaster().primary"
pdos-mongodb-0.pdos-mongodb.pdos.svc.cluster.local:27017
I have no name!@pdos-mongodb-0:/$ mongosh --port 27017 -u root -p rootPassword --authenticationDatabase admin --eval "rs.isMaster().ismaster"
true
# 3. 进入主节点容器进行数据备份,这里可以看出pdos-mongodb-0为主节点,
# 3.1 -o 执行备份路径
# 3.2 --authenticationDatabase 指定认证库
# 3.3 --gzip 备份的时候同时压缩一下,备份的bson全部为压缩格式
mongodump --port 27017 -u root -p rootPassword --authenticationDatabase admin -o /tmp/mongodb-backup --gzip
# 4. 将容器内的备份文件拷贝到新mongodb库下面(需要在主节点进行操作)
[root@tcs-x-1 ~]# kubectl cp pdos-mongodb-0:/tmp/mongodb-backup ./mongodb-backup -n pdos
tar: Removing leading `/' from member names
[root@tcs-x-2 ~]# kubectl cp mongodb-backup pdos-mongodb-0:/tmp/mongodb-backup -n pdos
# 5. 还原数据库(会还原所有库)
mongorestore --port 27017 -u root -p rootPassword --authenticationDatabase admin --gzip /tmp/mongodb-backup
单个库备份还原(针对副本集)
- 针对pdos业务数据库迁移,这个待迁移的库用户账号什么的已使用bitnami chart部署时初始化好了
# 1.随便进入mongodb容器,一般情况下是-0为主节点
root@tcs-x-1 ~]# kubectl exec -it pdos-mongodb-0 -n pdos /bin/bash
# 2. 查询当前哪个节点为主节点(二个方式都可以), .primary为返回Json的字段
I have no name!@pdos-mongodb-0:/$ mongosh --port 27017 -u root -p rootPassword --authenticationDatabase admin --eval "rs.isMaster().primary"
pdos-mongodb-0.pdos-mongodb.pdos.svc.cluster.local:27017
I have no name!@pdos-mongodb-0:/$ mongosh --port 27017 -u root -p rootPassword --authenticationDatabase admin --eval "rs.isMaster().ismaster"
true
# 3. 查询主节点目前有哪些库
I have no name!@pdos-mongodb-0:/tmp$ ·
admin 140.00 KiB
config 360.00 KiB
local 207.60 MiB
tud_pdos 814.39 MiB
# 4. 进入主节点容器进行数据备份,这里可以看出pdos-mongodb-0为主节点,
# 4.1 -o 执行备份路径
# 4.2 --authenticationDatabase 指定认证库
# 4.3 --gzip 备份的时候同时压缩一下,备份的bson全部为压缩格式
# 4.4 -d 备份哪个数据库
mongodump --port 27017 -u root -p rootPassword --authenticationDatabase admin -d tud_pdos -o /tmp/mongodb-backup --gzip
# 4. 将容器内的备份文件拷贝到新mongodb库下面(需要在主节点进行操作)
[root@tcs-x-1 ~]# kubectl cp pdos-mongodb-0:/tmp/mongodb-backup ./mongodb-backup -n pdos
tar: Removing leading `/' from member names
[root@tcs-x-2 ~]# kubectl cp mongodb-backup pdos-mongodb-0:/tmp/mongodb-backup -n pdos
# 移除pdos生成db
mongosh --port 27017 -u root -p rootPassword --authenticationDatabase admin --eval "db.getSiblingDB('tud_pdos').dropDatabase()"
{ ok: 1, dropped: 'tud_pdos' }
# 5. 还原数据库,还原tud_pdos数据库下所有的collection
# 5.1 --nsInclude 还原tud_pod数据库下面所有的collection
# 5.2 --drop 在导入前,删除每个collection,不是迁移场景请勿使用该参数
# 5.3 --keepIndexVersion 阻止mongorestore还原时升级已存在的索引版本
# 5.4 --maintainInsertionOrder 维持插入的顺序,保证_id索引是一致的(理论上),选项从版本4.2开始引入,如果指定该选项,mongorestore在还原导入文档时以实际导出时的插入顺序一致,这其中包括批量写文档的顺序以及在批量中文档的插入顺序,在早期版本中只能保证批量写文档的顺序。如果指定该选项同时也指定了选项--stopOnError和设置选项
# 5.5 --stopOnError 遇到错误时终止
# 5.6 --preserveUUID 保留collection的UUID
mongorestore --port 27017 -u root -p rootPassword --authenticationDatabase admin --nsInclude 'tud_pdos.*' --keepIndexVersion --maintainInsertionOrder --stopOnError --preserveUUID --drop --gzip /tmp/mongodb-backup
# 6. 验证_ID是否一致
MongoDB迁移后数据校验
# 数据校验,目前数据校验主要分三个部分
判断两个数据库的表数量是否一致
判断两个数据库每个表中的数据量是否一致
判断两个数据库每个表的索引是否一致
判断两个数据库中每个表的前 10 条数据是否一致