MySQL定时备份脚本


MySQL 作为一款开源数据库深受开发者的青睐,在不断的使用中数据也不断的积累,做好备份工作的重要性不言而喻,下面就详细介绍如何在 Linux 中实现定时数据库备份。

本文所基于的 MySQL 是通过 Docker 容器进行部署,如果是直接安装本机的教程基本类似,只需更改脚本内容即可。

1. 备份脚本

在创建脚本之前根据偏好新建目录用于存放备份数据库文件。

# 创建备份存放目录
mkdir /home/mysql/bak

# 新增备份脚本
vi mysql_bak.sh

# 赋予脚本可执行权限
chmod +x mysql_bak.sh

脚本关键部分我都进行了备注说明,这里我备份的文件命名格式为: 数据库名 _ 年月日.sql ,如:test_db_20220903.sql,根据你的具体情况进行替换即可,完整脚本内容如下:

# 进入容器, 替换为自己的容器ID
docker exec -i <容器ID> bash<<'EOF'
    
# 判断目录是否存在,不存在则创建
if [ ! -d "/backup/mysql" ]; then
    mkdir -p /backup/mysql
fi
    
# 导出数据库脚本
# 设置数据账号密码以及需要备份的数据名
mysqldump -h localhost -uroot -p123456 test_nifi --set-gtid-purged=off > /backup/mysql/test_nifi_$(date +%Y%m%d).sql
# 删除超过 10 天的数据
rm -f /backup/mysql/test_nifi_$(date -d -10day +%Y%m%d).sql
exit
EOF
    
# 将 docker 中的备份文件拷贝到宿主机上。
sudo docker cp <容器ID>:/backup/mysql/test_nifi_$(date +%Y%m%d).sql /home/mysql/bak

2. 过期删除

除了数据备份脚本之外,通常还需要一个定期删除脚本,用于删除过旧的备份文件,如果你觉得不需要也可以跳过这步。同时你也可以直接将删除脚本内容添加在备份脚本中,当完成数据备份后即进行过期文件删除。

这里我设置的是删除 10 天前的备份文件,根据你的需要替换即可。

# 新建删除脚本
vi remove_bak.sh

# 脚本中添加如下内容
#/bin/bash
find /home/mysql/bak -type f -mtime +10 | xargs rm -f

3. 数据分发

即使通过脚本进行数据文件备份,但是一旦出现服务器宕机的情况,无法及时的访问备份的文件仍然十分让人头疼。因此除了备份工作之外,还应该将备份文件再次备份到其它服务器上。

如下脚本则将本机目录下的备份文件远程传输到 192.168.0.1 服务器上,并使用 root 用户访问,账号密码为:123456,根据你的配置替换即可。

#! /bin/sh
expect -c "
    spawn scp -r /home/mysql/bak/test_nifi_$(date +%Y%m%d).sql root@192.168.0.1:/home/mysql/bak/
    expect {
        \"assword\" {set timeout 3600; send \"123456\r\";}
        \"yes/no\" {set \"yes\r\"; exp_continue;}
    }
expect eof"

4. 定时任务

完成脚本创建之后只需创建定时即可,总不能定时由运维人员手动执行脚本吧。

Linux 中可以通过 crontab 创建定时任务,先简单介绍一下其相关命令。

(1) 命令介绍

crontab 命令相应的操作与描述如下:

# 设定特定用户的定时服务
crontab -u 

# 列出当前用户定时服务内容
crontab -l

# 编辑当前用户的定时服务
crontab -e

# 删除当前用户的定时服务
crontab -r
(2) 任务介绍

定时任务通过五个 * 用于控制执行频率,不同位置 * 代表含义如下:

  • 第一个 * 表示分钟:取值范围 0-59
  • 第二个 * 表示小时:取值范围 0-23
  • 第三个 * 表示天数:取值范围 1-31
  • 第四个 * 表示月份:取值范围 1-12
  • 第五个 * 表示每周:取值范围 0-6
# 使用 - 可以划定范围
# 如下表示每天 0-3 点整执行脚本
0 0-3 * * *  sh test.sh

# 使用 , 可以枚举时间
# 如下表示每个小时的 0 分,15 分,30 分,45 分会执行脚本
0,15,30,45 * * * * sh test.sh

# 使用 / 可以指定间隔
# 如下表示每 8 小时执行脚本
如:* */8 * * * sh test.sh

# 组合用法
# 表示在前 20 分钟内每隔 10 分钟执行脚本
0-20/10 * * * * sh test.sh

了解了定时任务基本使用就可以创建我们自己的定时任务了,这里我设定了每天凌晨 3点 执行脚本。

# 编辑定时任务
crontab -e

# 添加定时任务
* 3 * * * sh /home/mysql/bak/mysql_bak.sh > info.log

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录