编写备份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将会失败。解决方法…...

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…...

构建一个文字冒险游戏:Python 编程实战
在本文中,我们将探索如何使用 Python 创建一个简单的文字冒险游戏。通过这个项目,你将了解到基础的编程技术,包括条件语句、函数和基本的用户输入处理,同时也能体会到文本游戏的魅力和设计的挑战。 项目概述 文字冒险游戏是一种…...

09Linux GDB学习笔记
Linux GDB使用 目录 文章目录 Linux GDB使用先编译文件1.检查安装1.1 安装GDB 2.启动GDB3.退出GDB4.设置断点4.1 在指定行号处设置断点4.2 在指定函数名处设置断点4.3 在指定源文件和行号处设置断点 4.4查看断点信息4.5删除断点5.运行5.1 <font color#ff0000>逐过程&am…...

海外金融牌照
一般来说牌照申请分两个大类:数字货币牌照和外汇牌照。每个国家的牌照具体监管的情况也是不一样的。申请牌照时该如何选择? 今天先说说区块链牌照,具有代表性的有美国msb牌照,加拿大msb牌照,爱沙尼亚数字货币牌照&…...

addEventListener()方法中的几个参数,以及作用
addEventListener() 方法是 JavaScript 中用于处理指定元素的指定事件的函数。它有三个参数: type(必需):一个字符串,指定要监听的事件名。 listener(必需):一个实现了 EventListen…...

FreeRtos进阶——通用链表的实现方式
通用链表实现方式(一) struct node_t {struct node_t *next; };struct person {struct node_t node;char *name;int age; };struct dog {struct node_t node;char *name;int age;char *class; };在此链表中,node结构体被放在了最前面&#x…...

【kubernetes】关于k8s集群如何将pod调度到指定node节点(亲和与反亲和等)
目录 一、调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate(预选策略) 常见的算法 2.2priorities(优选策略)常见的算法 三、k8s将pod调度到指定node的方法 3.1指定…...

AOP基础
黑马程序员JavaWeb开发教程 文章目录 一、AOP概述二、AOP快速入门2.1 步骤2.2 AOP的使用场景2.3 AOP的优势 三、AOP核心概念3.1 AOP核心概念3.2 AOP执行流程 一、AOP概述 AOP:Aspect Oriented Propragramming(面向切面变成、面向方面编程)其实就是面向特定方法编程…...

EXSI虚拟机新增磁盘并将空间扩充到已有分区
这里写自定义目录标题 1、在EXSI虚拟机中新增一块磁盘配置大小2、确认新磁盘3、格式化新分区4、添加新分区到LVM5、将新增分区添加到已有分区里 1、在EXSI虚拟机中新增一块磁盘配置大小 注意事项: (1)需确保虚拟机已关闭活处于维护模式,避免数据丢失 (2…...

民国漫画杂志《时代漫画》第39期.PDF
时代漫画39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!...

每天一个数据分析题(三百四十二)
根据量化对象是业务行为结果还是财务行为结果,可以将指标分为业务指标及财务指标两大类,以下说法正确的是? A. 财务指标是按照财务规则来对财务情况进行量化的指标 B. 业务指标是按照业务规则来对业务情况进行量化的指标 C. 业务指标需要按…...