mysql binlog 闪回_MySQL误操作之快速闪回binlog2sql

2023-10-28 16:59

本文主要是介绍mysql binlog 闪回_MySQL误操作之快速闪回binlog2sql,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目作者:danfengcao

项目地址:https://github.com/danfengcao/binlog2sql

1、环境限制

mysql server必须开启,离线模式下不能解析binlog

binlog格式必须是行模式

软件版本:Python 2.7 MySQL 5.6

MySQL设置一下参数:

[mysqld]

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

max_binlog_size = 1000M

binlog-format = row

2、构建数据

建库

root@localhost [mysql]>create databasetest;

Query OK, 1 row affected (0.10 sec)

建表

root@localhost [mysql]>create tabletest01( id int(4) not null auto_increment, name varchar(3), age int(4),primarykey(id))engine=innodb charset=utf8;

Query OK, 0 rows affected (0.13 sec)

插入测试数据

insert into test01(id,name,age)values(1,'tom',25);

insert into test01(id,name,age) values(2,'小丫',23);

insert into test01(id,name,age) values(3,'飞飞',28);

insert into test01(id,name,age) values(4,'参参',16);

insert into test01(id,name,age) values(5,'顺子',330);

insert into test01(id,name,age) values(6,'炸弹',48);

检查测试数据

root@localhost [mysql]>select * fromtest01;

+----+--------+------+

| id | name  | age  |

+----+--------+------+

|  1 |tom    |  25 |

|  2 | 小丫   |   23|

|  3 | 飞飞   |   28|

|  4 | 参参   |   16|

|  5 | 顺子   |  330|

|  6 | 炸弹   |   48|

+----+--------+------+

6 rows in set (0.00 sec)

3、安装binlog2sql

git clone https://github.com/danfengcao/binlog2sql.git

pip install -r requirements.txt

4、模拟删除数据恢复

删除数据

root@localhost [test]>select * fromtest01;

+----+--------+------+

| id | name  | age  |

+----+--------+------+

|  1 |tom    |  25 |

|  2 | 小丫   |   23|

|  3 | 飞飞   |   28|

|  4 | 参参   |   16|

|  5 | 顺子   |  330|

|  6 | 炸弹   |   48|

+----+--------+------+

6 rows in set (0.14 sec)

root@localhost [test]>delete from test01;

Query OK, 6 rows affected (0.09 sec)

root@localhost [test]>select * fromtest01;

Empty set (0.00 sec)

登陆MySQL,查看目前的binlog文件

root@localhost [test]>show master logs;

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |     65396 |

| mysql-bin.000002 |   1179102 |

| mysql-bin.000003 |      3401 |

+------------------+-----------+

3 rows in set (0.03 sec)

最新的binlog文件是mysql-bin.000002,我们再定位误操作SQL的binlog位置

[root@bogon ~]# pythonbinlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -dtest -ttest01--start-file='mysql-bin.000004'

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (25, 1, 'tom'); #start 239 end 412

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (23, 2, '小丫'); #start491 end 667

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (28, 3, '飞飞'); #start746 end 922

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (16, 4, '参参'); #start1001 end 1177

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (330, 5, '顺子'); #start1256 end 1432

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (48, 6, '炸弹'); #start1511 end 1687

DELETE FROM `test`.`test01` WHERE `age`=25AND `id`=1 AND `name`='tom' LIMIT 1; #start 1766 end 2019

DELETE FROM `test`.`test01` WHERE `age`=23AND `id`=2 AND `name`='小丫' LIMIT 1;#start 1766 end 2019

DELETE FROM `test`.`test01` WHERE `age`=28AND `id`=3 AND `name`='飞飞' LIMIT 1;#start 1766 end 2019

DELETE FROM `test`.`test01` WHERE `age`=16AND `id`=4 AND `name`='参参' LIMIT 1;#start 1766 end 2019

DELETE FROM `test`.`test01` WHERE `age`=330AND `id`=5 AND `name`='顺子' LIMIT 1;#start 1766 end 2019

DELETE FROM `test`.`test01` WHERE `age`=48AND `id`=6 AND `name`='炸弹' LIMIT 1;#start 1766 end 2019

生成回滚sql,并检查回滚sql是否正确

[root@bogon ~]# pythonbinlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -dtest -ttest01--start-file='mysql-bin.000004' --start-pos=1766 --end-pos=2019 -B

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (48, 6, '炸弹'); #start1766 end 2019

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (330, 5, '顺子'); #start1766 end 2019

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (16, 4, '参参'); #start1766 end 2019

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (28, 3, '飞飞'); #start1766 end 2019

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (23, 2, '小丫'); #start1766 end 2019

INSERT INTO `test`.`test01`(`age`, `id`,`name`) VALUES (25, 1, 'tom'); #start 1766 end 2019

确认回滚sql正确,执行回滚语句。

[root@bogon ~]# pythonbinlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -dtest -ttest01--start-file='mysql-bin.000004' --start-pos=1766 --end-pos=2019 -B | mysql-h127.0.0.1 -P3306

登录mysql,数据回滚成功

root@localhost [test]>select * fromtest01;

+----+--------+------+

| id | name  | age  |

+----+--------+------+

|  1 |tom    |  25 |

|  2 | 小丫   |   23|

|  3 | 飞飞   |   28|

|  4 | 参参   |   16|

|  5 | 顺子   |  330|

|  6 | 炸弹   |   48|

+----+--------+------+

(END)

PS:本软件适用于delete和updete误操作快速闪回,其他功能本人还没有测试过,再次感谢作者的开源。

为了方便大家交流,本人开通了微信公众号和QQ群,QQ群:291519319,喜欢技术的一起来交流吧

8ee405e99bbacaa385ff4ef0a5942c3d.png

这篇关于mysql binlog 闪回_MySQL误操作之快速闪回binlog2sql的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/294644

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID