原网址: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.然后在测试数据库里,创建一个表,并添加记录。
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)
|
注: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 �Cp123 [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 �Cp
最终,全部数据都回来了。
====================================================================
总结:bin-log日志就是记录了操作数据库的语句,用bin-log恢复数据就是把曾执行的语句有选择的再执行一遍,执行需要的,像delete什么的就跳过。
我第一次按操作把表drop后执行binlog恢复总是报错:指定的表不存在,
因为我恢复的日志中没有创建表的语句,汗!