ITPub博客

首页 > 数据库 > > MongoDB 数据库定期备份

MongoDB 数据库定期备份

作者:浪花小雨滴 时间:2020-05-12 11:43:11 0 删除 编辑

自己有个小程序的后台跑在服务器里,为了确保用户数据的安全性,需要每天做数据库的备份。

0x1 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

但如果每次都执行这段指令,只会覆盖原来的文件,如果我想保留多天的数据而不覆盖呢?


0x2 Shell 脚本

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


0x3 定时执行

$ crontab -e

# 添加下面这行:

# 每天23:50分执行一次
50 23 * * *  /home/crontab/mongobk.sh


0x4 数据恢复

mongorestore 恢复数据默认是追加,如打算先删除后导入,可以加上 --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


0x5 一些问题

各了一段时间发现备份的文件大小都一样,不太正常(实际上这段时间数据增加了很多):


后面执行了一遍备份的指令,发现报错:

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39968