首页 > 数据库 > > MongoDB 数据库定期备份
自己有个小程序的后台跑在服务器里,为了确保用户数据的安全性,需要每天做数据库的备份。
备份命令之前文章有提过 CentOS 部署 MongoDB :
$ mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径也许你会得到这个错误:
Failed: error connecting to db server: server returned error on SASL authentication step: Authentication failed.
那是因为之前在 MongoDB collection 莫名消失问题排查 的时候启动的鉴权登录:
security:
authorization: enabled只需要在命令后面增加一段参数即可解决:
$ mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 --authenticationDatabase admin
但如果每次都执行这段指令,只会覆盖原来的文件,如果我想保留多天的数据而不覆盖呢?
1、创建 Shell 文件:
# 创建文件
$ vim /home/crontab/mongobk.sh
# 填入以下内容
#!/bin/sh
# dump 命令执行路径,根据 mongodb 安装路径而定
DUMP=/usr/bin/mongodump
# 临时备份路径
OUT_DIR=/home/mongodb/tmp
# 压缩后的备份存放路径
TAR_DIR=/home/mongodb/backup
# 当前系统时间
DATE=`date +%Y-%m-%d`
# 数据库账号
DB_USER=admin
# 数据库密码
DB_PASS=xxxxxxx
# 代表删除 7 天前的备份,即只保留近 15 天的备份
DAYS=15
# 最终保存的数据库备份文件
TAR_BAK="mongod_bak_$DATE.tar.gz"
cd $OUT_DIR
rm -rf $OUT_DIR/*
mkdir -p $OUT_DIR/$DATE
$DUMP -h 127.0.0.1:27017 -u $DB_USER -p $DB_PASS -d dbname -o $OUT_DIR/$DATE --authenticationDatabase admin
# 压缩格式为 .tar.gz 格式
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE
# 删除 15 天前的备份文件
find $TAR_DIR/ -mtime +$DAYS -delete
exit更多命令:
--备份单个表
$ mongodump -u superuser -p 123456 --port 27017 --authenticationDatabase admin -d myTest -c d -o /backup/mongodb/myTest_d_bak_201507021701.bak
--备份单个库
$ mongodump -u superuser -p 123456 --port 27017 --authenticationDatabase admin -d myTest -o /backup/mongodb/
--备份所有库
$ mongodump -u superuser -p 123456 --authenticationDatabase admin --port 27017 -o /root/bak
--备份所有库推荐使用添加--oplog参数的命令,这样的备份是基于某一时间点的快照,只能用于备份全部库时才可用,单库和单表不适用:
$ mongodump -h 127.0.0.1 --port 27017 --oplog -o /root/bak 修改文件属性,使其可执行:
chmod +x /home/crontab/mongobk.sh$ crontab -e
# 添加下面这行:
# 每天23:50分执行一次
50 23 * * * /home/crontab/mongobk.shmongorestore 恢复数据默认是追加,如打算先删除后导入,可以加上 --drop 参数,不过添加 --drop 参数后,会将数据库数据清空后再导入,如果数据库备份后又新加入了数据,也会将新加的数据删除,它不像 MySQL 有一个存在的判断。
--在备份所有库添加 --oplog 的同时,恢复时也要加上 --oplogReplay 参数,具体命令如下(下面是恢复单库的命令):
$ mongorestore -d swrd --oplogReplay /home/mongo/swrdbak/swrd/
--恢复单个库:
$ mongorestore -u superuser -p 123456 --port 27017 --authenticationDatabase admin -d myTest /backup/mongodb/
--恢复所有库:
$ mongorestore -u superuser -p 123456 --port 27017 --authenticationDatabase admin /root/bak
--恢复单表
$ mongorestore -u superuser -p 123456 --authenticationDatabase admin -d myTest -c d /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.bson各了一段时间发现备份的文件大小都一样,不太正常(实际上这段时间数据增加了很多):

后面执行了一遍备份的指令,发现报错:
2018-06-24T11:14:44.844+0800 Failed: error getting oplog start: not found
有相关的解决方案就是在启动 mongo 服务器的时候,添加 --master 参数, 如:
$ /usr/bin/mongod --auth -port 27017 --dbpath /var/lib/mongo --master但这种方案 master/slave 是一个非常老的特性,现在已经废弃不用了,只是为了向后兼容而存在。如果想要使用 -oplog 需要构建数据库服务器集群,现在还暂时用不到集群,所以这里的解决方案就是去掉 --oplog 参数,问题解决。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3125224/ ,如需转载,请注明出处,否则将追究法律责任。