登录
首页 >  数据库 >  MySQL

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

来源:SegmentFault

时间:2023-02-16 15:27:00 299浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《用MySQL的全量备份和增量备份来还原或修复数据》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

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

于是抽空整理了下MySQL数据库如何通过全量备份和增量备份来修复数据。
在了解以下数据库还原和修复前,你必须要对
全量备份
增量备份
有所了解
全量备份

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

增量备份

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

思路,原理

为了方便操作,快速导入,安全等原因,选择利用本地数据库来还原,新建一个空数据库

(名字和原数据库完全一致)
,用命令导入
全量备份sql文件
,把
增量备份文件
转成sql文件
(这里要特殊处理,后面讲)
,再用命令
source
按时间先后顺序导入sql文件。
第一步 还原全量备份

这一步相对来说非常简单了,首先在本地新建一个空数据库,并且编码和原数据库一致,数据库库名和原数据库一致。接着就去生产服务器找到全量备份SQL文件

(具体位置得看你备份机制的设置)
并下载到本地,然后用数据库
source命令
导入
(为了快速导入,建议用命令)

导入成功后,整个全量备份就恢复了。
第二步 从增量备份里找到数据被update,delete乱掉的时间节点(这步很关键)

在服务器上找到

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

show binlog events in 'binlog.000201';

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

“未命名”的副本 2.png
第三步 把增量备份文件转换成SQL文件

这步我们需要了解

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

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

image.png

找到开始位置

--start-position=4
,第一行的pos数值

image.png

找到结束位置

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

image.png

第二步的增量备份文件特殊处理

(结束位置是事故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 

image.png
第六步 修复数据

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

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

image.png

好了,本文到此结束,带大家了解了《用MySQL的全量备份和增量备份来还原或修复数据》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表