macbook不能进系统 备份数据_不基于备份和表,生产系统数据误删就能完全恢复?!...

作者介绍

刘宝珍,架构师,目前就职于大型资产管理公司的科技子公司,拥有多年的大型私有云的规划和设计工作经验,熟悉软件的开发流程,目前醉心于研究基于DDD和敏捷的软件的开发模式,对分布式架构有深入的理解,同时也希望同各位朋友交流软件架构和云计算架构的经验。

注:本文转载自订阅号MySQL解决方案工程师,由徐轶韬编辑修订。

本文通过记录真实案例的形式,对故障排除的过程进行总结和反思。文中不但描述了刘老师解决问题的思路,还清晰的记载了解决问题的方法。仔细阅读此文,你会发现刘老师对故障的排除和修复有着清晰的思路和严谨的执行方法。

另外,通过此文,还可以发现刘老师的一大爱好,去GitHub查找资源,并加以利用。这一举动不但体现了开源软件的优势,也体现了开源爱好者的理念。接下来,让我们阅读刘老师的原文。

一、背景和思路

2020年2月25日,微信的朋友圈大量转载微盟遭遇了系统重大故障,36小时内尚未恢复核心生产数据,从而想到本人在两周前处理的一个案例,开发人员误删除了生产数据,本人恢复的一个过程,同时给这个故障的处理过程做一个总结,也对学过的知识做一个梳理,希望对运维的同学们有一个警示作用。

2月13日23:00接到微信通知,能否帮忙恢复数据。

系统环境信息如下:

  • 操作系统:RHEL7.5

  • 工作流平台:开源activity

  • 业务应用:调用activity,生成该应用的流程数据

  • 工作流使用的数据库:MYSQL 5.7社区版,一主两备

  • 23:05,开始介入数据丢失的故障

确认一个大概解决问题的思路:

1、找到是什么人在什么时间点做了什么操作?

2、这个操作对系统的影响有多大,是否对其他系统有影响?确认这个操作是不是正常业务体现?

3、确认数据库里受到影响的日志的时间段。

4、在仿真环境复盘整个故障。

5、制定技术恢复方案,在仿真环境验证数据恢复方案。

6、在仿真环境验证数据恢复后应用是否正常。

7、备份生产环境数据,应用数据恢复方案到生产环境。

8、生产环境绿灯测试,无误后,恢复完成。

由于恢复生产数据是重大的数据调整,需要报请领导批准,需要有完备的数据回退方案。

二、数据恢复过程及技术分析

用了5分钟理清了处理这个问题思路,接下来就是考虑具体的数据恢复了。在处理这个问题过程中,有两个难点需要解决。

1、确认要恢复的binlog的开始和结束。

2、根据binlog的开始和结束,确认数据恢复方案,以及是否需要需要排除在这个时间段发生的其他干扰数据。

首先解决第一个问题:

1、询问开发人员,开发人员给出晚间大概20:20左右操作rest接口,调用了activity(以下简称工作流)平台删除流程模板的操作,导致该流程模板下所有的流程实例全部被删除,在该流程模板下有5个在途的流程尚未处理完成。

2、根据开发人员的描述,登录到工作流平台的数据库,查看数据库在20:20左右的binlog 文件,并对11号binlog文件进行备份。

3、将binlog拷贝到一个开发的服务器,通过mysqlbinlog进行解析。解析命令为:mysqlbinlog -v --base64-output=decode-rows --skip-gtids=true --start-datetime='2020-02-13 20:10:00' --stop-datetime='2020-02-13 21:30:00' -d {$DBNAME} mysql-bin.000011 >>aa.log dbname做了脱敏处理。

4、观察解析后的sql,在20:20分并未发现大量的删除操作,确认开发人员的话不可信,做故障诊断的第一原则:任何人的话都不能全信,也不可能不信,带着疑问来找到论据证明他的说法。

5、继续翻看解析的binlog,20:30开始出现大量的delete和update等操作,开始怀疑这一点是不是有问题的时间段。

6、将这一段的sql进行归纳总结,归纳需要操作几个表,对这个几个表的操作类型,以及操作的数据的类别(业务ID)。同工作流平台的同事进行确认,删除一个工作流的模板,是不是涉及到这些表的变更,工作流平台的同事确认是这个过程,数据恢复的希望诞生了!

7、根据以前的经验积累,github上有个开源项目binlog2sql,可以将binlog的event翻译成sql语句,也可以翻译成反向sql,顿时觉得这个问题应该很“容易”解决了。

8、根据以上思考,开始在仿真环境里安装binlog2sql工具,该工具就是一个python的程序,需要安装好python环境以及需要的三方库即可,具体的使用方式请参考:https://github.com/danfengcao/binlog2sql,同时也再次感谢工具的作者曹老师。

9、在仿真环境里,恢复生产环境有问题的实例,同时在工作流平台将应用的jdbc的url指向新的恢复好的实例。

以上几个过程,已经解决了第一个问题,接下来我们要解决第二个问题。

1、在以上的步骤里,已经在仿真环境复盘了生产环境的故障,同时在也仿真环境里里安装了binlog转成sql的工具。

2、使用binlog2sql的工具,解析出来错误执行的sql,让工作流的平台的同时进行确认,同时让工作流的同事,确认在这个时间段内没有其他的应用也在操作这个数据库。

3、工作流的同事确认sql全部为误操作产生的sql。具体的确认方式如下:

  • 在仿真环境模拟创建一个工作流模板。

  • 在这个模板上创建几个测试实例

  • 通过接口去删除这个工作流模板,观察应用产生的sql,以此来确认本人提供的sql是否正确。

同时,工作流平台确认在问题时间段内无其他应用操作,感觉胜利在望了,该问题可以轻松解决了。

4、通过binlog2sql生产反向sql,把sql应用于仿真环境,问题就能解决了,仔细观察反向sql文件,发现里面有一些乱码,查看乱码字段所在的表,发现表的定义是这样的:

380328b57f4229bf39347f68f8baf24f.png

表中有个字段为longblob字段,产生的insert的sql无法执行,这个问题该怎么处理?

5、这个问题到这里陷入了僵局,眼看马上就能解决的问题,发现有一个表数据无法通过sql进行插入,询问工作流平台同事,这个表是否很重要,得到答复,没有这个表的数据,系统无法运转。

6、换个思路考虑一下,既然sql是通过二进制的binlog生成的,可以考虑生成反向的二进制binlog,然后把这一段反向的binlog应用到数据库,这个问题就解决了。

7、带着这个思路,去github里翻看了项目。果然还真有一个:https://github.com/Meituan-Dianping/MyFlash 再次非常感谢美团点评开源的myflash项目。

8、利用myflash生成了反向二进制文件,把文件应用到数据库,工作流平台在仿真环境测试,数据完美再现。

三、问题的反思

通过以上分析,基本上就可以轻松解决这个问题。对自己提出几个问题:

1、为什么不用备份恢复的方式进行数据库恢复?

在这个系统上,数据已经备份了,每天都有全备,不能使用这个恢复的原因,工作流平台里有很多应用的流程引擎,一旦做了基于时间点恢复,别的应用的系统数据一块被恢复了,将会导致别的系统会丢失一部分数据。

2、为什么不基于表的数据恢复?

因为工作流平台是一个开源的平台,数据模型之间的关联性特别强,如果基于表的恢复,容易导致数据的约束出现问题。

反思:

1、 为什么在生产环境出现丢失数据的情况?

开发人员在生产上线过程越过了仿真环境,直接上生产,对生产上线过程并不严谨,虽然有管理流程,但是对流程的过程执行不力。

2、研发人员的技术能力,研发人员对activity并不熟悉,对于修改流程模板的流程也不熟悉,提高研发人员的技术能力必须要提上日程。

四、后续问题

结合以上分析过程,需要指定一些辅助策略来完善发布流程。

1、发布流程自动化,应用代码发布自动化发布,尽量避免人为参与。

2、应用发布流程标准化,所有的脚本和上线的新的应用的步骤必须经过验证才能上线。

作者丨刘宝珍   编辑修订丨徐轶韬来源丨MySQL解决方案工程师(ID:mysqlse)dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

难道救火注定是运维绕不开的宿命吗?突破运维转型困局,9月11日在北京,让Gdevops全球敏捷运维峰会给你新思路:

  • 《浙江移动AIOps实践》浙江移动云计算中心NOC及AIOps负责人 潘宇虹

  • 《数据智能时代:构建能力开放的运营商大数据DataOps体系》中国联通大数据基础平台负责人/资深架构师 尹正军

  • 《银行日志监控系统优化手记》中国银行DevOps负责人 付大亮 & 中国银行高级软件工程师 李晓宁

  • 《民生银行智能运维平台实践之路》民生银行智能运维平台负责人/应用运维专家 张舒伟

  • 《建设敏捷型消费金融中台及云原生下的DevOps实践》中邮消费金融总经理助理 李远鑫

8e7457325f4cb9a78c725f1b786a8801.png

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

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

相关文章

arduino代码_arduino智能小车项目——01、配件介绍及代码部分教程

各位小伙伴大家好:本期我们开始制作智能小车项目,这因该是资源包里面难度相对较大的项目。所以我们从易到难把项目进行分解,先从实现较为简单的功能开始。本期我们的目标是实现小车的自主运动,代码部分也相对比较简单,…

python+mysql库+json_用python写爬虫-5.1json用pandas入mysql库

pandas是一个数据处理模块,前面也已经提到了好些,用python写爬虫--4.5pandas存入excel.这次来统一说一说,使用感想。pandas主要是Seriers和Dataframe,Seriers相当于list,dataframe相当于excel表格,有行也有…

pdf温度记录仪开发_蔬菜、鲜果、奶制品冷链温度监控系统监控食品让客户放心...

冷链温度监控系统对于蔬菜鲜果奶制品的冷藏,不仅有助于减慢它们的腐坏速度,保持新鲜,而且对全国物品的运输和合理配置有极大的影响。选择GPS冷链温度监控食品传输过程让客户不再担心质量问题,人们也吃的放心。在多年自主开发GPS物…

python中什么是数据驱动_Python数据驱动DDT的应用

原标题:Python数据驱动DDT的应用 在开始之前,我们先来明确一下什么是数据驱动,在百度百科中数据驱动的解释是:数据驱动测试,即黑盒测试(Black-box Testing),又称为功能测试&#xff…

2008日志清理 server sql_SQL Server 2008 收缩日志 清空删除大日志文件

由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消:(SQL2005)BackupLog DNName with no_loggodumptransaction DNName with no_loggoUSE DNNameDBCC SHRINKFILE (2)Go-----------------------------------…

go java性能_服务端I/O性能大比拼:Node、PHP、Java和Go

理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异。若应用程序比较小,也没有服务于很高的负载,也许它影响甚微。但随着应用程序的负载逐渐上涨,采用错误的I/O模型有可能会让你到处踩坑&am…

python数据库安装_python数据库-MySQL安装问题总结(48)

一、ERROR 1698(28000):Access denied for user rootlocalhost错误 我的操作系统是ubuntu:我的MySQL版本是:安装完成后,登录mysql的时候就出现了如下错误:因为安装的过程中没让设置密码,可能密码为空,但无论…

[转]什么是RSS

http://www.blogbus.com/bangzhuzhongxin-logs/5452786.html 如果您够仔细的话,一定会发现BlogBus的每一个Blog站上都会有一个 图标。这个图标表示Blogbus支持RSS功能(目前是RSS 2.0),即所谓的新闻聚合功能。 点击 图标&#xf…

京东的商品搜索功能是如何实现的_如何精准查询京东商品销量?分享一个京东运营小妙招...

京东平台和其他平台商品信息展示不一样,在京东平台商品的销售额无论是累计的还是当月的数据都没有展示,即便是通过商家后台的京东商智也是只能看到销售额的指数,这就给京东商家做竞品分析时设置了障碍,无法获取到竞品的真实销售额…

python 可视化监控平台_python可视化篇之流式数据监控的实现

preface 流式数据的监控,以下主要是从算法的呈现出发,提供一种python的实现思路 其中: 1.python是2.X版本 2.提供两种实现思路,一是基于matplotlib的animation,一是基于matplotlib的ion 话不多说,先了解大概…

codeforce 606A - Magic Spheres

题意&#xff1a;a,b,c三种球&#xff0c;能把俩个一样的球变成另一颜色不一样的球。给你目标x,y,z&#xff0c;问能否经过变化至少达打目标。 1 #include<iostream>2 #include<stdio.h>3 #include<stdlib.h>4 #include<memory.h>5 #include<string…

cmd cd 无法切换目录_一分钟掌握cmd基础操作,告别鼠标

cmd基础操作cmdcmd是command的缩写&#xff0c;一直伴随着windows操作系统。有时称为&#xff1a;控制台窗口&#xff0c;cmd窗口&#xff0c;黑窗口&#xff0c;命令行窗口等。其实&#xff0c;在unix系统&#xff0c;Linux&#xff0c;MacOS等几乎所有的操作系统中&#xff0…

css 背景图怎么设置自动填充满_CSS属性设置 -- 背景样式

Ⅰ background-color: -- 设置标签的背景颜色rgba(0,0,0,0.65); -- (红,緑,蓝三原色,透明度)只能给背景设置透明度opacity: 0.65; -- 改变整个标签的透明度<style>Ⅱ background-image: --设置标签的背景图片url("图片网址"); -- 如果图片的大小没有标签大&…

php开发客服系统(持久连接+轮询+反向ajax)

欢迎在php严程序 - php教程学习AJAX教程, 本节课讲解&#xff1a;php开发客服系统(持久连接轮询反向ajax) php开发客服系统(下载源码) 用户端(可直接给客户发送消息)客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式&#xff1a;一&#xff1a;iframe 服务器推技术com…

c语言判断整数_C语言技能|(草稿,不断完善中...)

2020年春考C语言有2个题型&#xff1a;填空&#xff0b;程序程序填空涉及&#xff1a;一、头文件的引用1.必有#include (注意&#xff1a;在devC 5.10中#include "stdio.h"也是正确的)2.若程序中使用数学函数&#xff0c;应加上头文件#include 3.头文件结尾无分号二、…

python生成器迭代_python中的生成器和迭代器

前言&#xff1a; 我们来了解一下什么是python中生成器。了解一下python生成器是什么&#xff0c;以及生成器在python编程之中能起到什么样的作用。 定义&#xff1a; 生成器和迭代器 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#…

python 生成pdf_如何使用Python生成PDF?

在日常办公中&#xff0c;我们会经常使用PDF文件。生成PDF的方法有很多&#xff0c;其中Python就可以。你知道怎么使用Python也可以生成PDF吗&#xff1f;下面来和小编一起学习下吧。首先我们访问网址&#xff1a;https://wkhtmltopdf.org/downloads.html &#xff0c;根据自己…

java 代码重用需要注意的事项_程序员笔记|编写高性能的Java代码需要注意的4个问题...

一、并发无法创建新的本机线程......问题1&#xff1a;Java的中创建一个线程消耗多少内存&#xff1f;每个线程有独自的栈内存&#xff0c;共享堆内存问题2&#xff1a;一台机器可以创建多少线程&#xff1f;CPU&#xff0c;内存&#xff0c;操作系统&#xff0c;JVM&#xff0…

java vbs_VBS基础篇 - vbscript Dictionary对象

Dictionary是存储数据键和项目对的对象&#xff0c;其主要属性有Count、Item、Key&#xff0c;主要方法有Add、Exists、Items、Keys、Remove、RemoveAll。创建Dictionary对象定义并创建Dictionary对象&#xff0c;使用CreateObject创建并返回自动化对象的引用Dim DicSet Dic C…

java integer最大值_五分钟学会java中的基础类型封装类

在刚刚学习java的时候&#xff0c;老师不止一次的说过java是一种面向对象的语言&#xff0c;万物皆对象。对于java中的基础数据类型&#xff0c;由于为了符合java中面向对象的特点&#xff0c;同样也有其封装类。这篇文章对其有一个认识。一、基本认识其实在jdk1.5之前&#xf…