CentOS 定时备份 MySQL 数据库并清理过期备份文件

创建备份目录

我的备份目录为/data/mysql_bak,根据自己的需要更改即可:

mkdir /data/mysql_bak

编写备份清理脚本

进入 mysql_bak 目录

cd /data/mysql_bak

创建 backup.sh Shell 脚本文件

touch backup.sh

执行权限,如果不赋予执行权限则该脚本不可执行,这里暴力一点,直接给全部权限

chmod 777 backup.sh

vim 编辑该文件

vim backup.sh

粘贴以下内容,并将参数修改为你自己需要的

db_user="root"
db_pwd="123456"
db_name="test_demo"
bak_dir="/data/mysql_bak"
time="$(date +"%Y%m%d_%H%M%S")"
mysqldump -u$db_user -p$db_pwd $db_name > $bak_dir/${db_name}_$time.sql

#remove out-date backup
find $bak_dir -name "$db_name*.sql" -type f -mtime +15 -exec rm -rf {} \; > /dev/null 2>&1

脚本解读

基础参数

db_user 为数据库账号;,db_pwd 为数据库密码;db_name 为要备份的数据库名称,如果想要备份所有数据库可以填写为 --all-databasesbak_dir 为备份到的目录。这些参数可根据自己的进行修改。

time 参数为备份文件名时间格式,我这里使用的是 %Y%m%d_%H%M%S,例如:20191123_161523,则生成的文件名为:test_demo_20191123_161523.sql。

备份命令

mysqldump... 为备份数据库的命令,如果为本机数据库备份则无需更改,如果要备份其他服务器的数据库则为该命令增加主机端口参数,例如:

mysqldump -u$db_user -p$db_pwd -h110.119.110.119 -P3306  $db_name > $bak_dir/${db_name}_$time.sql
清理过期文件:

脚本的最后一行命令为清理过期文件,用于清理 15 天前的文件。

-type f 表示查找普通类型的文件,f 表示普通文件,可不写;

-mtime +15 按照文件的更改时间来查找文件,+15 表示文件更改时间距现在 15 天以前;如果是 -mmin +15 表示文件更改时间距现在 15 分钟以前;

-exec rm {} ; 表示执行一段 shell 命令,exec 选项后面跟随着所要执行的命令或脚本,然后是一对 {},一个空格和一个 \,最后是一个分号;

/dev/null 2>&1 把标准出错重定向到标准输出,然后扔到 /DEV/NULL 下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面;其中的 2>&1 表示让该命令在后台执行

测试脚本

执行命令:

./backup.sh

执行 ls 或者 ls -l(简写为:ll),查看是否生成了备份文件,如果有备份文件,则证明脚本正常。

定时任务

设置定时任务

执行命令:

crontab  -e

a 或者 i 进入编辑模式,我这里设置每天凌晨 1 点 30 分执行任务脚本,粘贴以下代码:

30 01 * * * /data/mysql_bak/backup.sh

保存并退出即可。Crontab 时间设置很容易,可以参考以下说明:

Crontab 格式:分 时 日 月 周 执行命令

第 1 列分钟 1~59,每分钟用 * 或者*/1表示,整点分钟数为00或0
第 2 列小时 1~23(0 表示 0 点)
第 3 列日 1~31
第 4 列月 1~12
第 5 列星期 0~6(0 表示星期天)
第 6 列要运行的命令
0 3 * * * /data/mysql_bak/backup.sh,此命令表示在每天的凌晨三点执行一次脚本,可自行调整时间
重启 crondtab 服务
service crond restart

然后,等到时间到了之后,查看备份目录是否生成了备份文件,即可证明定时任务是否设置成功。当然,你可以临时设置一个近一点的时间查看,成功之后再改成真正需要执行的时间即可。别忘了重启 Crontab 服务。

测试删除备份文件

要测试是否能正确清理过期备份文件,可以将删除命令改为以下命令:

find $bak_dir -name "$db_name*.sql" -type f -mmin +1 -exec rm -rf {} \; > /dev/null 2>&1

即清理一分钟前的备份文件。

执行命令:

./backup.sh

查看目录是否成功删除一分钟之前的文件,并生成新的备份文件。

😇 enjoy!