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