编写备份MySQL 脚本

目录

环境准备

增量备份

增量备份和差异备份

完整代码如下

测试脚本是否正常

星期天运行脚本(完全备份)

星期一运备份脚本(增量备份)

星期二备份数据(其他天--增量备份)

星期三备份数据(差异备份)


使用第三方工具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 ]  # 如果是周日
thenFULL               # 执行全量备份
elif [ ${whichday} -eq 1 ]  # 如果是周一
thenINCR /db/full_${yesterday}  # 执行增量备份,基于上周日的全量备份
elseINCR /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} in7) # 如果是周日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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【强烈推荐】四元数与三维旋转

目录 1 强烈推荐讲解四元数与三维旋转的这篇文章,深入浅出2 笔记2.1 复数2.1.1 复数的定义2.1.2 复数的乘法与二维旋转 2.2 三维空间中的旋转2.2.1 角轴2.2.2 旋转的分解 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的乘法2.3.3 四元数与三维旋转2.3.4 三维旋转的矩阵…

数字影像产业园的三大赋能:科技、创新与无限可能

数字影像产业园作为文创产业的重要载体,以科技为核心驱动力,不断推动产业的技术革新和升级。 园区内汇聚了最前沿的数字技术资源,高清摄影设备、虚拟现实技术、人工智能应用等尖端科技在这里得到广泛应用,不仅提升了生产效率&…

能源SCI期刊,中科院4区,审稿快,IF=3.858

一、期刊名称 Frontiers in Energy Research 二、期刊简介概况 期刊类型:SCI 学科领域:能源 影响因子:3.858 中科院分区:4区 三、期刊征稿范围 能源研究前沿出版了整个领域的严格同行评审研究,重点是可持续和环境…

java多线程原理

1.线程创建与启动:通过继承Thread类或实现Runnable接口创建线程,并调用start()方法启动线程。 1.线程状态:线程在其生命周期中有多种状态,包括新建、运行、阻塞、死亡等。了解这些状态以及如何在它们之间转换对于管理线程至关重要…

ICLR 2024 BACKDOOR FEDERATED LEARNING BY POISONING BACKDOOR-CRITICAL LAYERS

寻找后门攻击最有效的网络层。现有的 FL 攻击和防御方法通常关注整个模型。 他们都没有认识到后门关键(BC)层的存在——控制模型漏洞的一小部分层。 攻击 BC 层可达到与攻击整个模型相同的效果,但被最先进 (SOTA) 防御检测到的机会要小得多。…

如何卸载360安全卫士

不用像其他教程那么复杂 这篇教程比较友好 1.打开桌面,右键单击快捷方式 选择“打开文件位置” 2.然后,搜uninst.exe 3.运行 4.选择“继续卸载” 5.选择“下一步” 6.选择 “继续卸载” 7.选择“继续卸载” 8.选择“是” 9.静等卸载 10.把卸载程序关…

【因果推断python】16_工具变量2

目录 出生季度和教育对工资的影响 第一阶段 出生季度和教育对工资的影响 到目前为止,我们一直将这些工具视为一些神奇的变量 Z,它们具有仅通过干预变量影响结果的神奇特性。老实说,好的工具变量来之不易,我们不妨将它们视为奇迹…

Windows11系统 和Android 调试桥(Android Debug Bridge,ADB)工具安装,app抓取日志内容

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Android调试桥(ADB)是一种多功能命令行工具,它允许开发者与连接到计算机上的Android设备进行通信和控制。ADB工具的作用包括但不限于: 安装和卸载应用程序&…

2024年先进材料与清洁能源国际会议(ICAMCE 2024)

2024 International Conference on Advanced Materials and Clean Energy 【1】大会信息 大会时间:2024-07-15 大会地点:中国三亚 截稿时间:2024-07-01(以官网为准) 审稿通知:投稿后2-3日内通知 投稿邮箱&#xff1a…

揭秘相似矩阵:机器学习算法中的隐形“纽带”

在机器学习领域,数据的处理和分析至关重要。如何有效地从复杂的数据集中提取有价值的信息,是每一个机器学习研究者都在努力探索的问题。相似矩阵,作为衡量数据之间相似性的数学工具,在机器学习算法中扮演着不可或缺的角色。 相似矩…

Docker之路(三)docker安装nginx实现对springboot项目的负载均衡

Docker之路(三)dockernginxspringboot负载均衡 前言:一、安装docker二、安装nginx三、准备好我们的springboot项目四、将springboot项目分别build成docker镜像五、配置nginx并且启动六、nginx的负载均衡策略七、nginx的常用属性八、总结 前言…

SpringBoot高手之路02-全局异常处理器

RestControllerAdvice 可以将响应数据返回json格式然后响应 那么开始做全局异常处理器 首先先定义一个类 package com.healer.exception;import com.healer.common.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.we…

高并发系统限流原理

短时间内巨大的访问流量,我们如何让系统在处理高并发的同时还能保证自身系统的稳定性?估计有人会说,增加机器就可以了,因为我的系统架构设计就是按照分布式思想进行架构设计的,所以可以只需要增加机器就可以解决问题了…

在Unity中配置Android项目以允许HTTP流量,解决AVPro在Android平台中无法播放http视频

解决方法快速通道:拉到底,看倒数第二张图 好记性不如烂笔头 最近在使用AVpro插件播放http视频,在Editor中一切正常,然而打包在Android平台下就播放不了 AVPro在Unity中的警告: 感觉只是个警告,没引起注意…

为什么3D渲染有的模型是黑的?---模大狮模型网

在3D建模和渲染的过程中,遇到模型渲染出来是黑色的情况并不罕见。这可能是由于多种原因导致的,包括但不限于材质设置问题、灯光配置不当、渲染设置错误等。 一、材质设置问题 材质丢失或错误:如果模型在导入或创建时材质没有正确加载或设置&…

webservice、WCF、webAPI、MVC权限认证

webservice 权限认证 》》soapHeader SOAPHeader案例 服务引用下生成的服务方法参数中会自动加入一个soapHeader的参数, WEB服务引用则没有,我感觉采用WEB服务引用基于这种验证比较方便, 因为只需将soapHeader实例赋值一次就可以多次调用不…

IDC数据中心内容合规检测

摘要:电信数据中心通过实施AI数据质检方案,自动检测反馈预警,提升服务质量,保障网络合规,降低风险,增强企业竞争力。 1. 客户背景 该客户是国内领先的IDC云计算综合服务提供商,专注于为客户提供…

Vue3中的常见组件通信之v-model

Vue3中的常见组件通信之v-model 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $r…

.NET周刊【6月第1期 2024-06-02】

国内文章 一文带你了解.NET能做什么? https://www.cnblogs.com/Can-daydayup/p/18214473 .NET是一个免费、开源、跨平台的开发平台框架,广泛应用于桌面、Web、移动、云服务、游戏、物联网、大数据和人工智能等领域开发。它支持C#、Visual Basic、F#等…

Redis 单线程问题 BigKey问题

前言 简单的redis基础类型以及常用操作我们都也已经介绍过了 现在今天我们来谈谈redis对于单线程是需要怎么理解的 以及redis假设遇见大key我们需要怎么去查询和删除呢??? redis单线程 假设有个人现在问你一个问题:redis是单线程的还是多线程的 这个问题本身就不严谨 就像问…