• 首页
  • javascript
  • centOS用shell脚本定时备份mongodb并清理历史备份版本

centOS用shell脚本定时备份mongodb并清理历史备份版本

image.png


文章目录



前言

备份数据库是运维同志的日常工作之一,
但是对于中小公司,或者服务器托管在云服务商的公司来说,基本没有专业的运维工程师.
所以一部分公司中,开发工程师就要分担一些运维的事情.

我们本着能让计算机做的事情绝对不动手原则,
今天就和大家分享一下 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

出自:centOS用shell脚本定时备份mongodb并清理历史备份版本

出自:centOS用shell脚本定时备份mongodb并清理历史备份版本

回到顶部