centOS用shell脚本定时备份mongodb并清理历史备份版本
文章目录
- 前言
- centOS安装crontab
- 创建备份数据库需要的目录和文件
- 编写shell脚本
- 保存文件手动执行是否成功
- 添加定时任务
- 重新启动crontab服务
- 测试定时任务能正常启动
- 查看crontab运行日志
前言
备份数据库是运维同志的日常工作之一,
但是对于中小公司,或者服务器托管在云服务商的公司来说,基本没有专业的运维工程师.
所以一部分公司中,开发工程师就要分担一些运维的事情.
我们本着能让计算机做的事情绝对不动手原则,
今天就和大家分享一下 centOS下定时自动备份mongodb数据库,并且清理历史备份记录.
centOS安装crontab
如果你的系统已经安装,请直接跳过此步骤.
[root@CentOS ~]# yum install vixie-cron
[root@CentOS ~]# yum install crontabs
说明
vixie-cron软件包是cron的主程序;
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序.
cron 是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
- /sbin/service crond start //启动服务
- /sbin/service crond stop //关闭服务
- /sbin/service crond restart //重启服务
- /sbin/service crond reload //重新载入配置
如果上面启动/关闭 等操作失败,请尝试下面的命令: - /bin/systemctl start crond.service //启动服务
- /bin/systemctl stop crond.service //关闭服务
- /bin/systemctl restart crond.service //重启服务
- /bin/systemctl reload crond.service //重新载入配置
查看服务状态
查看crontab服务状态:service crond status
设置服务开机启动
加入开机自动启动:
chkconfig --level 35 crond on
crontab指令格式
* * * * * command
分 时 日 月 周 命令
- 第1列表示分钟1~59 每分钟用*或者 */1表示
- 第2列表示小时1~23(0表示0点)
- 第3列表示日期1~31
- 第4列表示月份1~12
- 第5列标识号星期0~6(0表示星期天)
- 第6列要运行的命令
创建备份数据库需要的目录和文件
我在 /data 目录下创建 mongodb_bak 备份目录
mkdir mongodb_bak
然后 mongodb_bak 目录下
创建存放数据备份文件列表 mongodb_bak_list
创建存放当日备份文件目录 mongodb_bak_now
创建执行的shell文件 MongoDB_bak.sh
创建存放执行日志的文件 corntab.log
crontab.log mongodb_bak_list mongodb_bak_now MongoDB_bak.sh
可能遇到的坑
给文件指定权限,否则无法执行
[root@server1 mongodb_bak]# sh +x MongoDB_bak.sh
[root@server1 mongodb_bak]# sh +x crontab.log
编写shell脚本
#!/bin/bash
source /etc/profile
OUT_DIR=/data/mongodb_bak/mongodb_bak_now #临时备份目录
TAR_DIR=/data/mongodb_bak/mongodb_bak_list #备份存放路径
DATE=`date +%Y_%m_%d` #获取当前系统时间
DB_USER=你数据库帐号 #数据库账号
DB_PASS=你的数据库密码 #数据库密码
MONGODUMP_PATH=/usr/bin/mongodump # 指定mongodump命令运行绝对路径
MONGO_DATABASE="你要备份是数据库名"
DAYS=20 #DAYS=30代表删除30天前的备份,即只保留近20天的备份
TAR_BAK="mongodb_bak_$DATE.tar.gz" #最终保存的数据库备份文件
cd $OUT_DIR
rm -rf $OUT_DIR/*
mkdir -p $OUT_DIR/$DATE
$MONGODUMP_PATH -h 127.0.0.1:27037 -u $DB_USER -p $DB_PASS -d $MONGO_DATABASE --authenticationDatabase "admin" -o $OUT_DIR/$DATE #备份数据库
tar -zcvPf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE #压缩为.tar.gz格式
find $TAR_DIR/ -mtime +$DAYS -delete #删除20天前的备份文件
exit
可能遇到的坑
文件必须#!/bin/bash开头
shell执行文件开头必须 #!/bin/bash
之后的所有 # 号,都被当做注释
环境变量不生效
上面第二行文本
source /etc/profile
就是为了让环境变量生效,这个文件中涉及到环境变量的地方还有:
mongodump
我们上面定义了命令绝对路径:
MONGODUMP_PATH=/usr/bin/mongodump
如果你在shell环境中可以直接运行 mongodump 指令,但是 crontab 定时启动时环境变量不一定生效,虽然最上面执行了 source /etc/profile
保险起见: 环境变量使用命令绝对地址.
tar压缩文件报错
tar: Removing leading '/' from member names
你可能会遇到这个错误,但是发现依然打包成功.
tar 在压缩绝对路径下的文件时,会报此错误,但是如果你把开头的 '/' 去掉,那么彻底报错.
执行 man tar 执行查看到下面的帮助信息:
-P, --absolute-names
don't strip leading `/'s from file names
可以理解为不从绝对路径中剥离 '/'
所以我们 tar 指令要加上 -P 参数.
通过实践发现, -P 参数 必须加到 -f 参数之前才不会报此错误.
所以上面的压缩命令是这样的:
tar -zcvPf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE #压缩为.tar.gz格式
保存文件手动执行是否成功
sh MongoDB_bak.sh
手动执行成功后,
mongodb_bak_now 目录下有刚刚备份的数据库目录
mongodb_bak_list 目录下有今日时间命名的压缩文件
说明脚本没有问题,我们继续下一步.
添加定时任务
执行命令
crontab -e
添加定时运行指令
0 2 * * * /etc/profile;/bin/sh /data/mongodb_bak/MongoDB_bak.sh >> /data/mongodb_bak/crontab.log 2>&1
每日凌晨2:00执行此脚本,执行脚本的所有输出定向保存到 crontab.log 文件中.
因为crontab 的运行异常或者成功信息都会发送mail ,而我的服务器没有安装mail服务,所以我把输入定向到log日志,
如果你不需要这样做,可以不用定向输出到日志.
可能遇到的坑
上面的运行指令你也许会写成这样:
0 2 * * * sh /data/mongodb_bak/MongoDB_bak.sh
这种情况也许会执行定时脚本,但是不一定shell文件被执行.
因为 sh 这个环境变量 corntab 不一定会识别.
所以我们先执行 /etc/profile 保证环境变量载入,这这用命令绝对路径 /bin/sh 来执行脚本文件,确保能识别.
重新启动crontab服务
crontab 服务要重新启动,上面添加的指令才能执行成功.
/bin/systemctl restart crond.service
测试定时任务能正常启动
为了测试定时任务能否正常定时启动,我们先把时间设置成 每分钟 运行一次来测试.
* * * * * /etc/profile;/bin/sh /data/mongodb_bak/MongoDB_bak.sh >> /data/mongodb_bak/crontab.log 2>&1
可能遇到的坑
每分钟 要用 * * * * * (五颗星)来格式化,
可能网上会看到另外一个版本,每分钟用 */1 * * * * 来格式化,这种方式每分钟运行失败.
重新启动 crontab 服务,测试每分钟能否启动成功.
如果执行没有问题,把执行周期再改回每天凌晨2:00执行.
重新启动 crontab 服务.
查看crontab运行日志
crontab的日志位置一般位于/var/log/cron
用于查看 crontab 执行记录
tail -f /var/log/cron
上面的/var/log/cron只会记录是否执行了某些计划的脚本,
但是具体执行是否正确以及脚本执行过程中的一些信息linux会通过邮件形式发送到给该用户,
如果你希望确切掌握脚本执行结果
- 可以安装linux邮件服务
- 或者用上面的方式,脚本里面的执行过程输入定向到一个log日志 /data/mongodb_bak/crontab.log