使用 crond 定时备份数据库

crond 基本用法

使用 crond 可以定时执行指定任务,基本用法如下:

  • -e 编辑定时任务
  • -r 终止任务调度
  • -l 列出当前有哪些任务调度

重启任务调度:systemctl restart crond.service

可在定时任务中调用 shell 脚本,需要注意的是,在执行前需要确保用户对指定的 shell 脚本有可执行权限


基本需求

我的博客都写到了 mysql 数据库中,为了方便日后更换主机恢复数据,我需要每天凌晨 4:00 对博客数据库进行备份,备份规则为:

  • 备份到 data/backup/db 目录下
  • 备份文件以日期为名称,打包为 tar.gz 文件
  • 如发现有 10 天前的备份文件,则删除

有了基本需求,就可以编写 shell 脚本了


脚本编写

先准备好需要的自定义变量:

  • 备份目录
  • 当前时间
  • 数据库相关配置
#备份目录
BACKUP=/data/backup/db

#获取当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME

#数据库地址
HOST=localhost
#数据库用户名及密码
DB_USER=root
DB_PW=xxxxxxxx
#备份的数据库名
DATEBASE=myblog

指定备份目录,如果不存在就创建

#判断文件存在且是一个目录,不存在就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"

备份数据库

mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz

打包成 tar.gz,并删除对应的备份目录

cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
rm -rf ${BACKUP}/${DATETIME}

查找是否存在 10 天前的备份文件,存在就删除

find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "finish backup ${DATABASE}"

完整脚本:

#!/bin/bash
#备份目录
BACKUP=/data/backup/db

#获取当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME

#数据库地址
HOST=localhost
#数据库用户名及密码
DB_USER=root
DB_PW=xxxxxxxx
#备份的数据库名
DATEBASE=myblog

#备份目录,如果不存在就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"

#备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz

#打包成tar.gz,并删除对应的备份目录
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
rm -rf ${BACKUP}/${DATETIME}

#删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "finish backup ${DATABASE}"

为脚本增加可执行权限:

chmod u+x /usr/sbin/mysql_db_backup.sh

使用 crond 定时执行脚本

启动 crond 并定时调用脚本

  • crontab -e
  • 0 4 * * * /usr/sbin/mysql_db_backup.sh

简单介绍一下 crond 中 5 个占位符 * * * * * 的含义:

  • 第一个 * ,一小时中的第几分钟,范围 [0, 59]
  • 第二个 * ,一天中的第几个小时,范围 [0, 23]
  • 第三个 * ,一个月中的第几天,范围 [1, 31]
  • 第四个 * ,一年中的第几个月,范围 [1, 12 ]
  • 第五个 * ,一周当中的星期几,范围 [0, 7],0 和 7 都表示周日

因此每日凌晨四点半为 0 4 * * *

查看任务是否执行

  • crontab -l

如果输出为 0 4 * * * /usr/sbin/mysql_db_backup.sh ,则表示定时任务已经启动。