1.简介
在Oracle数据库中,当一个误操作被提交后,我们可以通过Oracle提供的闪回功能将表闪回至误操作之前的状态。mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备+二进制日志前滚进行恢复。
今天给大家介绍一种使用Python脚本在MySQL中实现类似Oracle中flushback table的闪回功能,相比于传统的全备+增备,本方法更为快速、简单。
2.闪回原理
原理:调用mysql_rollback.py(下载见本文最后)对rows格式的binlog进行逆向操作,delete反向生成insert、update生成反向的update、insert反向生成delete。
3.说明
0、需安装python及MySQLdb模块
1、binlog的格式必须为row
2、要恢复的表操作前后表结构没有发生变更,否则脚本无法解析
3、只生成DML(insert/update/delete)的rollback语句,DDL语句不可回滚
4、最终生成的SQL是逆序的,所以最新的DML会生成在输入文件的最前面,并且带上了时间戳和偏移点,方便查找目标
5、需要提供一个连接MySQL的只读用户,主要是为了获取表结构
6、如果binlog过大,建议带上时间范围,也可以指定只恢复某个库的SQL
7、SQL生成后,请务必在测试环境上测试恢复后再应用到线上
4.实战
step1.登陆mysql查看表信息
mysql> use db1
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test;
+------+-------+------+---------+----------+
| id | name | age | country | city |
+------+-------+------+---------+----------+
| 1 | alex | 26 | china | shanghai |
| 2 | bob | 25 |