delete和truncate/drop恢复数据的过程
该工具注意事项
1.binlog格式必须为row,且binlog_row_image=full 2.仅支持5.6与5.7 3.只能回滚DML(增、删、改) |
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (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 |
| 10 | 1,2,3,4,5 | 4 |
| 81 | 1,2,3,4,5 | 4 |
+----+-----------+------+
|
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.
|
[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后一行的数据)
|
[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文件。
|
在当前目录会产生二进制文件 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 |
+----+-----------+------+
至此数据成功找回。
|
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 |
+----+------+------+
|
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)
|
[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)
|
[root@lbg2 ~]# vim /tmp/all.sql
在/tmp/all.sql里找到如下一行:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=4601;
可以确定pos点是4601
|
[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。
|
[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 |
+----+------+------+
至此被删除的数据已恢复,最后可选择数据导出再导入到正式库里。
|
1.先应用全备,并找到全备的pos点。
2.在binlog中删除掉delete那段的乱码数据。
3.根据全备的pos点应用已在第2步修改的binlog文件从而找回数据。
|
delete和truncate/drop恢复数据的过程的更多相关文章
- 转:SqlServer2008误操作数据(delete或者update)后恢复数据
Sqlserver2008误操作数据(delete或者update)后恢复数据(转) 实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如 ...
- SqlServer2008误操作数据(delete或者update)后恢复数据
实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如果没有加上where条件或者where条件不合理,那么导致的结果可想而知,如果操作的又 ...
- delete,truncate ,drop区别
use [database_name]go delete from table_nameTest where FCRTime<(Select CONVERT(varchar(100),DATE ...
- 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的差别,sql文件导入
1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date ...
- Ubantu 使用extundelete恢复数据
所以在维护系统的时候,要慎之又慎,但是有时难免会出现数据被误删除的情况,在这个时候改如何快速.有效地恢复数据呢?本文我们就来介绍一下Linux系统下常用的几个数据恢复工具. 一.如何使用“rm -rf ...
- xtrabackup备份和恢复数据脚本
该脚本用于备份和恢复MySQL数据库. 总结xtrabackup备份的两个坑: 1.在恢复数据的过程中,如果中途出错,则数据将会被破坏,后续很难再恢复. 2.在恢复过程中,如果版本过低,在准备全量数据 ...
- 数据库中drop、delete与truncate的区别
数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...
- delete、truncate、drop
DELETE DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger:每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进 ...
- oracle中drop、delete和truncate的区别
oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
随机推荐
- 【二分】CF Round #587 (Div. 3)E2 Numerical Sequence (hard version)
题目大意 有一个无限长的数字序列,其组成为1 1 2 1 2 3 1.......1 2 ... n...,即重复的1~1,1~2....1~n,给你一个\(k\),求第\(k(k<=10^{1 ...
- Java改写重构第2版第一个示例
写在前面 <重构:改善既有代码的设计>是一本经典的软件工程必读书籍.作者马丁·福勒强调重构技术是以微小的步伐修改程序. 但是,从国内的情况来而论,"重构"的概念表里分离 ...
- nginx安全:配置网站图片防盗链
一,为什么要做防盗链? 1,什么是盗链? 比如某人有一个A网站, 他不愿自己存储图片,(因为磁盘和带宽都有成本) 就在自己A网站的页面上直接插入B网站的图片, 从而为自己吸引流量,这就是盗链 2,为什 ...
- 经典剪枝算法的例题——Sticks详细注释版
这题听说是道十分经典的剪枝算的题目,不要问我剪枝是什么,我也不知道,反正我只知道用到了深度搜索 我参考了好多资料才悟懂,然后我发现网上的那些大神原理讲的很明白,但代码没多少注释,看的很懵X,于是我抄起 ...
- python提取视频第一帧图片
一.实现代码 # -*- coding: utf-8 -*- import cv2 from PIL import Image from io import BytesIO def tryTime(m ...
- Redis---03Redis事务
一.Redis事务 1.简述: Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断 2.作用: 主要作用就是串联多 ...
- 【问题记录】—.NetCore 编译问题
最近在协助验证Jenkins自动编译发布时,对一些.Net Core编译问题进行了解决:特记录一下 一.编译生成netcoreapp目录问题 问题现象 .net core项目编译输出目录总是包含在[n ...
- Luogu P3846 [TJOI2007] 可爱的质数/【模板】BSGS
题意 给定 \(y,z,p\),求最小的正整数 \(x\) 满足 \(y^x\equiv z\bmod p\),保证 \(p\) 是质数. \(\texttt{Data Range:}2\leq y, ...
- ORB-SLAM3 Initializer.cpp函数解读
作者: Liam 点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 构造函数 Initializer::Initializer(const Frame ...
- NB-IoT的eDRX模式主要目的是什么
传统的2.56秒寻呼间隔对UE的电量消耗较大,NB-IoT的eDRX模式主要目的就是支能够持更长周期的寻呼监听,从而达到省电的目的.而在下行数据发送频率小时,通过核心网和用户终端的协商配合,用户终端调 ...