当前位置: 首页 > news >正文

编写备份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

相关文章:

编写备份MySQL 脚本

目录 环境准备 增量备份 增量备份和差异备份 完整代码如下 测试脚本是否正常 星期天运行脚本(完全备份) 星期一运备份脚本(增量备份) 星期二备份数据(其他天--增量备份) 星期三备份数据(差异备…...

C语言中的数据类型转换:隐式类型转换与显示类型转换

一. 简介 本文简单学习一下,C语言中的数据类型转换。重点学习一下隐式类型转换。 二. C语言中的数据类型转换:隐式类型转换与显示类型转换 类型转换(TypeCasting):在C语言中是将一种数据类型值转换为另一种数据类型…...

Android 安卓通过bindService ServiceConnection 没有响应的问题

bindService 失败且 ServiceConnection 没有响应可能由多种原因造成。以下是一些可能的原因和相应的解决方法: Service未正确声明或注册: 如果Service没有在AndroidManifest.xml文件中正确声明或注册,bindService将会失败。解决方法&#xf…...

python切片(彻底解除对切片的曲解)

sequence[start:stop:step] **start: **step为正时默认为0,step为负时默认为-1 stop:_ step为正时默认为结尾结束,step为负时默认为开始位置_ ss=“abcdefg” 以该字符串举例,ss[start:stop:step]的意思是将字符串ss从start开始截取(包括start),截取到stop(不包括sto…...

Java—— StringBuilder 和 StringBuffer

1.介绍 由于String的不可更改特性,为了方便字符串的修改,Java中又提供了StringBuilder和Stringbuffer类,这两个类大部分功能是相同的,以下为常用方法: public static void main(String[] args) {StringBuilder sb1 n…...

vs2019 c++20 规范 STL库中关于时间的模板

在学习线程的时候,一些函数会让线程等待或睡眠一段时间。函数形参是时间单位,那么在 c 中是如何记录和表示时间的呢?以下给出模板简图: 谢谢...

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器,以下是对其的详细介绍: 1. 定义与别称: 激光焊接机,又常称为激光焊机、镭射焊机,是材料加工激光焊接时用的机器。 2. 工作原理: 激光焊接是利用高能量…...

vite为什么速度快

原因 vite快的原因是因为 vite在开发环境中是使用的 esbuild,esbuild 是 go 写的,go 编译型语言、多线程,nodejs 解释型语言、单线程,并且 vite 使用了原生 esm 导入的,所以快一点,当然,这也…...

Java网络编程(下)

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🙉 内容推荐:Java网络编程🙉 🐹今日诗词:姑苏城外寒山寺,夜半钟声到客船🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主…...

APISIX的安装与测试(springboot服务测试)

安装: 1.1安装依赖: curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -1.2 安装 OpenResty yum-config-manager --add-repo https://openresty.org/package/centos/openresty.reposudo yum i…...

AI技术:探索未来智能的无限可能

随着科技的飞速发展,人工智能(AI)技术已经成为我们这个时代最引人瞩目的科技力量。从简单的自动化任务到复杂的决策支持系统,AI技术正在以前所未有的速度改变着我们的世界。本文将深入探讨AI技术的定义、发展历程、当前应用、面临…...

npm install 出错,按照版本不匹配解决

一、现象 npm install npm WARN config global --global, --local are deprecated. Use --locationglobal instead. npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: panshi-main-web0.1.0 npm ERR! Found…...

【第1章】SpringBoot实战篇之注册接口

文章目录 前言一、代码部分1. User2.UserMapper13. UserSerivce4. UserController15. Result 二、测试1.注册2.再次注册 总结 前言 下面介绍用户注册接口。 一、代码部分 1. User package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotat…...

代码随想录-Day25

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…...

JavaWeb_SpringBootWeb基础

先通过一个小练习简单了解以下SpringBootWeb。 小练习: 需求:使用SpringBoot开发一个Web应用,浏览器发起请求/hello后,给浏览器返回字符串"Hello World~"。 步骤: 1.创建SpringBoot项目,勾选We…...

Stable Diffusion生成图片的参数查看与抹除方法

前几天分享了几张Stable Diffusion生成的艺术二维码,有同学反映不知道怎么查看图片的参数信息,还有的同学问怎么保护自己的图片生成参数不会泄露,这篇文章就来专门分享如何查看和抹除图片的参数。 查看图片的生成参数 1、打开Stable Diffus…...

Linux下多线程的相关概念

🤖个人主页:晚风相伴-CSDN博客 💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧 🙏如果内容有误或者有写的不好的地方的话&…...

在java java.util.Date 已知逝去时间怎么求年月日

在java中,可以使用java.util.Date类来获取年、月和日。以下是一种方法: 首先创建一个java.util.Date对象,表示逝去的时间。 Date pastDate new Date(逝去的时间的毫秒数);然后使用java.util.Calendar类来获取年、月和日。 Calendar calen…...

LeetCode 2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户

【LetMeFly】2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户 力扣题目链接:https://leetcode.cn/problems/distribute-candies-among-children-i/ 给你两个正整数 n 和 limit 。 请你将 n 颗糖果分给 3 位小朋友,确保没有任何…...

【typescript/flatbuffer】在websocket中使用flatbuffer

目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统:Windows11node版本:v18.19.0typescript flatbuffer版本:24.3.25 场景 服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websock…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...