原网址:http://bbs.csdn.net/topics/310068149

在网上看了好多关于mysqlbinlog的博文,但此篇写的非常详细易懂,在此总结,加入了自己在测试过程中遇到的问题。

==============================================================================

1.启动二进制日志记录,
要先在 vi /etc/my.cnf 文件打开

#log-bin = mysql-bin (此处等号后边名字可以自定义) 重启mysql

********有用的命令********

bin-log日志的存储位置:/usr/local/mysql/var/下

查看bin-log是否开启: Show variables like “%log%”;

新生成一个bin-log日志(即再发生的sql操作将会写入这个bin-log里): flush logs;

查看最后一个bin-log日志: show master status;

清空bin-log日志: reset master; (一般在数据库进行完一次完整的备份时就清空一次bin-log日志)

查看某个日志:mysqlbinlog --no-defaults mysql-bin.000001 [ | more] (此命令在命令行下执行 /usr/local/mysql/bin/)

以下是mysqlbinlog后跟的主要参数:

--stop-position="100"

--start-position="50"

--stop-date="2012-01-04 21:17:50"

--start-date="2012-01-04 19:10:10"


********/有用的命令********


2.然后在测试数据库里,创建一个表,并添加记录。

SQL code
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
mysql> create table test(id int auto_increment not null primary key ,
val int ,data varchar (20));
mysql> insert into test(val,data) values (10, 'liang' );
Query OK, 1 row affected (0.03 sec)
mysql> insert into test(val,data) values (20, 'jia' );
Query OK, 1 row affected (0.08 sec)
mysql> insert into test(val,data) values (30, 'hui' );
Query OK, 1 row affected (0.03 sec)
mysql> flush logs; --产生第二个日志文件
Query OK, 0 rows affected (0.09 sec)
mysql> insert into test(val,data) values (40, 'aaa' );
Query OK, 1 row affected (0.05 sec)
mysql> insert into test(val,data) values (50, 'bbb' );
Query OK, 1 row affected (0.03 sec)
mysql> insert into test(val,data) values (60, 'ccc' );
Query OK, 1 row affected (0.03 sec)
mysql> delete from test where id between 4 and 5; --删除记录
Query OK, 2 rows affected (0.05 sec)
mysql> insert into test(val,data) values (70, 'ddd' );
Query OK, 1 row affected (0.03 sec)
mysql> flush logs; --产生第三个文件文件
Query OK, 0 rows affected (0.11 sec)
mysql> insert into test(val,data) values (80, 'dddd' );
Query OK, 1 row affected (0.05 sec)
mysql> insert into test(val,data) values (90, 'eeee' );
Query OK, 1 row affected (0.03 sec)
drop table test; --删除表
Query OK, 0 row affected (0.05 sec)
OK,现在测试数据已经建好了,要的就是将test表的数据全部恢复出来。

先用mysqlbinlog工具将日志文件生成txt文件出来分析。

F:\Program Files\MySQL_Data\data\log>
mysqlbinlog liangck.000001 > G:\001.txt //此处的liangck日志名为作者自定义

F:\Program Files\MySQL_Data\data\log>
mysqlbinlog liangck.000002 > G:\002.txt

F:\Program Files\MySQL_Data\data\log>
mysqlbinlog liangck.000003 > G:\003.txt

注:linux下进入到/usr/local/mysql/bin下执行,如果导出命令未指定存储路径,默认在/bin目录下

[bin] mysqlbinlog ../var/bin-log.000001 > /tmp/log1.txt //指定bin-log的相对路径

通过这三个命令,可以在G盘下生成3个文件,
里面分别记录了日志文件的内容,
也就是用户操作的步骤。
因为我们需要重做第一个日志文件的所有操作,
所以这里只需要将第一个日志文件全恢复就行了。
F:\Program Files\MySQL_Data\data\log>
mysqlbinlog liangck.000001 | mysql -uroot –p123 [databasename] //可以指定数据库名

Ok,接着,我们需要分析的是第二个日志文件。为什么要分析它呢,
因为它中途执行了一个操作是DELETE,因为我们要做的是恢复全部数据,
也就是我们不希望去重做这个语句。所以在这里我们要想办法去绕开它。
我们先打开002.txt文件来分析一下。

# at 546
#1309082:15:17 server id 128  end_log_pos 654         Query   thread_id=19    exec_time=0     error_code=0
SET TIMESTAMP=1378577717/*!*/;
delete from gl_whos_online where full_name=2/*!*/;


在这个文件中,我们可以看到DELETE的操作的起始位置是546,终止位置是654.
那么我们只要重做第二个日志文件的开头到546的操作,然后再从654到末尾的操作,
我们就可以把数据给恢复回来,而不会DELETE数据。所以执行两个命令:


F:\Program Files\MySQL_Data\data\log>
mysqlbinlog liangck.000002 --stop-pos=875 | mysql -uroot -p

F:\Program Files\MySQL_Data\data\log>
mysqlbinlog liangck.000002 --start-pos=1008 | mysql -uroot -p mytest


OK,现在第二个日志文件的数据了。
第三个日志文件也是同理,只要找到DROP TABLE的位置,就可以了。


F:\Program Files\MySQL_Data\data\log>
mysqlbinlog liangck.000003 --stop-pos=574 | mysql -uroot –p


最终,全部数据都回来了。

====================================================================

总结:bin-log日志就是记录了操作数据库的语句,用bin-log恢复数据就是把曾执行的语句有选择的再执行一遍,执行需要的,像delete什么的就跳过。

我第一次按操作把表drop后执行binlog恢复总是报错:指定的表不存在,

因为我恢复的日志中没有创建表的语句,汗!