一. 前言
最近文哥班里有一个学员面试成功上岸,在公司开发时遇到了这么一个需求:领导要求他编写一个shell脚本,完成定时备份数据库的需求。由于他对linux以及shell编程不是很了解,这位学员感到束手无策,于是就求助文哥帮忙。所以今天文哥就在这里写了一个基于shell脚本,对数据库进行定时备份的案例,希望对大家能够有所帮助。
二. 案例场景
1.需求分析
每天凌晨2:30备份数据库day01到/data/backup/db;
备份开始和备份结束的时候,要给出相应的提示信息;
备份后的文件要以备份时间为文件名,并打包成tar.gz的格式,比如:2021-09-15_230201.tar.gz;
在备份的同时,要检查是否有10天前备份的数据库文件,如果有就将其删除。
2.思路分析
三. 需求实现
[root@qfedu ~]# cd /usr/sbin # 为什么要放在sbin目录,因为这个目录是root用户具备执行的权限。
[root@qfedu sbin]# pwd
/usr/sbin
[root@qfedu sbin]# vim mysql_db_backup.sh
我们在shell脚本里面输入以下内容:
#!/bin/bash
# 定义备份目录
BACKUP=/data/backup/db
# 获取当前的时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
# 验证日期是否定义正确
echo $DATETIME
我们输出一下时间,看看脚本编写是否有误:
[root@qfedu sbin]# chmod u+x mysql_db_backup.sh
[root@qfedu sbin]# ./mysql_db_backup.sh
2022-09-07_230715
接下来我们继续编写脚本:
# 数据库主机地址
HOST=localhost
# 数据库用户名
DB_USER=root
# 数据库密码
DB_PW=Admin2022!
# 备份的数据库
DATABASE=day01
# 创建备份目录,如果目录不存在,则创建
# 只有[]里面的表达式为true 才会执行 && 右边的内容
# ${} 用来取文件名或文件路径
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
此时我们可以继续测试脚本是否正确,看看有没有为我们创建备份目录。
[root@qfedu sbin]# ./mysql_db_backup.sh
我们在根目录去查看备份目录是否存在:
[root@qfedu 2022-09-07_232210]# pwd
/data/backup/db/2022-09-07_232210 # 我们发现备份目录以及自动创建完成
我们继续编写shell脚本:
# 备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
现在我们执行脚本,来测试一下:
[root@qfedu sbin]# rm -rf /data # 先把之前创建的data目录删除掉
[root@qfedu sbin]# ./mysql_db_backup.sh
2022-09-07_234027
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@qfedu sbin]# cd /
[root@qfedu /]# cd /data/backup/db/2022-09-07_234027/
[root@qfedu 2022-09-07_234027]# ll
总用量 4
-rw-r--r--. 1 root root 1272 9月 7 23:40 2022-09-07_234027.sql.gz # 这就是我们打的压缩文件
[root@qfedu 2022-09-07_234027]# gunzip 2022-09-07_234027.sql.gz # 解压文件
[root@qfedu 2022-09-07_234027]# ll
总用量 4
-rw-r--r--. 1 root root 3549 9月 7 23:40 2022-09-07_234027.sql
[root@qfedu 2022-09-07_234027]# cat 2022-09-07_234027.sql # 浏览文件 发现没问题
我们继续编写shell脚本:
# 将文件打包成tar.gz
# 切换到备份目录
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
# 删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}
我们现在测试一下脚本,看看是否写正确:
[root@qfedu sbin]# rm -rf /data/ # 把原来的data目录删除
[root@qfedu sbin]# ./mysql_db_backup.sh
2022-09-07_235239
mysqldump: [Warning] Using a password on the command line interface can be insecure.
2022-09-07_235239/
2022-09-07_235239/2022-09-07_235239.sql.gz
[root@qfedu sbin]# cd /data/backup/db/
[root@qfedu db]# ll
总用量 4
-rw-r--r--. 1 root root 1520 9月 7 23:52 2022-09-07_235239.tar.gz # 我们发现没有问题
我们继续编写shell脚本:
# 删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "数据库${DATABASE}成功...."
接下来我们使用crontab -e指令编写定时任务:
[root@qfedu sbin]# crontab -e
编写定时任务:
30 2 * * * /usr/bin/mysql_db_backup.sh
这样我们编写备份数据库的脚本就完成了,最后脚本代码如下:
至此,我们就完成了数据库的定时备份案例,希望能够对大家有所帮助。