mysql利用mysqlbinlog命令恢复误删除数据的实现

这篇文章主要介绍了mysql利用mysqlbinlog命令恢复误删除数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

实验环境:

mysql 5.7.22

开启二进志日志

日志格式mixed

实验过程:

1、执行:flush logs;

master-bin.000014 文件就是新生成的文件

mysql利用mysqlbinlog命令恢复误删除数据的实现

mysql利用mysqlbinlog命令恢复误删除数据的实现

刷新日志是为了实验内容更直观,更容易观察到整个实验过程的内容。

我看到网上许多文章有在用rest master;而未说明此命令的严重性

这条命令会删除所有日志文件,并将文件名和记录点进行重置归零,99%的情况下是用不到这条命令的

删除日志可以用purge master logs…这样保险一点

2、新日志文件已经生成,先观察一下内容,有几个点需要了解

mysql利用mysqlbinlog命令恢复误删除数据的实现

查看二进日日志文件命令:mysqlbinlog master-bin.000014

?

1

2

# at 4

#180903 16:19:12 server id 1 end_log_pos 123 crc32 0xe03659b3 start: binlog v 4, server v 5.7.22-log created 180903 16:19:12

先看上边两个箭头:

  • # at 4(事件开始点)
  • #180903 16:19:12 (代表的是时间)
  • server id 1(主备复制时需要为每个mysql数据库指定唯一的server id,我的未配置,默认是1)
  • end_log_pos 123(事件结束点)

再看下边两个箭头:

  • # at 123(事件开始点,和上边的事件结束点是对应的)
  • end_log_pos 154(事件结束点)
  • at 4 和 at 123之间的内容就是事件内容

3、模拟业务场景,建表,插入数据,最后将某个表删除;为了真实,我建了两个库,同时向不同的库写入内容,最后将其中一个库中的某个表删除。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

mysql> flush logs;

query ok, 0 rows affected (0.01 sec)

mysql> create database t1;

query ok, 1 row affected (0.03 sec)

mysql> create database t2;

query ok, 1 row affected (0.00 sec)

mysql> use t1;

database changed

mysql> create table t1 (id int);

query ok, 0 rows affected (0.03 sec)

mysql> use t2;

database changed

mysql> create table t2 (id int);

query ok, 0 rows affected (0.03 sec)

mysql> insert into t2 values (3);

query ok, 1 row affected (0.01 sec)

mysql> insert into t2 values (4);

query ok, 1 row affected (0.01 sec)

mysql> use t1;

database changed

mysql> insert into t1 values (1);

query ok, 1 row affected (0.01 sec)

mysql> insert into t1 values (2);

query ok, 1 row affected (0.01 sec)

mysql> use t2;

database changed

mysql> insert into t2 values(20);

query ok, 1 row affected (0.01 sec)

mysql> use t1;

database changed

mysql> insert into t1 values(10);

query ok, 1 row affected (0.01 sec)

mysql> drop table t1;

query ok, 0 rows affected (0.02 sec)

mysql> use t2;

database changed

mysql> insert into t2 values(222);

query ok, 1 row affected (0.01 sec)

mysql>

建立t1、t2库,建立t1、t2表。

向t1插入数据:1、2、10

向t2插入数据:3、4、20、222

模拟场景,删除t1表,t2库t2表业务还在继续运行

现在将要通过日志将t1表进行恢复。

首先要先找到那个删除命令的日志点:

?

1

mysqlbinlog master-bin.000014|grep -5a "drop table"

mysql利用mysqlbinlog命令恢复误删除数据的实现

看到#at 2439 (记下这个数字)

在这个事件点执行的drop table操作。

由于日志文件内不只有t1库的日志,还有t2库的日志,一会只取t1数据库的日志

而且还只取2439日志点之前的日志,再进行重新应用

如果把2439的日志取的话,再应用时数据库会重新建库建表,插数据, 还会执行这条删表语句。

mysqlbinlog -d t1 –stop-position=2439 master-bin.000014>test.sql(执行这条语句竟然报错了)

warning: the option –database has been used. it may filter parts of transactions, but will include the gtids in any case. if you want to exclude or include transactions, you should use the options –exclude-gtids or –include-gtids, respectively, instead.
暂时弄不清楚原因,百度了下修改成:

?

1

mysqlbinlog master-bin.000014 -d t1 –skip-gtids –stop-position=2439>test.sql

mysql利用mysqlbinlog命令恢复误删除数据的实现

-d:参数是指定某个数据库日志

命令意思是将master-bin.000014日志文件内的t1数据库日志,事件点2439之前的日志,输出到test.sql

?

1

# tail test.sql

看看文件最后几行

mysql利用mysqlbinlog命令恢复误删除数据的实现

登录数据库:

?

1

2

3

4

mysql> use t1;

database changed

mysql> source test.sql

中间报错了一次,因为里边包含建库t1语句。

再查看表内容

mysql利用mysqlbinlog命令恢复误删除数据的实现

这样数据就回来了。

到此这篇关于mysql利用mysqlbinlog命令恢复误删除数据的实现的文章就介绍到这了,更多相关mysql mysqlbinlog恢复误删除内容请搜索钦钦技术栈以前的文章或继续浏览下面的相关文章希望大家以后多多支持钦钦技术栈!

原文链接:https://blog.csdn.net/chaigang/article/details/82350399

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/8465/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022-08-03 1:12:46
下一篇 2022-08-03 1:12:56

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!