使用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%';
+---------------+-------+ |
delete后恢复数据的过程:
查看表的数据:
mysql> select * from lbg;
+----+-----------+------+ |
delete两条数据:
mysql> delete from lbg where id >=10;
Query OK, 2 rows affected (0.01 sec) mysql> select * from lbg; |
模拟数据库依旧在插入数据:
mysql> insert into lbg values (77,'a',77);
Query OK, 1 row affected (0.01 sec)
mysql> select * from lbg; |
开始找回删除的数据:
1.找到当前binlog.(注意也可能不是当前binlog)
mysql> show binary logs; 发现当前binlog是000012. |
查找删除数据时的pos点:
[root@master mysql3306]# mysqlbinlog mysql-bin.000012 -vv >/tmp/lbg.binlog
[root@master mysql3306]# vim /tmp/lbg.binlog BEGIN ### DELETE FROM `test1`.`lbg` # at 447 |
使用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 查看该二进制文件: BINLOG ' |
恢复数据:
mysql> source /tmp/myflash.binlog
查看数据: mysql> select * from lbg; 至此数据成功找回。 |
使用全备和binlog恢复truncate和drop操作的数据:
基础表数据:
mysql> select * from lbg;
+----+------+------+
mysql> select * from test; |
全备操作:
[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); mysql> insert into test values (44,'dd',44); mysql> select * from lbg;
mysql> select * from test;
|
开始truncate表lbg,drop表test:
mysql> truncate table lbg;
Query OK, 0 rows affected (0.31 sec) |
继续其他操作:
mysql> insert into lbg values (111,'aaa',111);
Query OK, 1 row affected (0.10 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; |
通过备份文件里的pos点确定应用binlog开始的pos点:
[root@lbg2 ~]# vim /tmp/all.sql
在/tmp/all.sql里找到如下一行: |
在binlog里找到truncate和drop时的pos点:
[root@lbg2 ~]# mysqlbinlog /tmp/mysql-bin.000012 -vv > /tmp/lbg.binlog
[root@lbg2 ~]# vim /tmp/lbg.binlog COMMIT; # at 6268 SET TIMESTAMP=1541654938; SET TIMESTAMP=1541654938; |
根据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; 至此被删除的数据已恢复,最后可选择数据导出再导入到正式库里。 |
另外还可使用全备加binlog追回delete操作误删的数据:
1.先应用全备,并找到全备的pos点。
2.在binlog中删除掉delete那段的乱码数据。 |