用MySQL的全量备份和增量备份来还原或修复数据

公司项目发生了严重的生产事故,所有的订单状态都被更新成了一个状态,所幸的事,项目有做数据库全量备份和增量备份,花了4个小时把状态修复了,不然只能整个项目组跑路了.....
该事故原因是由于同事不小心把更新代码写错了,导致update没有where条件。

于是抽空整理了下MySQL数据库如何通过全量备份和增量备份来修复数据。

在了解以下数据库还原和修复前,你必须要对 全量备份增量备份有所了解
全量备份

简单的说就是将所有数据库或一个库全部备份。具体如何备份这里不讲。

增量备份

从上一次全量备份之后到下一次全量备份之前都叫做增量备份,也就是记录这段时间以来每次SQL执行语句。具体如何备份这里不讲。

思路,原理

为了方便操作,快速导入,安全等原因,选择利用本地数据库来还原,新建一个空数据库(名字和原数据库完全一致),用命令导入全量备份sql文件,把增量备份文件转成sql文件(这里要特殊处理,后面讲),再用命令source按时间先后顺序导入sql文件。

第一步 还原全量备份

这一步相对来说非常简单了,首先在本地新建一个空数据库,并且编码和原数据库一致,数据库库名和原数据库一致。接着就去生产服务器找到全量备份SQL文件(具体位置得看你备份机制的设置)并下载到本地,然后用数据库source命令导入(为了快速导入,建议用命令)
导入成功后,整个全量备份就恢复了。

第二步 从增量备份里找到数据被update,delete乱掉的时间节点(这步很关键)

在服务器上找到增量备份文件,里面有一堆,如果你是几天备份一次,增量文件就很多,找到数据乱掉的那天的增量备份文件,做具体分析,这个时间点后增量备份文件就不用还原了,这个时间点之前的文件全部按时间顺序还原
具体分析:用Navicat工具连接上生产数据库来分析,执行如下sql

show binlog events in 'binlog.000201';

找到第一次执行那条罪恶代码的位置,注意看截图中的位置,我们需要的是它上一次提交的位置

用MySQL的全量备份和增量备份来还原或修复数据_第1张图片

第三步 把增量备份文件转换成SQL文件

这步我们需要了解mysqlbinlog,他是MySQL自带的一个工具,它能讲增量备份二进制文件转换成SQL文件,安装好MySQL后bin文件夹下面就有它,如果是集成环境,需要注意它的路径可能不同。
这里我建议用原生产服务器上的mysqlbinlog,本地的mysqlbinlog可能会版本不一致,导致转换失败,博主被这个问题坑了一阵子,分享目的也是希望你少走弯路。
使用命令

 mysqlbinlog --start-position=4 --stop-position=49609397 binlog.000201 > 201.sql

用MySQL的全量备份和增量备份来还原或修复数据_第2张图片

找到开始位置--start-position=4,第一行的pos数值

用MySQL的全量备份和增量备份来还原或修复数据_第3张图片

找到结束位置--stop-position=49609397,找到最后一行的End_log_pos数值

用MySQL的全量备份和增量备份来还原或修复数据_第4张图片

第二步的增量备份文件特殊处理(结束位置是事故sql上一条语句提交结束位置),之后的增量文件不用还原

第四步 执行增量备份SQL文件

首先把你在服务器上转换好的的sql文件下载到本地,再用source命令导入执行,执行必须按备份文件时间先后顺序单个执行,时间可能比较长一点,大概20分钟左右一个,执行中可能有报错也是正常,因为sql文件里有非SQL语句。到此整个数据库都还原到事故前的数据了。

第五步 分离数据

我们由于是订单表的订单状态被破坏了,因此只恢复订单状态字段即可。在本地把订单表的状态字段和单独拧出到一张表,然后导出这张表的sql文件,导入到生产环境的库里

CREATE table temp_order_status as SELECT id,order_status_id,order_status_code from biz_order 

用MySQL的全量备份和增量备份来还原或修复数据_第5张图片

第六步 修复数据

然后编写更新语句,更新订单状态字段的值

UPDATE biz_order a
JOIN temp_order_status b ON a.id = b.id 
SET a.order_status_id = b.order_status_id,
a.order_status_code = b.order_status_code

用MySQL的全量备份和增量备份来还原或修复数据_第6张图片

你可能感兴趣的:(javascript,shell,mysql,备份与恢复,数据)