MYSQL Binlog恢复误删数据库详解
作者:Mingvvv 发布时间:2024-01-27 06:17:30
对表误删或执行缺少条件的修改 SQL 导致修改了表内其他数据时,我们需要想办法将数据恢复回来。
先创建两个测试表 table_1
CREATE TABLE `table_1` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
首先要确保开启了BINLOG日志
-- 查看日志状态
show variables like '%log_bin%';
之前没有开启 Binlog 日志的话下面的方法就不能继续操作了,开启日志的方法网上有很多,修改一下配置文件并重启 MYSQL 服务。
模拟删除
正常情况下,我们需要从线上正在使用的日志中查找信息,要考虑的因素会很多。
为了方便测试,这里重启了一个新的日志,后面的所有操作都会记录到新的日志文件中。
flush logs
-- 插入table1一些数据
insert into table_1(name) values ('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('10')
-- 模拟删除表信息table1
delete from table_1 where id >5;
--然后修改table1的内容
update table_1 set name= Concat(name,'1') ;
修复步骤
我们需要删除的信息,并保留删除之后修改过的信息
-- 查看日志内容
show master status;
show binlog events in 'binlog.000023';
从上面的查询语句可以查询 binlog.000023 中记录的所有操作。
如图,我们在 993 的位置执行了删除表的操作,我们要把数据还原到这个位置之前
每一个事务从 Gtid 开始,Xid 结束。
有的时候,我们不确定这个位置在什么地方,但是我们有时间范围,可以根据时间范围缩小所有区间,这里需要用到 binlog 命令
以下是 Windows CMD 的命令实例:
mysqlbinlog.exe F:\Mysql\mysql-8.0.27-winx64\data\binlog.000021 --start-datetime="2022-11-17 13:00:00" --stop-datetime="2022-11-17 14:00:00"
控制台打印出来的结果和SQL查询出来的结果大致上是一样的。
找到我们要还原的位置之后,执行还原命令。
以下是 Windows CMD 的命令实例:
mysqlbinlog.exe F:\Mysql\mysql-8.0.27-winx64\data\binlog.000023 --stop-position=993 --database=dgcat | F:\Mysql\mysql-8.0.27-winx64\bin\mysql -uroot -p*****
执行后发现报错:
反馈 table_1表中已经有了主键 1 ,不能插入。是因为我们只指定了数据恢复的结束位置,而当前日志又包含了 table_1 的所有行插入记录,当恢复表时,他会重新插入这些行,导致和表内已存在的信息主键冲突。
因为我的 binlog 日志记录了 table_1 的所有操作记录。所以这里我选择将 table_1 清空,用日志恢复所有数据。
truncate table table_1
正常情况下,我们最好能确认下来数据恢复的开始位置。
再次执行恢复命令后,表内信息如下:
现在已经恢复了我们删除之前的状态,但是我们在删除之后还做了修改操作,我们还需要把修改操作也还原一下:
相当于跳过 delete 操作,1100 位置即是我们修改操作的开始位置,直至 1478 整个操作结束。
mysqlbinlog.exe F:\Mysql\mysql-8.0.27-winx64\data\binlog.000023 --start-position=1100 --stop-position=1478 --database=dgcat | F:\Mysql\mysql-8.0.27-winx64\bin\mysql -uroot -pzdm3713261995!!!
执行结束后我们在查询表内信息 ,删除的数据恢复了,而且我们修改过的记录也在。
来源:https://blog.csdn.net/qq_40096897/article/details/127900719


猜你喜欢
- 本文实例讲述了javascript常见数字进制转换的方法。分享给大家供大家参考,具体如下:基本思路是先把其他进制的转化成 十进制,然后再转化
- 最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为SQL Server 2000中没有内置类似于 split 的函数,只好自己处理
- vue-router路由懒加载 和权限控制,今天刚好搞了一个基于node token验证的小demo所以下面介绍下,路由懒加载1、为什么要使
- Ubuntu Server 16.04下mysql8.0安装配置图文教程1.从Mysql官网上下载安装文件。有两种方式可供选择:使用APT安
- 最近因为编程,需要大量地看一些说明文档,无奈说明文档都是英文的,可把我这个半桶水折腾死了,太多词汇不知道,一个个复制翻译太麻烦了。于是我根据
- 使用场景对手机号码进行地域分析,需要查询归属地;问题描述针对数据集比较大的情况,通过脚本来处理,使用多线程的方法来加快查询速度pool =
- 一、递归原理小案例分析(1)# 概述递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到!(2)# 写
- 本文实例为大家分享了pycharm实现猜数游戏的具体代码,供大家参考,具体内容如下1. 设计界面如下所示,利用QTdesigner设计的界面
- 视图视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,并可以将其当作
- UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是
- 最近试用mysql proxy,遇到若干问题,好在一一找到了解决方案,列出来备忘。这次使用的版本是0.6.x,也许新版本就没有这些问题了。无
- 1. 引言今天来给小伙伴推荐两款实用的便于调试Python代码的工具,可以方便展示我们调试代码的中间状态,提升大家的编码效率。2. 动机在日
- 本文实例为大家分享了Vue+ Antv F2实现层叠柱状图的具体代码,供大家参考,具体内容如下一、 创建canvas标签<canvas
- 代码中用到了nextpow2,其中n = nextpow2(x) 表示最接近x的2的n次幂。#!/usr/bin/env pythonimp
- 一、求解方法、算法和编程方案线性规划 (Linear Programming,LP) 是很多数模培训讲的第一个算法,算法很简单,思想很深刻。
- 前段时间前在网上看到一段面试题,要求如下:employee文件中记录了工号和姓名 cat employe
- SQL Server会把经常使用到的数据缓存在内存里(就是数据页缓存),用以提高数据访问速度。因为磁盘访问速度远远低于内存,所以减少磁盘访问
- 如果开发者想在一个特定的应用程序中完全控制消息与事件的发送,只需要使用一个默认的"/"命名空间就足够了.但是如果开发者需
- 最新版本的Python发布了!今年夏天,Python 3.8发布beta版本,在2019年10月14日,第一个正式版本已准备就绪。现在,我们
- SQL Server: Sql代码 Select TOP N * From TABLE Order By NewID() NewID()函数