目录
使用第三方工具percona-xtrabackup
基于Innobackupex的MySQL备份脚本
环境准备
- 操作系统: Linux(CentOS 7.9)。
- MySQL: 已安装并运行着MySQL 5.7.35。
- Innobackupex: Percona XtraBackup套件的一部分,用于物理备份InnoDB和MyISAM表。
- Shell脚本: 将编写的自动化脚本。
增量备份
具体要求:
1、周日全备
2、周一至周六增量备份
3、备份使用backup用户
标题:自动化的MySQL数据库备份策略:结合Shell脚本与Innobackupex的实践
引言
在现代数据驱动的世界里,定期备份数据库是维护业务连续性和数据安全不可或缺的一环。本文将介绍一种利用Shell脚本和Percona XtraBackup工具中的innobackupex
命令来实现MySQL数据库自动化备份的策略。我们的目标是设置一个灵活的备份计划,其中周日执行全量备份,而其他日子则执行增量备份,从而高效地管理存储空间并加快恢复速度。
Shell脚本详解
首先,让我们深入理解所提供的脚本。该脚本主要包含以下几个部分:
日期变量设置:
whichday=$(date +%u) # 获取当前是一周中的第几天(1-7)
today=$(date +%F) # 设置今日日期格式为YYYY-MM-DD
yesterday=$(date -d '-1 day' +%F) # 计算昨日日期
Login='--user=backup --password=Openlab123! --no-timestamp' # 定义备份用户认证信息
定义备份功能:
- FULL(): 执行全量备份,使用
innobackupex
命令,备份保存到/db/full_YYYY-MM-DD
目录。 - INCR(): 执行增量备份,需要指定基于哪个目录的增量,这里使用前一天的全量或增量备份作为基础。
逻辑判断:
- 如果今天是周日 (
whichday
等于7),执行FULL()
函数,创建全量备份。 - 如果今天是周一 (
whichday
等于1),执行INCR()
函数,基于上周日的全量备份进行增量备份。 - 其他日子,同样执行
INCR()
函数,但基于前一天的增量备份。
脚本执行与监控
- 执行脚本: 将上述脚本保存为可执行文件,例如inno_bak.sh,并通过cron定时任务在每天的固定时间执行。
- 日志与监控: 确保
innobackupex
的执行过程中产生的日志得到妥善保存和监控,以便于及时发现并解决问题。
注意事项
- 权限与安全性: 确保用于备份的用户具有足够的权限,同时注意保护好备份脚本中的敏感信息,比如数据库用户名和密码。
- 备份验证: 定期检查备份文件的完整性和可恢复性,避免灾难发生时才发现备份不可用。
完整代码:
#!/bin/bash
# 获取今天是一周中的第几天,1代表星期一,7代表星期日
whichday=$(date +%u)
# 获取今天的日期,格式为YYYY-MM-DD
today=$(date +%F)
# 计算并获取昨天的日期
yesterday=$(date -d '-1 day' +%F)
# 设置备份时使用的MySQL登录信息,包括用户名、密码及不使用时间戳的选项
Login='--user=backup --password=Openlab123! --no-timestamp'
# 定义函数:执行全量备份
function FULL()
{
# 使用innobackupex命令执行全量备份,备份存放路径包含今天的日期
innobackupex ${Login} /db/full_${today}
}
# 定义函数:执行增量备份
function INCR()
{
# 使用innobackupex命令执行增量备份,指定增量备份的存储路径和基于哪个目录的增量
innobackupex --incremental ${Login} /db/incr_${today} --incremental-basedir=$1
}
# 根据今天是周中的哪一天来决定执行哪种备份
if [ ${whichday} -eq 7 ] # 如果是周日
then
FULL # 执行全量备份
elif [ ${whichday} -eq 1 ] # 如果是周一
then
INCR /db/full_${yesterday} # 执行增量备份,基于上周日的全量备份
else
INCR /db/incr_${yesterday} # 其他日子执行增量备份,基于前一天的增量备份
fi
[root@localhost db] ls --检查要备份的目录是否有文件存在
要想进行增量备份的前提是要有一次完全备份
先从周天开始
[root@localhost script] date -s "$(date -d '+1 day' +'%F %T')"
2024年 06月 02日 星期日 00:00:05 CST
# 该命令的目的是通过Shell脚本调整系统当前时间到明天的同一时刻。
# 为了实现这个目的,采用了两步走的策略:
# 第一步,计算明天的日期和当前时间;
# 第二步,使用计算出的日期时间设置系统时钟。
# 1. 使用 'date -d '+1 day'' 计算明天的日期:
# - `date -d`: 是date命令中的一个选项,允许我们指定一个相对时间字符串来计算新的日期和时间。
# - `'+1 day'`: 指定了时间偏移量,即从当前时间起加1天,用来计算明天的日期。
# 2. 结合 '%F %T' 格式化输出日期和时间:
# - `'%F'`: 代表完整的日期格式,即年-月-日(例如,2024-06-02)。
# - `'%T'`: 代表时间格式,即小时:分钟:秒(例如,00:00:05)。
# 这意味着我们不仅需要明天的日期,还需要保持当前的时间部分不变。
# 3. 使用命令替换(命令嵌套):
# - `$(...)` 是命令替换结构,它允许我们把一个命令的输出作为另一个命令的参数。
# 在这里,我们用明天的日期和时间(由内部的date命令计算得出)作为外部date命令的参数。
# 4. 最终执行 'date -s' 设置系统时间:
# - `date -s`: 用于设置系统时间的选项,后面跟具体的日期和时间字符串。
# - 通过前面的命令替换,我们现在有了一个精确的日期时间字符串(明天的日期加上当前时间),
# 并将其传递给这个选项,从而实现设置系统时间为明天相同时间的目的。
# 综上所述,整个命令的作用是将当前系统时间设置为明天此刻的时间,即在不影响当前时间的情况下,将日期向前推进一天。
运行脚本
查看是否成功备份
[root@localhost db] ls
full_2024-06-02
更改时间为星期一
[root@localhost script] date -s "$(date -d '+1 day' +'%F %T')"
2024年 06月 03日 星期一 00:02:42 CST
#再次运行脚本
[root@localhost script] bash inno_bak.sh
full_2024-06-02 incr_2024-06-03
#星期二
[root@localhost script]# date -s "$(date -d '+1 day' +'%F %T')"
2024年 06月 04日 星期二 00:31:40 CST
[root@localhost db]# ls
full_2024-06-02 incr_2024-06-03 incr_2024-06-04
增量备份和差异备份
要求二:
周日完全备份
周1-2增量备份
周3差异备份
周4-6增量备份
# 备份脚本
[root@localhost script] cp inno_bak.sh inno_bak_v2.sh
[root@localhost script] vim inno_bak_v2.sh
完整代码如下
判断语句改为case语句,因为是同一个变量判断不同值
#!/bin/bash
# 获取今天是一周中的第几天,1表示星期一,7表示星期日
whichday=$(date +%u)
# 获取今天的日期,格式为YYYY-MM-DD
today=$(date +%F)
# 计算并获取昨天的日期
yesterday=$(date -d '-1 day' +%F)
# 设置数据库备份时使用的登录信息,包括用户名、密码以及禁用时间戳的选项
Login='--user=backup --password=Openlab123! --no-timestamp'
# 定义全量备份函数
function FULL() {
# 使用innobackupex执行全量备份到/db目录下以今天的日期为名称的子目录中
innobackupex ${Login} /db/full_${today}
}
# 定义增量备份函数,需要传入上次备份的目录作为增量基础
function INCR() {
# 执行增量备份到/db目录下以今天的日期为名称的子目录中,并指定增量的基准目录
innobackupex --incremental ${Login} /db/incr_${today} --incremental-basedir=$1
}
# 根据今天是一周中的哪一天来选择执行相应的备份操作
case ${whichday} in
7) # 如果是周日
FULL # 执行全量备份
;;
1) # 如果是周一
INCR /db/full_${yesterday} # 执行基于上周日全量备份的增量备份
;;
3) # 如果是周三
INCR /db/full_$(date -d '-3 day' +'%F') # 执行基于上上周五全量备份的增量备份
;;
*) # 其他日子
INCR /db/incr_${yesterday} # 执行基于前一天增量备份的增量备份
;;
esac
该脚本设计了一套策略来自动执行MySQL数据库备份:
周日:执行一次全量备份,这是一周的起始点,为后续的增量备份提供基础。
周一:执行基于上周日全量备份的增量备份。
周三:特殊调整,执行基于上上周五的全量备份的增量备份,这个设定可能根据特定的业务需求或备份窗口制定。
其余日子:执行基于前一天增量备份的增量备份,保持每天的数据变化得到记录。
测试脚本是否正常
星期天运行脚本(完全备份)
# 设置时间
[root@localhost script] date -s "$(date -d '+1 day' +'%F %T')"
2024年 06月 02日 星期日 01:09:02 CST
# 删除之前备份的数据
[root@localhost script] rm -rf /db/
[root@localhost script] bash inno_bak_v2.sh
# 查看是否备份成功
[root@localhost script] ls /db/
full_2024-06-02
星期一运备份脚本(增量备份)
增加数据
mysql> insert into aa(id) values(11);
Query OK, 1 row affected (0.00 sec)
mysql> select * from aa;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
+------+
# 设置时间
[root@localhost script] date -s "$(date -d '+1 day' +'%F %T')"
2024年 06月 03日 星期一 01:18:10 CST
# 运行脚本
[root@localhost script] bash inno_bak_v2.sh
# 检查是否备份成功
[root@localhost script] ls /db/
full_2024-06-02 incr_2024-06-03
星期二备份数据(其他天--增量备份)
增加数据
mysql> insert into aa(id) values(12);
Query OK, 1 row affected (0.00 sec)
运行脚本
# 设置时间
[root@localhost script] date -s "$(date -d '+1 day' +'%F %T')"
2024年 06月 04日 星期二 01:22:29 CST
# 运行脚本
[root@localhost script] bash inno_bak_v2.sh
# 查看是否备份成功
[root@localhost script] ls /db/
full_2024-06-02 incr_2024-06-03 incr_2024-06-04
星期三备份数据(差异备份)
增加数据
mysql> insert into aa(id) values(13);
Query OK, 1 row affected (0.00 sec)
运行脚本
# 设置时间
[root@localhost script] date -s "$(date -d '+1 day' +'%F %T')"
2024年 06月 05日 星期三 01:25:39 CST
# 运行脚本
[root@localhost script] bash inno_bak_v2.sh
# 查看脚本是否备份成功
[root@localhost script] ls /db/
full_2024-06-02 incr_2024-06-03 incr_2024-06-04 incr_2024-06-05