编写备份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 ]  # 如果是周日
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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cobalt strike基础测试

下载链接4.3:https://pan.baidu.com/s/1E_0t30tFWRiE5aJ7F-ZDPg 链接4.0:https://pan.baidu.com/s/1SkMmDem3l6bePqIDgUz2mA 提取码:burp 一、简介: cobalt strike(简称CS)是一款团队作战渗透测试神器,分为客户端…

C++笔试强训day37

目录 1.旋转字符串 2.合并k个已排序的链表 3.滑雪 1.旋转字符串 链接https://www.nowcoder.com/practice/80b6bb8797644c83bc50ac761b72981c?tpId196&tqId37172&ru/exam/oj 如果 A 字符串能够旋转之后得到 B 字符串的话,在 A 字符串倍增之后的新串中&am…

linux驱动学习(二)之点灯

需要板子一起学习的可以这里购买(含资料):点击跳转 如何实现对硬件控制 分析硬件原理图(开发板的原理图)----> 分析硬件的控制方法 ---> 控制硬件时,所要用到的寄存器 ----> 了解控制硬件寄存器的…

关于如何在Arch Linux上编写自己的第一个module

前一段时间一直想深入学习编写一个module插入到自己的内核当中,但是网上的资料基本上全都针对的Ubuntu和Debian等流行的Linux发行版,这里打算简单的记录一波博客。 啥是Module?(着急可不看) 众所周知:现代宏内核架构的操作系统都会借鉴微内核…

【stableDiffusion】HuggingFace模型下载(只要知道url,就直接开始下载)

一、方法 有人说,那我怎么知道 huggingface 上面我想要的资源的url,去哪儿找啊? 那就涉及到一些魔法手段了,或者你能在其他人的博客或者百度上搜索到合适的url。 我这个办法是用来节约我的魔法的流量的。 1.迅雷 1.1 打开迅雷&…

【Kotlin】简单介绍与使用kotlin

🍎个人博客:个人主页 🏆个人专栏:Kotlin ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 特点 变量和常量 数据类型和类型推断 函数 字符串模板 条件表达式 空安全 when 表达式 循环 我的其他博客 前言 Kotlin是…

PostgreSQL基础(六):PostgreSQL基本操作(二)

文章目录 PostgreSQL基本操作(二) 一、字符串类型 二、日期类型 三、

比较与深浅克隆

1.比较 (1)Comparable接口:(重写compareTo方法) 由于它是一个接口,而且在这个接口中只有一个compareTo方法,所以所有实现该接口的类都需要重写。这个compareTo方法相当于制定一个比较标准&…

Raid的全局热备和独立热备

目录 Hot Spare背景: 1.定义与功能 2.数据存储与容量 3.配置模式 4.数量限制: 5.数据重建: 6.管理与维护 实操全局热备和独立热备: 配置全局热备: 配置独立热备: Hot Spare背景: 在RAID配置中,Hot Spare(热备)是一个非常重要的概念…

【数据结构与算法 | 二叉树篇】二叉树的前中后序遍历(递归版本)

1. 二叉树的概念 (1). 二叉树的结构 借用了一下力扣的模板 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.righ…

【C++】list的使用(上)

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 前言🌈关于list🔥默认成员函数构造函数(constructor)析构函数(destructor)赋值运算符重载 &#x1…

第十六课,海龟画图:设置画笔颜色、宽度函数,移动画笔函数

一,turtle.color():画笔颜色函数 这个函数能设置画笔画出来的颜色,当然,使用它之前你需要认识有哪些“颜料”可供你选择,turtle库的color()函数可以选择以下颜色: "white" 白色(建议…

进程间通信(27000字超详解)

🌎进程间通信 文章目录: 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

Linux系统编程(七)网络编程TCP、UDP

本文目录 一、基础知识点1. IP地址2. 端口3. 域名4. 网络协议类型5. IP协议类型6. 字节序7. socket套接字 二、常用API1. socket套接字描述符2. bind套接字绑定3. listen设置客户端连接个数4. accept接收客户端请求5. connect连接服务端 三、编程流程1.TCP编程 在学习本章之前&…

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…

[AI Google] Google I/O 2024: 为新一代设计的 I/O

编辑注:以下是 Sundar Pichai 在 I/O 2024 上讲话的编辑版,并包含了更多在舞台上宣布的内容。查看我们收藏中的所有公告。 Google 完全进入了我们的 Gemini 时代。 在开始之前,我想反思一下我们所处的这一刻。我们已经在 AI 上投资了十多年…

【LeetCode 101】对称二叉树

1. 题目 2. 分析 这道题比较经典。我又一次做错了,这次是花了20min都没有做出来。 最开始我的思想就是,递归比较左根节点的左子树和右根节点的右子树是否对称即可,然后觉得能解决问题了,便动手coding。哪知道,又碰到了…

23.Labview中的数值类型讨论 ---- 位(bit)、字节(byte)、I8、U8、单双精度、复数

hello,大家好,本篇向大家介绍一个最常用但最容易让人忽略和最容易犯错的知识:数值。 “数值” 这个概念在Labview中被涉及的还是很多的,几乎任何一个程序都无可避免的会用到,但我相信大家绝大多数人对数值这个概念应用…

CentOS8安装opensips 3.5

环境:阿里云 操作系统CentOS8.5 依赖包安装: libmicrohttpd cd /usr/local/src wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-latest.tar.gz tar vzxf libmicrohttpd-latest.tar.gz cd libmicrohttpd-1.0.1/./configure make make …

【CVPR_2024】:逐元素乘积为什么会产生如此令人满意的结果?

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论文重写星形运算一层网络推广多层网络特殊情况 W 1 W_1 W1​和/或 W 2 W_2 W2​…