返回mysql二进......登陆

mysql二进制日志恢复数据

阿神2016-11-09 14:33:06595

1、开启mysql的二进制日志

  在mysql的配置文件my.ini中添加:

  log-bin=mysql-bin(这个名称可以随便取,英文,不知道中文可不可以,没试过)

2、重启mysql

  重启后,假如在mysql的存储数据的目录中出现一下文件,则已经二进制日志已经开启

6.png

  mysql-bin.000001是mysql的二进制日志文件,不可以直接查看,可以通过导出数据查看,导出数据的语句为

7.png

  解释一下:红色下划线的是mysql二进制mysql-bin.000001文件所在的目录,要进入这里执行后面的语句,这是我的情况

  mysqlbinlog的语法:

  mysqlbinlog 二进制日志文件 > 目标文件

  要导出到哪里自己决定,但一定先要有这个目录,导出的文件则mysql会自动生成,所以不必新建

3、查看二进制日志状态

  show master status;

  +------------------+----------+--------------+------------------+

  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

  +------------------+----------+--------------+------------------+

  | mysql-bin.000001 | 349 | | |

  +------------------+----------+--------------+------------------+

  1 row in set (0.00 sec)

4、测试两个例子

  第一个:

1

2

3

4

5

   create table bin_test(

    id int,

    name char(32)

  )engine myisam charset utf8;

 drop table bin_test;

  注意,下面的语句前面已经说过,必须开启另一个cmd,然后进入mysql-bin.000001的二进制文件的目录中执行

  E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 >D:/binlog/binlog.txt

  查看binlog.txt文件

8.png

    E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 --stop_pos=239 | mysql -uroot -p

  Enter password: ****

  解释一下:--stop_pos=239是上面create语句的位置,mysql二进制恢复数据的原理就是让mysql重新执行二进制里面的sql语句,我们执行限制它的执行位置,让它在哪个位置停止不往下执行

  第二个例子:

  因为刚才的bin_test已经恢复,所以向它插入数据

1

2

3

4

5

6

7

8

9

10

mysql> select * from bin_test;

Empty set (0.00 sec)

mysql> insert into bin_test values(1,'hello');

Query OK, 1 row affected (0.08 sec)

mysql> insert into bin_test values(default,'hi');

Query OK, 1 row affected (0.00 sec)

mysql> insert into bin_test values(default,'guangzhou');

Query OK, 1 row affected (0.00 sec)

mysql> insert into bin_test values(default,'lonely');

Query OK, 1 row affected (0.00 sec)

  mysql> select * from bin_test;

  +------+-----------+

  | id | name |

  +------+-----------+

  | 1 | hello |

  | NULL | hi |

  | NULL | guangzhou |

  | NULL | lonely |

  +------+-----------+

1

2

3

4

mysql> delete from bin_test;

Query OK, 4 rows affected (0.08 sec)

mysql> select * from bin_test;

Empty set (0.00 sec)

查看二进制日志

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

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

create table bin_test(id int,name char(32))engine myisam charset utf8

/*!*/;

# at 481

#160917 15:27:45 server id 1 end_log_pos 549 Query  thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097265/*!*/;

BEGIN

/*!*/;

# at 549

#160917 15:27:45 server id 1 end_log_pos 650 Query  thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097265/*!*/;

insert into bin_test values(1,'hello')

/*!*/;

# at 650

#160917 15:27:45 server id 1 end_log_pos 719 Query  thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097265/*!*/;

COMMIT

/*!*/;

# at 719

#160917 15:28:00 server id 1 end_log_pos 787 Query  thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097280/*!*/;

BEGIN

/*!*/;

# at 787

#160917 15:28:00 server id 1 end_log_pos 891 Query  thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097280/*!*/;

insert into bin_test values(default,'hi')

/*!*/;

# at 891

#160917 15:28:00 server id 1 end_log_pos 960 Query  thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097280/*!*/;

COMMIT

/*!*/;

# at 960

#160917 15:28:09 server id 1 end_log_pos 1028 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097289/*!*/;

BEGIN

/*!*/;

# at 1028

#160917 15:28:09 server id 1 end_log_pos 1139 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097289/*!*/;

insert into bin_test values(default,'guangzhou')

/*!*/;

# at 1139

#160917 15:28:09 server id 1 end_log_pos 1208 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097289/*!*/;

COMMIT

/*!*/;

# at 1208

#160917 15:28:17 server id 1 end_log_pos 1276 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097297/*!*/;

BEGIN

/*!*/;

# at 1276

#160917 15:28:17 server id 1 end_log_pos 1384 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097297/*!*/;

insert into bin_test values(default,'lonely')

/*!*/;

# at 1384

#160917 15:28:17 server id 1 end_log_pos 1453 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097297/*!*/;

COMMIT

/*!*/;

# at 1453

#160917 15:29:11 server id 1 end_log_pos 1521 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097351/*!*/;

BEGIN

/*!*/;

# at 1521

#160917 15:29:11 server id 1 end_log_pos 1604 Query thread_id=2 exec_time=0 error_code=0

SET TIMESTAMP=1474097351/*!*/;

delete from bin_test

另一个cmd窗口执行下面的语句

9.png

上面的at 1521的对应点:

11.png

不过这个时候恢复数据报错,那是因为我们再恢复数据的时候给了一个终点,没有给起点,所以mysql会从开始一直回复到终点的地方,而二进制文件中已经存在

这个可以对比上面二进制文件的内容

而此刻mysql数据库中已经存在bin_test数据表了,这个是我们前面恢复的,所以sql会报这个错误:

10.png

 针对这个问题,我们可以给它设置一个恢复数据的启点来解决:

E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 --start_pos=549 --stop_pos=1521 | mysql -uroot -p

Enter password: ****

E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>

这里的起点位置就是第一次开始插入sql语句的位置,可以对比前面的二进制日志的时间点,这里就不再截图,这里没有报错表示已经成功了


最新手记推荐

• 用composer安装thinkphp框架的步骤• 省市区接口说明• 用thinkphp,后台新增栏目• 管理员添加编辑删除• 管理员添加编辑删除

全部回复(0)我要回复

暂无评论~
  • 取消回复发送