MongoDB 删库要跑路吗?其实有合理的备份,也不一定要跑路的。
在上一节,我们聊到了 MongoDB 5.x 副本集部署,这一节来聊聊副本集的数据备份。
1 创建备份用户
在 Primary 节点执行下面语句创建备份用户:
代码语言:javascript复制db.createUser(
{
user: "backup_user",
pwd: "xxxxxx",
roles: [ { role: "backup", db: "admin" } ]
}
)
2 增加备份脚本
代码语言:javascript复制mkdir -p /data/mongodb/{script,backup}
vim /data/mongodb/script/backup.sh
加入如下内容:
代码语言:javascript复制#!/bin/bash
bakdir='/data/mongodb/backup'
nowtime=$(date %Y%m%d%H%M%S)
start(){
/usr/bin/mongodump --host 127.0.0.1:27001 -u backup_user -p xxxxxx --out ${bakdir}/mongobak_${nowtime}
}
execute(){
start
if [ $? -eq 0 ]
then
echo "back successfully!"
else
echo "back failure!"
fi
}
delete(){
find $bakdir/ -name "mongobak_" -mtime 15 -exec rm -rf {} ;
}
execute
delete
echo "backup end"
赋予可执行权限
代码语言:javascript复制chmod x /data/mongodb/script/backup.sh
3 脚本测试
执行备份脚本,看是否能正常备份:
代码语言:javascript复制/data/mongodb/script/backup.sh
看结尾处是否显示如下内容:
代码语言:javascript复制back successfully!
backup end
并查看备份目录下是否有备份文件:
代码语言:javascript复制[root@node1 backup]# tree /data/mongodb/backup/
/data/mongodb/backup/
└── mongobak_20211124145903
├── admin
│ ├── system.users.bson
│ ├── system.users.metadata.json
│ ├── system.version.bson
│ └── system.version.metadata.json
├── config
│ ├── external_validation_keys.bson
│ ├── external_validation_keys.metadata.json
│ ├── tenantMigrationDonors.bson
│ ├── tenantMigrationDonors.metadata.json
│ ├── tenantMigrationRecipients.bson
│ └── tenantMigrationRecipients.metadata.json
└── martin
├── martin.bson
└── martin.metadata.json
4 directories, 12 files
4 加入到定时任务
代码语言:javascript复制crontab -e
加入如下内容:
代码语言:javascript复制
代码语言:javascript复制0 0 * * * /data/mongodb/script/backup.sh >>/data/mongodb/backup/backup.log
5 恢复
当发生误操作需要恢复数据时,将 Secondary 节点的备份文件拷贝到 一个新的 MongoDB 实例上,然后通过下面命令进行恢复:
代码语言:javascript复制mongorestore --port 27001 -uroot -pxxxxxx mongobak_20211124145903
在末尾会出现恢复详情,如下:
代码语言:javascript复制......
2021-11-24T15:01:45.786 0800 1 document(s) restored successfully. 0 document(s) failed to restore.
然后进行数据验证。确定数据正常,则从新实例上查询误操作的数据,在 Primary 节点上进行恢复。
到这里,MongoDB 集群的数据备份和恢复就聊完啦,可能有很多地方需要优化