Mysql binlog2sql数据回滚

本文详细介绍了如何使用binlog2sql工具进行MySQL数据回滚。在误删除f表数据后,通过查看binlog定位到误操作SQL,生成并执行回滚SQL,最终成功恢复数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先我们安装binlog2sql

yum -y install epel-release

yum -y install git python-pip

shell> git clonehttps://github.com/danfengcao/binlog2sql.git && cd binlog2sql

shell> pip install -r requirements.txt 

--default-timeout=1000

原有数据

mysql> select * from f;

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

| uid | did |updateTime     |

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

|  1 | 18 | 2016-12-06 12:28:18 |

|  2 | 19 | 2016-12-06 12:55:56 |

|  3 | 20 | 2016-12-07 14:00:58 |

|  4 | 21 | 2016-12-07 14:01:00 |

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

误操作mysql> delete from f;

Query OK, 4 rows affected (0.00 sec)

f表被清空

mysql> select * from f;

Empty set(0.00 sec)

2、回滚步骤:

登录mysql,查看目前的binlog文件

mysql> show master logs;

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

| Log_name     |File_size |

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

| mysql-bin.000001 | 12262268 |

| mysql-bin.000002 |  132776 |

 

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

$ pythonbinlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -t f--start-file='mysql-bin.000002'

输出:

DELETE FROM `test`.`f` WHERE `did`=18 AND`updateTime`='2016-12-06 12:28:18' AND `uid`=1 LIMIT 1; #start 4 end 314

DELETE FROM `test`.`f` WHERE `did`=19 AND`updateTime`='2016-12-06 12:55:56' AND `uid`=2 LIMIT 1; #start 4 end 314

DELETE FROM `test`.`f` WHERE `did`=20 AND`updateTime`='2016-12-07 14:00:58' AND `uid`=3 LIMIT 1; #start 4 end 314

DELETE FROM`test`.`f` WHERE `did`=21 AND `updateTime`='2016-12-07 14:01:00' AND `uid`=4LIMIT 1; #start 4 end 314

 

 

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

 

$ pythonbinlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -t f--start-file='mysql-bin.000002' --start-pos=4 --end-pos=314 -B

输出:

INSERT INTO `test`.`f`(`did`, `updateTime`,`uid`) VALUES (21, '2016-12-07 14:01:00', 4); #start 4 end 314

INSERT INTO `test`.`f`(`did`, `updateTime`,`uid`) VALUES (20, '2016-12-07 14:00:58', 3); #start 4 end 314

INSERT INTO`test`.`f`(`did`, `updateTime`, `uid`) VALUES (19, '2016-12-06 12:55:56', 2);#start 4 end 314

 

4、确认回滚sql正确,执行回滚语句。登录mysql,数据回滚成功。

 

pythonbinlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -t f--start-file='mysql-bin.000002' --start-pos=4 --end-pos=314 -B | mysql-h127.0.0.1 -P3306 -uadmin -p'admin'

 

mysql> select * from f;

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

| uid | did |updateTime     |

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

|  1 | 18 | 2016-12-06 12:28:18 |

|  2 | 19 | 2016-12-06 12:55:56 |

|  3 | 20 | 2016-12-07 14:00:58 |

|  4 | 21 | 2016-12-07 14:01:00 |

5、至此,回滚成功!

### 使用 binlog2sql 工具生成回滚 SQL 文件 为了通过 `binlog2sql` 从 MySQL 的二进制日志中提取并生成用于回滚操作的 SQL 文件,可以按照以下方法实现: #### 准备工作 确保已安装 Python 和必要的依赖库。`binlog2sql` 是基于 Python 编写的工具,它利用了 `python-mysql-replication` 库来解析 MySQLbinlog 数据[^2]。 可以通过 pip 安装该工具及其依赖项: ```bash pip install pymysql python-dateutil mysql-replication git clone https://github.com/danfengcui/binlog2sql.git cd binlog2sql ``` #### 基本命令结构 运行 `binlog2sql` 的基本命令如下所示: ```bash binlog2sql --flashback --start-datetime="YYYY-MM-DD HH:MM:SS" \ --stop-datetime="YYYY-MM-DD HH:MM:SS" -h hostname -u username -p password \ -P port_number --databases=database_name --tables=table_name ``` 其中参数解释如下: - `--flashback`: 表示生成反向(即回滚SQL。 - `--start-datetime` 和 `--stop-datetime`: 指定时间范围内的 binlog 记录被转换成 SQL[^3]。 - `-h`, `-u`, `-p`, `-P`: 连接数据库所需的信息。 - `--databases` 和 `--tables`: 可选过滤条件,指定特定数据库或表的操作记录。 #### 输出结果存储至文件 默认情况下,上述命令会将生成的结果打印到标准输出流 (stdout),可将其重定向保存为 `.sql` 文件以便后续使用: ```bash binlog2sql ...options... > rollback.sql ``` 这样就创建了一个名为 `rollback.sql` 的文件,里面包含了可用于撤销目标时间段内更改的所有逆向 SQL 语句[^1]。 #### 处理多线程环境下的潜在冲突 当存在并发事务或者复杂场景下需要考虑单条或多条 SQL 执行顺序时,应特别注意避免因乱序或其他因素造成的数据不一致问题[^4]。一般建议按需调整脚本逻辑以适应具体业务需求;如果确实有必要,则可通过增加额外控制机制比如锁管理等方式解决此类同步难题。 ```python import threading def execute_sql(sql_statement, thread_id): # 实现具体的SQL执行流程... pass threads = [] for sql in parsed_statements: t = threading.Thread(target=execute_sql, args=(sql,)) threads.append(t) t.start() for t in threads: t.join() ``` 以上代码片段展示了如何在一个简单的例子中启动多个独立线程分别处理不同的 SQL 请求,并等待它们全部完成后再继续下一步动作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值