使用python脚本实现mysql误操作的flushback

  

<强> 1。简介
在甲骨文数据库中,当一个误操作被提交后,我们可以通过甲骨文提供的闪回功能将表闪回至误操作之前的状态.mysql中没有原生的flushback功能,DBA误操作时,传统的恢复方式是利用全备+二进制日志前滚进行恢复。
今天给大家介绍一种使用python脚本在mysql中实现类似甲骨文中flushback表的闪回功能,相比于传统的全备+增备,本方法更为快速,简单。

  

<强> 2。闪回原理
原理:调用mysql_rollback。py(脚本在我的另一篇博客闪回脚本:mysql_rollback.py)对行格式的binlog进行逆向操作,删除反向生成插入、更新生成反向的更新、插入反向生成删除。

  

<强> 3。说明
0,需安装python及MySQLdb模块
1, binlog的格式必须为行
2,要恢复的表操作前后表结构没有发生变更,否则脚本无法解析
3,只生成DML(插入/更新/删除)的回滚语句,DDL语句不可回滚
4,最终生成的SQL是逆序的,所以最新的DML会生成在输入文件的最前面,并且带上了时间戳和偏移点,方便查找目标
5,需要提供一个连接MySQL的只读用户,主要是为了获取表结构
6,如果binlog过大,建议带上时间范围,也可以指定只恢复某个库的SQL
7, SQL生成后,请务必在测试环境上测试恢复后再应用到线上

  

<>强4。实战
step1。登陆mysql查看表信息

  
 <代码> mysql>使用db1
  完成阅读表信息表和列的名称
  你可以关掉这个功能——更快的启动
  
  数据库修改
  mysql>select *从测试;
  + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | | id名称| | | |国家城市时代
  + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  亚历克斯| 1 | | 26 | | |中国上海
  鲍勃| | 2 | 25 | | |英国伦敦
  西蒙| 3 | | 24 | | |法国巴黎
  + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  3行集(0.00秒) 
  

步骤2。模拟误操作(更新)

  
 <代码> mysql>更新测试集国家=芭分蕖?氨泵?——鲍勃的国家被改为欧洲
  查询好了,1行影响(0.01秒)
  行匹配:1改变:1警告:0
  mysql>select *从测试;
  + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  | | id名称| | | |国家城市时代
  + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  亚历克斯| 1 | | 26 | | |中国上海
  | 2 |鲍勃伦敦欧洲25 | | | |
  西蒙| 3 | | 24 | | |法国巴黎
  + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
  3行集(0.00秒)
  
  mysql>退出;
  再见 
  

步骤3。分析binlog并生成反向语句
找到最新的binlog

  
 <代码> SZD-L0087668: gzz3306:大师比;噢
  -rw-rw mysql mysql——167 5月2日14:30 mysql-bin.000001
  -rw-rw mysql mysql——1 11400402 5月2日19:28 mysql-bin.000002
  -rw-rw mysql mysql——1807 5月2日19:49 mysql-bin.000003
  -rw-rw mysql mysql——660 5月2日20:10 mysql-bin.000004
  -rw-rw mysql mysql——403 5月2日20:10 mysql-bin.000005
  -rw-rw mysql mysql——584 5月3日10:45 mysql-bin.000006
  -rw-rw mysql mysql——417 5月3日10:53 mysql-bin.000007
  -rw-rw mysql mysql——1973 5月3日13:28 mysql-bin.000008
  -rw-rw mysql mysql——2604 5月3日14:13)* * mysql-bin.000009 * *
  -rw-rw mysql mysql——369 5月3日13:28 mysql-bin.index
  -rw-r - r - 12222根根2017年4月13日mysql_rollback.py  
  欧洲

根据关键词查找binlog中的误操作sql,并输出欧洲前后30行(行数视具体情况而定,一定要输出语句对应的开始和提交部分)

  
 <代码> SZD-L0087668: gzz3306:大师比;mysqlbinlog——已- v - v base64-output=DECODE-ROWS——set-charset=utf8 mysql-bin。000009 | grep - c 30“欧洲”
  …
  开始/* ! */;
  # 2426
  # 180503 14:13:36服务器id 2482 end_log_pos CRC32 0 xe79b9612 Table_map:“db1”。“测试”映射到76号
  # 2482
  # 180503 14:13:36服务器id 2573 end_log_pos CRC32 0 xacd94a0b Update_rows:表id 76旗帜:STMT_END_F
  # # #更新“db1”。“测试”
  # # #,
  # # # @1=2/* INT元=0 nullable=1 is_null=0 */# # # @2=氨?* VARSTRING(30)元=30 nullable=1 is_null=0 */# # # @3=25元=0/* INT nullable=1 is_null=0 */# # # @4=⒐?* VARSTRING(30)元=30 nullable=1 is_null=0 */# # # @5=奥锥亍?* VARSTRING(30)元=30 nullable=1 is_null=0 */# # #设置
  # # # @1=2/* INT元=0 nullable=1 is_null=0 */# # # @2=氨?* VARSTRING(30)元=30 nullable=1 is_null=0 */# # # @3=25元=0/* INT nullable=1 is_null=0 */# # # @4=芭分蕖?* VARSTRING(30)元=30 nullable=1 is_null=0 */# # # @5=奥锥亍?* VARSTRING(30)元=30 nullable=1 is_null=0 */# 2573
  # 180503 14:13:36服务器id 2604 end_log_pos CRC32 0 x63b3d5fa Xid=118
  提交/* ! */;
  …

使用python脚本实现mysql误操作的flushback