第85讲:MySQLDump与Binlog日志实现企业级数据备份恢复案例

news2024/11/28 10:50:50

文章目录

    • 1.企业级数据备份恢复案例描述
    • 2.第一环节:周三凌晨进行数据全量备份
    • 3.第二环节:模拟周三凌晨备份完之后到下午3点前的业务操作
    • 4.第三环节:模拟数据库异常数据丢失导致平台无法使用
    • 5.第四环节:发布停服公告全员进入数据恢复处理阶段
    • 6.第五环节:数据加急恢复过程中!
      • 6.1.还原平台库的今日凌晨时的全量备份数据
      • 6.2.从Binlog中还原凌晨到现在时刻没有备份的数据
    • 7.第六环节:校验数据的准确性
    • 7.第七环节:平台恢复上线

1.企业级数据备份恢复案例描述

案例背景:

某互联网公司的MySQL版本时5.7.35,操作系统是Centos7.5,数据量大概在100G左右,每日的数据增量大概是10M以内。

数据备份策略:

每天晚上0点使用mysqldump进行全库备份,并且针对Binlog日志也进行备份。

故障描述:

某周三下午3点,由于某些原因导致数据库中的数据全部损坏,导致平台无法正常使用。

故障处理过程:

  • 1)首先发布平台维护公告,宣布停服,全员抓紧实现进行数据修复。
  • 2)然后评估数据损坏的程度:
    • 数据是否是全部丢失,如果数据全部丢失那么建议直接在线上环境的数据库中进行数据恢复。
    • 是否只有部分数据丢失,如果是部分表数据丢失,可能是运维、开发人员误操作导致,建议从备份中以及Binlog中导出某些表的数据,然后在预发布环境的数据库中进行数据恢复,恢复完成后待测试同事校验,没问题后还原到线上环境。
  • 3)确定是数据全部丢失后,那么直接将周三凌晨的全量备份在线上数据库中还原,追溯到周三凌晨时的数据状态。
  • 4)全备数据恢复完成后,从Binlog日志中截取从凌晨到故障发生时的Binlog日志,然后进行数据恢复。
  • 5)由测试同事校验数据的一致性。
  • 6)一切没问题后,恢复线上使用。

处理结果:

经过30~40分钟左右的处理,平台恢复。

下面我们开始模拟这个案例。

2.第一环节:周三凌晨进行数据全量备份

周三凌晨的自动数据备份:

[root@mysql ~]# mysqldump -uroot -p123456 -A -R --triggers -E --master-data=2 --single-transaction > /data/backup/all_db_bak-`date +%F`.sql

周三上班后检查数据备份情况。

1.检查备份是否存在
[root@mysql ~]# ll /data/backup/all_db_bak-`date +%F`.sql
-rw-r--r-- 1 root root 884223 72 0:45 /data/backup/all_db_bak-2022-07-02.sql

2.检查备份中的内容

3.记录凌晨备份文件中的Binlog状态信息(备份开始时间点的Position号和GTID号)
#每天养成习惯,记录下备份文件中备份开始时间段的Binlog状态,当天出现数据问题,没有备份时,可以快速找到数据对应的Binlog位置。
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=14417;
SET @@GLOBAL.GTID_PURGED='e0a2c0cc-f835-11ec-8a3c-005056b791aa:1-66';

3.第二环节:模拟周三凌晨备份完之后到下午3点前的业务操作

模拟周三凌晨备份完之后到下午三点数据库异常之前,所产生的业务操作。

CREATE TABLE xscjb (
	xh INT COMMENT '学号',
	xm VARCHAR ( 20 ) COMMENT '姓名',
	ywcj INT COMMENT '语文成绩',
	sxcj INT COMMENT '数学成绩',
	yycj INT COMMENT '英语成绩'
) COMMENT '学生成绩表';
    
insert into xscjb VALUES (1, '小明', 45, 75, 93 );
insert into xscjb VALUES (2, '小红' , 47, 56, 25);
insert into xscjb VALUES (3, '小兰', 82, 91, 89);
insert into xscjb VALUES (4, '小黄', 88, 75, 66);
insert into xscjb VALUES (5, '小李', 93, 96, 91);
insert into xscjb VALUES (6, '小江', 97, 67, 65);
insert into xscjb VALUES (7, '小王', 75, 58, 32);

update xscjb set ywcj = '100' where xh = '7';
update xscjb set sxcj = '77' where xm = '小兰';
update xscjb set yycj = '99' where xm = '小王';

delete from xscjb where xh = '4';

数据库异常时刻,xscjb业务表最后的样子。

image-20220702220935456

4.第三环节:模拟数据库异常数据丢失导致平台无法使用

模拟数据库文件损坏,数据丢失,导致平台无法使用。

直接将平台的数据库删除就行了。
mysql> drop database db_1;
[root@mysql ~]# rm -rf /data/mysql/db_1/

模拟结果:平台库数据库全部损坏,已崩,数据库实例还能用。(本次模拟过程中,没有将数据库所有文件删除,是因为Binlog也在这个路径,如果模拟数据库文件全部损坏,那么修复的时候就需要重新初始化数据库的,Binlog也会被覆盖,因此这里只模拟平台库数据库文件损坏,全部丢失。)

如果只删除了磁盘中某个数据库的所有文件,那么在交互式中是无法删除这个数据库中,需要先重启MySQL实例,然后才能进行删除,因此再删库时,要先删库,再删磁盘文件。

5.第四环节:发布停服公告全员进入数据恢复处理阶段

此时已经下午3点了,数据库突然损坏,平台库文件由于某某全部损坏,导致平台无法访问。

停服公告已发布,下面开始进入问题处理解决阶段。

经过一番分析后,确定平台对应的数据库文件全部损坏,该库的数据全部丢失,不是部分表数据丢失,下面需要紧急进入数据修复阶段,预计耗时未知!!!!

6.第五环节:数据加急恢复过程中!

6.1.还原平台库的今日凌晨时的全量备份数据

1.找到今日凌晨时的数据备份文件。
[root@mysql ~]# ll /data/backup/all_db_bak-2022-07-02.sql 
-rw-r--r-- 1 root root 884223 72 0:45 /data/backup/all_db_bak-2022-07-02.sql

2.直接在线上生产库中还原凌晨备份的数据。
mysql> set sql_log_bin=0;
mysql> source /data/backup/all_db_bak-2022-07-02.sql 

此时已经从全量备份中恢复了平台库,但是全量备份只包含今日凌晨之前的数据,今日凌晨到现在的数据还没有恢复。

image-20220702222802625

6.2.从Binlog中还原凌晨到现在时刻没有备份的数据

我们已经从全备中将平台库的数据恢复到了今日凌晨时的状态,但是从凌晨到故障发生前的数据还没来得及备份就丢失了,下面从Binlog中恢复没有备份的数据。

下面我们需要从Binlog中截取今日凌晨到现在时刻的Binlog,我们都知道Binlog日志截取最麻烦的就是找起点和终点,终点很好找,平台库已经挂了,那么Binlog中最后一个GTID事务号,就是终点。

由于我们使用mysqldump备份时,增加了--maste-data=2这个参数,此参数会在备份文件中帮我们记录:从备份开始的时间算,Binlog中最近的一个GTID号、当前使用的Binlog日志名称、Binlog中事件的最近一个Position标识位号,有了这三个信息之后,找起点不再是难事,我们可以非常快速的指定我们要截取那些Binlog日志。

GTID号更加好找,我们以GTID号截取Binlog数据。

1)确定要截取的Binlog日志GTID号范围

下面的这两行就是从备份文件中找到的关于Binlog日志的状态。从中我们可以得知当前使用的Binlog是mysql-bin.000012,最近一个事件的Position号是14417,最近的一个GTID号是66。

并且记录的GTID号格式是e0a2c0cc-f835-11ec-8a3c-005056b791aa:1-66这样子,其实也就告诉了我们在这个备份文件中,将GTID号1-66这个范围之间所有产生的日志都进行备份了。

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=14417;
SET @@GLOBAL.GTID_PURGED='e0a2c0cc-f835-11ec-8a3c-005056b791aa:1-66';

刚刚我们也做了全库备份的数据还原,也就表示GTID号1-66这个范围的数据已经全部被恢复了,但是从67GTID号开始一直到数据库崩溃时的这个范围是没有被恢复的。

下面我们去看一下Binlog的事件信息,看看GTID号67是不是新数据,然后再获取数据库崩溃时的最新GTID号。

在GTID号67这里,我们看到创建了一张新表,这个操作就是新的业务逻辑,没错就是从这里截取,备份文件中记录的是准确无误的。

image-20220702225046179

起点找到了是GTID 67号,那么接着还早终点,直接翻到最后,最后一个GTID号就是数据库崩溃时的最后一个事务,最后一个GTID号是78。

image-20220702225529891

2)截取凌晨到当前时间产生的Binlog日志

在上一步已经确定了GTID起点是67,终点是78,下面开始截取这一部分的Binlog日志

[root@mysql ~]# mysqlbinlog --skip-gtids --include-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:67-78' /data/mysql/mysql-bin.000012 > /data/backup/sjbkjd-binlog.sql

3)从Binlog中恢复从凌晨到数据库崩溃时间段的数据

mysql> set sql_log_bin=0;
mysql> source /data/backup/sjbkjd-binlog.sql

7.第六环节:校验数据的准确性

数据库全备已经恢复了,从凌晨到数据库崩溃时间段的数据也从Binlog中恢复了,下面由测试同事检测数据的准确性。

mysql> select * from db_1.xscjb;
+------+--------+------+------+------+
| xh   | xm     | ywcj | sxcj | yycj |
+------+--------+------+------+------+
|    1 | 小明   |   45 |   75 |   93 |
|    2 | 小红   |   47 |   56 |   25 |
|    3 | 小兰   |   82 |   77 |   89 |
|    5 | 小李   |   93 |   96 |   91 |
|    6 | 小江   |   97 |   67 |   65 |
|    7 | 小王   |  100 |   58 |   99 |
+------+--------+------+------+------+
6 rows in set (0.00 sec)

数据准确无误,全部恢复成功。

7.第七环节:平台恢复上线

此时数据已经全部恢复了,平台也能正常使用了,宣告再次上线。

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

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

相关文章

计算机组成原理 I/O方式

I/O 方式 I/O方式分类: 程序查询方式。由 CPU通过程序不断查询 /O 设备是否已做好准备,从而控制0 设备与主机交换信息程序中断方式。只在 I/0 设备准备就绪并向 CPU发出中断请求时才予以响应。DMA方式。主存和 I/O 设备之间有一条直接数据通路,当主存和…

什么是IT安全(Information Technology Security)?它的价值如何体现

文章目录 一、IT安全名词解释二、IT安全面临的威胁三、IT安全的类型3.1 网络安全3.2 系统安全3.3 应用安全3.4 数据安全3.5 用户安全3.6 物理安全3.7 安全管理 四、IT 安全和信息安全 ( InfoSec )之间有什么区别?IT安全信息安全(InfoSec) 五、…

湖南大学-计算机网路-2023期末考试【部分原题回忆】

前言 计算机网络第一门考,而且没考好,回忆起来的原题不多。 这门学科学的最认真,复习的最久,考的最差。 教材使用这本书: 简答题(6*530分) MTU和MSS分别是什么,联系是什么&#x…

内外网文件交换系统实用技巧揭秘:安全、效率、便捷一个不少

内外网文件交换系统是一种专门设计用于在企业内部网络(内网)与外部网络(外网)之间安全传输文件的技术解决方案。在企业环境中,出于安全考虑,内部网络通常与外部网络隔离,以防止未经授权的访问和…

Nacos 学习之系列文章

系列文章目录 目录 系列文章目录 文章目录 前言 一、Nacos是什么? 二、Nacos的主要功能 服务发现和服务健康监测 动态配置服务 动态 DNS 服务 三、Nacos 地图 四、Nacos 生态图 总结 前言 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Naco…

MATLAB根据数据拟合曲线

MATLAB根据数据拟合曲线 MATLAB根据数据拟合曲线视频观看 MATLAB根据数据拟合曲线 x1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,6…

测试分类篇

小王学习录 测试分类按测试对象划分1. 界面测试2. 可靠性测试3. 容错性测试4. 文档测试5. 兼容性测试6. 易用性测试7. 安装卸载测试8. 安全测试9. 性能测试10. 内存泄露测试 按是否查看代码划分1. 黑盒测试2. 白盒测试3. 灰盒测试 按开发阶段分1. 单元测试2. 集成测试3. 系统测…

02. Eureka、Nacos注册中心及负载均衡原理

01小节中订单服务远程调用用户服务案例实现了跨服务请求,在微服务中一个服务可能是集群部署的,也就是一个服务有多个实例,但是我们在调用服务时需要指定具体的服务实例才能调用该服务,在集群模式下,服务地址应该写哪个…

【leetcode】力扣热门之回文链表【简单难度】

题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 用例 输入:head [1,2,2,1] 输出:true 输入:head [1,2] 输出:f…

深度学习:解决CNN的困境——胶囊网络

从2017年底到2018年初,整个人工智能学术研究领域谈论最多的应该就是被誉为深度学习之父Geoffrey E. Hinton 发表的论文 Dynamic Routing Between Capsules,其中介绍了全新的深度学习模型——胶囊网络(Capsule Network) 1. 普通CNN的困境 虽…

【JaveWeb教程】(8)Web前端基础:Vue组件库Element之Table表格组件和Pagination分页组件 详细示例介绍

目录 1 Table表格组件1.1 组件演示1.2 组件属性详解 2 Pagination分页2.1 组件演示2.2 组件属性详解2.3 组件事件详解 接下来我们来学习一下ElementUI的常用组件,对于组件的学习比较简单,我们只需要参考官方提供的代码,然后复制粘贴即可。本节…

二叉搜索树|不同、验证、转换等

二叉搜索树|不同、验证、转换等 文章目录 二叉搜索树|不同、验证、转换等[96 不同的二叉搜索树](https://leetcode.cn/problems/unique-binary-search-trees/description/)[98 验证二叉搜索树](https://leetcode.cn/problems/validate-binary-search-tree/description/)[538 把…

基于机器视觉的车牌检测-车牌图像倾斜矫正位

Radon变换 Radon变换常用于车牌图像倾斜矫正,主要包括水平倾斜和垂直倾斜矫正。Radon变换定义:下图显示了在指定的旋转角度的单一投影。间距为1个像素的平行光穿过图像,则radon变换计算穿过图像光线的线积分。 Radon变换的本质是将原来的XY平…

全志V853 NPU开发之Demo使用说明

上一章节中配置 NPU 扩展包后可以在 menuconfig 里看到两个 Demo 测试应用程序。这里我们来介绍一下怎么使用这两个 Demo。 YOLOV3 在 NPU Package 中我们提供了一个较为完整的 YOLOV3 Demo 作为测试,程序源码位于: openwrt/package/npu/yolov3/src这个…

Spark基础内容

Spark基本介绍 Spark是什么 定义 Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎. Spark与MapReduce对比 mapreduce架构图如下: MapReduce的主要缺点: 1- MapReduce是基于进程进行数据处理,进程相对线程来说&#x…

【数据结构—排序—交换排序】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、排序的概念及其运用 1、排序的概念 2、排序运用 3、 常见的排序算法 二、交换排序 1、冒泡排序 1.1算法讲解 1.2冒泡排序的实现: 1.2.1头文件的…

6.云原生之jenkins集成SonarQube

文章目录 搭建 SonarQube配置SonarQube创建sonar-token生成令牌查看jenkins暴露的NodePort端口创建Webhook 服务器将 SonarQube 配置添加到 ks-installer Jenkins集成SonarQube将 SonarQube 服务器添加至 Jenkinsjenkins配置SonarQubejenkins中配置SonarQube创建Jenkins凭证将 …

LDD学习笔记 -- Linux字符设备驱动

LDD学习笔记 -- Linux字符设备驱动 虚拟文件系统 VFS设备号相关Kernel APIs动态申请设备号动态创建设备文件内核空间和用户空间的数据交换系统调用方法readwritelseek 写一个伪字符设备驱动在主机上测试pcd(HOST)在目标板上测试pcd(TARGET) 字符驱动程序用于与Linux内核中的设备…

Docker使用扩展

日升时奋斗,日落时自省 目录 1、容器 1.1、容器的生命周期 1.1.1、容器OOM 1.1.2、容器异常退出 1.1.3、容器暂停 1.2、容器命令 1.2.1、创建容器 1.2.2、启动容器 1.2.3、容器日志 1.2.4、容器交互 1.2.5、容器停止 1.2.6、扩展 1.3、综合演示 2、存…

FPGA高端项目:纯verilog的 25G-UDP 高速协议栈,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设计架构框图网络调试助手…