使用myflash工具恢复delete操作数据,myflash工具注意事项:
该工具注意事项

1.binlog格式必须为row,且binlog_row_image=full

2.仅支持5.6与5.7

3.只能回滚DML(增、删、改)

binlog格式确定为row:
mysql> show variables like '%binlog_format%';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
 
 
delete后恢复数据的过程:
 
    查看表的数据:
 mysql> select * from lbg;

+----+-----------+------+
| id | name      | ha   |
+----+-----------+------+
|  1 | 1,2,3,4,5 |    1 |
|  2 | 1,2,3,4,5 |    1 |
|  3 | 1,2,3,4,5 |    2 |
|  4 | 1,2,3,4,5 |    2 |
|  5 | 1,2,3,4,5 |    3 |
|  9 | 1,2,3,4,5 |    4 |
| 10 | 1,2,3,4,5 |    4 |
| 81 | 1,2,3,4,5 |    4 |
+----+-----------+------+
 
 
     delete两条数据:
 mysql> delete from lbg where id >=10;

Query OK, 2 rows affected (0.01 sec)
 
再查看:
mysql> select * from lbg;
+----+-----------+------+
| id | name      | ha   |
+----+-----------+------+
|  1 | 1,2,3,4,5 |    1 |
|  2 | 1,2,3,4,5 |    1 |
|  3 | 1,2,3,4,5 |    2 |
|  4 | 1,2,3,4,5 |    2 |
|  5 | 1,2,3,4,5 |    3 |
|  9 | 1,2,3,4,5 |    4 |
+----+-----------+------+
 
 
模拟数据库依旧在插入数据:
 mysql> insert into lbg values (77,'a',77);

Query OK, 1 row affected (0.01 sec)
 
mysql> insert into lbg values (88,'b',88);
Query OK, 1 row affected (0.01 sec)
 
mysql> insert into lbg values (99,'c',99);
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from lbg;
+----+-----------+------+
| id | name      | ha   |
+----+-----------+------+
|  1 | 1,2,3,4,5 |    1 |
|  2 | 1,2,3,4,5 |    1 |
|  3 | 1,2,3,4,5 |    2 |
|  4 | 1,2,3,4,5 |    2 |
|  5 | 1,2,3,4,5 |    3 |
|  9 | 1,2,3,4,5 |    4 |
| 77 | a         |   77 |
| 88 | b         |   88 |
| 99 | c         |   99 |
+----+-----------+------+
9 rows in set (0.00 sec)
 
 
开始找回删除的数据:
1.找到当前binlog.(注意也可能不是当前binlog)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000009 |     12178 |
| mysql-bin.000010 |       177 |
| mysql-bin.000011 |      3356 |
| mysql-bin.000012 |      1245 |
+------------------+-----------+
4 rows in set (0.00 sec)
发现当前binlog是000012.
 
 查找删除数据时的pos点:
 [root@master mysql3306]# mysqlbinlog mysql-bin.000012 -vv >/tmp/lbg.binlog

[root@master mysql3306]# vim /tmp/lbg.binlog 
找到这段:
#181108 13:28:58 server id 88083306  end_log_pos 416 CRC32 0x8e01100e   Delete_rows: table id 108 flags: STMT_END_F
BEGIN
;
# at 292
#181108 13:28:58 server id 88083306  end_log_pos 343 CRC32 0xed8c903f   Table_map: `test1`.`lbg` mapped to number 108
# at 343
#181108 13:28:58 server id 88083306  end_log_pos 416 CRC32 0x8e01100e   Delete_rows: table id 108 flags: STMT_END_F
 
BINLOG '
msnjWxNqC0AFMwAAAFcBAAAAAGwAAAAAAAEABXRlc3QxAANsYmcAAwMPAwJQAAY/kIzt
msnjWyBqC0AFSQAAAKABAAAAAGwAAAAAAAEAAgAD//gKAAAACTEsMiwzLDQsNQQAAAD4UQAAAAkx
LDIsMyw0LDUEAAAADhABjg==
';
### DELETE FROM `test1`.`lbg`
### WHERE
###   @1=10
###   @2='1,2,3,4,5'
###   @3=4
### DELETE FROM `test1`.`lbg`
### WHERE
###   @1=81
###   @2='1,2,3,4,5'
###   @3=4
# at 416
#181108 13:28:58 server id 88083306  end_log_pos 447 CRC32 0x06d673a3   Xid = 11
COMMIT;
# at 447
#181108 13:30:39 server id 88083306  end_log_pos 512 CRC32 0x4a005c6d   Anonymous_GTID  last_committed=1        sequence_number=2       rbr_only=yes
 
可知开始和截止pos是292和447.(分别是BEGIN和COMMIT后一行的数据)
 
 使用myflash反写sql:
 [root@master ~]# /soft/MyFlash-master/binary/flashback --start-position=292 --stop-position=447 --sqlTypes='DELETE' --binlogFileNames=/home/mysql3306/mysql3306/mysql-bin.000012

注意使用myflash的文件不能是之前导出的tmp/lbg.binlog,而是源binlog文件或者拷贝出来的binlog文件。
  
 查看myflash产生的文件:
 在当前目录会产生二进制文件 binlog_output_base.flashback:

[root@master ~]# ls
anaconda-ks.cfg  binlog_output_base.flashback  c.py  e.py  g.py  initial-setup-ks.cfg  j.py
a.py             b.py                          d.py  f.py  h.py  i.py                  test.py
查看该二进制文件:
[root@master ~]# mysqlbinlog binlog_output_base.flashback  -vv >/tmp/myflash.binlog
[root@master ~]# vim /tmp/myflash.binlog 
发现有insert数据了:
BINLOG '
msnjWxNqC0AFMwAAAK4AAAAAAGwAAAAAAAEABXRlc3QxAANsYmcAAwMPAwJQAAY/kIzt
msnjWx5qC0AFSQAAAPcAAAAAAGwAAAAAAAEAAgAD//gKAAAACTEsMiwzLDQsNQQAAAD4UQAAAAkx
LDIsMyw0LDUEAAAADhABjg==
';
### INSERT INTO `test1`.`lbg`
### SET
###   @1=10
###   @2='1,2,3,4,5'
###   @3=4
 
恢复数据:
 mysql> source /tmp/myflash.binlog

查看数据:
mysql> select * from lbg;
+----+-----------+------+
| id | name      | ha   |
+----+-----------+------+
|  1 | 1,2,3,4,5 |    1 |
|  2 | 1,2,3,4,5 |    1 |
|  3 | 1,2,3,4,5 |    2 |
|  4 | 1,2,3,4,5 |    2 |
|  5 | 1,2,3,4,5 |    3 |
|  9 | 1,2,3,4,5 |    4 |
| 10 | 1,2,3,4,5 |    4 |
| 77 | a         |   77 |
| 81 | 1,2,3,4,5 |    4 |
| 88 | b         |   88 |
| 99 | c         |   99 |
+----+-----------+------+
至此数据成功找回。
 
 
使用全备和binlog恢复truncate和drop操作的数据:
   基础表数据:
 
 mysql> select * from lbg;

+----+------+------+
| id | name | ha   |
+----+------+------+
|  1 | a    |    1 |
|  2 | b    |    2 |
|  3 | c    |    3 |
+----+------+------+
 
mysql> select * from test;
+----+------+------+
| id | name | ha   |
+----+------+------+
| 11 | aa   |   11 |
| 22 | bb   |   22 |
| 33 | cc   |   33 |
+----+------+------+
 
 全备操作:
 [root@master mysql3306]# mysqldump -uroot -proot -S /tmp/mysql3306.sock --master-data=2 --single-transaction -A > /tmp/all.sql
 
 
 模拟数据继续插入:
 mysql> insert into lbg values (4,'d',4);

Query OK, 1 row affected (0.00 sec)
 
mysql> insert into lbg values (5,'e',5);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values (44,'dd',44);
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into test values (55,'ee',55);
Query OK, 1 row affected (0.29 sec)
 
查询数据:
mysql> select * from lbg;
+----+------+------+
| id | name | ha   |
+----+------+------+
|  1 | a    |    1 |
|  2 | b    |    2 |
|  3 | c    |    3 |
|  4 | d    |    4 |
|  5 | e    |    5 |
+----+------+------+
 
mysql> select * from test;
+----+------+------+
| id | name | ha   |
+----+------+------+
| 11 | aa   |   11 |
| 22 | bb   |   22 |
| 33 | cc   |   33 |
| 44 | dd   |   44 |
| 55 | ee   |   55 |
+----+------+------+
 
 
开始truncate表lbg,drop表test:
 mysql> truncate table lbg;

Query OK, 0 rows affected (0.31 sec)
 
mysql> drop table test;
Query OK, 0 rows affected (0.30 sec)
 
 
继续其他操作:
mysql> insert into lbg values (111,'aaa',111);

Query OK, 1 row affected (0.10 sec)
 
mysql> insert into lbg values (222,'bbb',222);
Query OK, 1 row affected (0.01 sec)
 
 
发现误删数据和表开始找回:
   将全备和binlog拷贝到测试库:
[root@master mysql3306]# scp /home/mysql3306/mysql3306/mysql-bin.000012 root@192.168.88.9:/tmp

[root@master mysql3306]# scp /tmp/all.sql root@192.168.88.9:/tmp
 
 
   在测试库应用全备:
 mysql> source /tmp/all.sql

此时数据如下:
mysql> select * from lbg;
+----+------+------+
| id | name | ha   |
+----+------+------+
|  1 | a    |    1 |
|  2 | b    |    2 |
|  3 | c    |    3 |
+----+------+------+
3 rows in set (0.00 sec)
 
mysql> select * from test;
+----+------+------+
| id | name | ha   |
+----+------+------+
| 11 | aa   |   11 |
| 22 | bb   |   22 |
| 33 | cc   |   33 |
+----+------+------+
3 rows in set (0.00 sec)
 
通过备份文件里的pos点确定应用binlog开始的pos点:
[root@lbg2 ~]# vim /tmp/all.sql

在/tmp/all.sql里找到如下一行:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=4601;
可以确定pos点是4601
 
 
在binlog里找到truncate和drop时的pos点:
 [root@lbg2 ~]# mysqlbinlog  /tmp/mysql-bin.000012 -vv > /tmp/lbg.binlog

[root@lbg2 ~]# vim /tmp/lbg.binlog
摘要内容如下:
COMMIT;
# at 6203
#181108 13:28:58 server id 88083306  end_log_pos 6268 CRC32 0xe6be1409  Anonymous_GTID  last_committed=23       sequence_number=24      rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS';
# at 6268
#181108 13:28:58 server id 88083306  end_log_pos 6354 CRC32 0x685261c5  Query   thread_id=6     exec_time=7113  error_code=0
SET TIMESTAMP=1541654938;
truncate table lbg
;
# at 6354
#181108 13:28:58 server id 88083306  end_log_pos 6419 CRC32 0xfc171fb0  Anonymous_GTID  last_committed=24       sequence_number=25      rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS';
# at 6419
#181108 13:28:58 server id 88083306  end_log_pos 6538 CRC32 0x901f7138  Query   thread_id=6     exec_time=7131  error_code=0
SET TIMESTAMP=1541654938;
DROP TABLE `test`
;
# at 6538
 
确定truncate时的binlog的pos点大致为6203。
 
 
根据pos点使用binlog恢复数据:
 [root@lbg2 ~]# mysqlbinlog  /tmp/mysql-bin.000012 --start-position=4601 --stop-position=6203   -vv > /tmp/mysql.binlog

mysql> source /tmp/mysql.binlog
mysql> select * from lbg;
+----+------+------+
| id | name | ha   |
+----+------+------+
|  1 | a    |    1 |
|  2 | b    |    2 |
|  3 | c    |    3 |
|  4 | d    |    4 |
|  5 | e    |    5 |
+----+------+------+
5 rows in set (0.00 sec)
 
mysql> select * from test;
+----+------+------+
| id | name | ha   |
+----+------+------+
| 11 | aa   |   11 |
| 22 | bb   |   22 |
| 33 | cc   |   33 |
| 44 | dd   |   44 |
| 55 | ee   |   55 |
+----+------+------+
至此被删除的数据已恢复,最后可选择数据导出再导入到正式库里。
 
   另外还可使用全备加binlog追回delete操作误删的数据:
  1.先应用全备,并找到全备的pos点。

  2.在binlog中删除掉delete那段的乱码数据。
  3.根据全备的pos点应用已在第2步修改的binlog文件从而找回数据。
 

delete和truncate/drop恢复数据的过程的更多相关文章

  1. 转:SqlServer2008误操作数据(delete或者update)后恢复数据

    Sqlserver2008误操作数据(delete或者update)后恢复数据(转) 实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如 ...

  2. SqlServer2008误操作数据(delete或者update)后恢复数据

    实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如果没有加上where条件或者where条件不合理,那么导致的结果可想而知,如果操作的又 ...

  3. delete,truncate ,drop区别

    use [database_name]go delete from table_nameTest  where FCRTime<(Select CONVERT(varchar(100),DATE ...

  4. 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的差别,sql文件导入

     1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date ...

  5. Ubantu 使用extundelete恢复数据

    所以在维护系统的时候,要慎之又慎,但是有时难免会出现数据被误删除的情况,在这个时候改如何快速.有效地恢复数据呢?本文我们就来介绍一下Linux系统下常用的几个数据恢复工具. 一.如何使用“rm -rf ...

  6. xtrabackup备份和恢复数据脚本

    该脚本用于备份和恢复MySQL数据库. 总结xtrabackup备份的两个坑: 1.在恢复数据的过程中,如果中途出错,则数据将会被破坏,后续很难再恢复. 2.在恢复过程中,如果版本过低,在准备全量数据 ...

  7. 数据库中drop、delete与truncate的区别

    数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...

  8. delete、truncate、drop

    DELETE DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger:每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进 ...

  9. oracle中drop、delete和truncate的区别

    oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...

随机推荐

  1. 微信聊天记录导出为csv,并生成词云图

    微信聊天记录生成特定图片图云 首先贴上github地址 https://github.com/ghdefe/WechatRecordToWordCloud 来个效果图 提取聊天记录到csv参考教程 h ...

  2. 网络最大流Dinic

    1.什么是网络最大流 形象的来说,网络最大流其实就是这样一个生活化的问题:现在有一个由许多水管组成的水流系统,每一根管道都有自己的最大通过水流限制(流量),超过这个限制水管会爆(你麻麻就会来找你喝茶q ...

  3. python 利用jieba库词频统计

    1 #统计<三国志>里人物的出现次数 2 3 import jieba 4 text = open('threekingdoms.txt','r',encoding='utf-8').re ...

  4. spring boot:用rocketmq发送延时消息用来取消订单(spring boot 2.3.3)

    一,为什么要用延时消息来取消订单? 1,为什么要取消订单 在电商的下单过程中,需要在生成订单时扣减库存, 但有可能发生这种情况:用户下了单,临时改变主意不再支付, 则订单不能无限期的保留,因为还要把占 ...

  5. 如何将Nginx注册为系统服务,开机自启动。

    亲测有效! 一般程序员在实际工作中,除了敲代码,很少有机会实际接触操作其它东西,例如服务器环境搭建,项目部署等等,不是领导信任或项目组核心成员,应该是没有机会实际接触的,只能通过网上资料稍微了解一下. ...

  6. Bitmap缩放(二)

    先得到位图宽高不用加载位图,然后按ImageView比例缩放,得到缩放的尺寸进行压缩并加载位图.inSampleSize是缩放多少倍,小于1默认是1,通过调节其inSampleSize参数,比如调节为 ...

  7. Messenger实现进程间通信(IPC)

    messenger内部也是实现aidl通信,所以可以看做一个轻量级aidl,但相对比较简单.首先开启一个服务并实现一个Handler用来处理消息,在onbind方法中返回IBinder对象,通过Ser ...

  8. openresty 的小白记录

    openresty提供了一个快速访问数据库,快速响应的功能.基于lua + redis,我们可以做到快速响应,达到10k级连接的处理能力. openresty 的小白记录 好的学习资料,从lua到op ...

  9. Kubernetes Pod驱逐策略

    Kubelet 能够主动监测和防止计算资源的全面短缺. 在资源短缺的情况下,kubelet 可以主动地结束一个或多个 Pod 以回收短缺的资源. 当 kubelet 结束一个 Pod 时,它将终止 P ...

  10. TypeScript魔法堂:函数类型声明其实很复杂

    前言 江湖有传"动态类型一时爽,代码重构火葬场",由于动态类型语言在开发时不受数据类型的约束,因此非常适合在项目原型阶段和初期进行快速迭代开发使用,这意味着项目未来将通过重写而非重 ...