mysqlbinlog
工具的使用
,
大家可以看
MySQL
的帮助手册。里面有详细的用,在这个例子中,重点是
--start-position
参数和
--stop-position
参数的使用。
·
--start-position=N
从二进制日志中第
1
个位置等于
N
参量时的事件开始读。
·
--stop-position=N
从二进制日志中第
1
个位置等于和大于
N
参量时的事件起停止读。
OK
,现在开始,要启动二进制日志记录,要先在
my.cnf / my.ini
文件的
mysqld
里添加
log-bin=
日志名
在这里,偶是的设置是
log-bin=liangck
然后再启动
mysql
服务,因为偶是用
windows
系统,所以执行
net start mysql
命令即可。
然后在一测试数据库里,创建一个表,并添加记录。
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)
mysql>
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
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
通过这三个命令,可以在
G
盘下生成
3
个文件,里面分别记录了日志文件的内容,也就是用户操作的步骤。
因为我们需要重做第一个日志文件的所有操作,所以这里只需要将第一个日志文件全恢复就行了。
F:\Program Files\MySQL_Data\data\log>mysqlbinlog liangck.000001 | mysql -uroot –p
Ok,
接着,我们需要分析的是第二个日志文件。为什么要分析它呢,因为它中途执行了一个操作是
DELETE
,因为我们要做的是恢复全部数据,也就是我们不希望去重做这个语句。所以在这里我们要想办法去绕开它。
我们先打开
002.txt
文件来分析一下。
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#090427 15:27:56 server id 1
end_log_pos 106 Start: binlog v 4, server v 5.1.32-community-log created 090427 15:27:56
BINLOG '
fF71SQ8BAAAAZgAAAGoAAAAAAAQANS4xLjMyLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
'/*!*/;
# at 106
#090427 15:28:37 server id 1
end_log_pos 176 Query
thread_id=1
exec_time=0
error_code=0
use mytest/*!*/;
SET TIMESTAMP=1240817317/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1344274432/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C gbk *//*!*/;
SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=28/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 176
#090427 15:28:37 server id 1
end_log_pos 204 Intvar
SET INSERT_ID=4/*!*/;
# at 204
#090427 15:28:37 server id 1
end_log_pos 312 Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817317/*!*/;
insert into test(val,data) values(40,'aaa')
/*!*/;
# at 312
#090427 15:28:37 server id 1
end_log_pos 339 Xid = 12
COMMIT/*!*/;
# at 339
#090427 15:28:46 server id 1
end_log_pos 409 Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817326/*!*/;
BEGIN
/*!*/;
# at 409
#090427 15:28:46 server id 1
end_log_pos 437 Intvar
SET INSERT_ID=5/*!*/;
# at 437
#090427 15:28:46 server id 1
end_log_pos 545 Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817326/*!*/;
insert into test(val,data) values(50,'bbb')
/*!*/;
# at 545
#090427 15:28:46 server id 1
end_log_pos 572 Xid = 13
COMMIT/*!*/;
# at 572
#090427 15:29:35 server id 1
end_log_pos 642 Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817375/*!*/;
BEGIN
/*!*/;
# at 642
#090427 15:29:35 server id 1
end_log_pos 670 Intvar
SET INSERT_ID=6/*!*/;
# at 670
#090427 15:29:35 server id 1
end_log_pos 778 Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817375/*!*/;
insert into test(val,data) values(60,'ccc')
/*!*/;
# at 778
#090427 15:29:35 server id 1
end_log_pos 805 Xid = 14
COMMIT/*!*/;
# at 805
#090427 15:30:21 server id 1
end_log_pos 875 Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817421/*!*/;
BEGIN
/*!*/;
# at 875
#090427 15:30:21 server id 1
end_log_pos 981 Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817421/*!*/;
delete from test where id between 4 and 5
/*!*/;
# at 981
#090427 15:30:21 server id 1
end_log_pos 1008
Xid = 15
COMMIT/*!*/;
# at 1008
#090427 15:30:34 server id 1
end_log_pos 1078
Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817434/*!*/;
BEGIN
/*!*/;
# at 1078
#090427 15:30:34 server id 1
end_log_pos 1106
Intvar
SET INSERT_ID=7/*!*/;
# at 1106
#090427 15:30:34 server id 1
end_log_pos 1214
Query
thread_id=1
exec_time=0
error_code=0
SET TIMESTAMP=1240817434/*!*/;
insert into test(val,data) values(70,'ddd')
/*!*/;
# at 1214
#090427 15:30:34 server id 1
end_log_pos 1241
Xid = 16
COMMIT/*!*/;
# at 1241
#090427 15:30:41 server id 1
end_log_pos 1282
Rotate to liangck.000003
pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
―――――――――――――――――――――――――――――――――――――
在这个文件中,我们可以看到
DELETE
的操作的起始位置是
875
,终止位置是
1008.
那么我们只要重做第二个日志文件的开头到
875
的操作,然后再从
1008
到末尾的操作,我们就可以把数据给恢复回来,而不会
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
现在我们再查一下数据看看
:
mysql> select * from test;
+----+------+-------+
| id | val
| data
|
+----+------+-------+
|
1 |
10 | liang |
|
2 |
20 | jia
|
|
3 |
30 | hui
|
|
4 |
40 | aaa
|
|
5 |
50 | bbb
|
|
6 |
60 | ccc
|
|
7 |
70 | ddd
|
|
8 |
80 | dddd
|
|
9 |
90 | eeee
|
+----+------+-------+
9 rows in set (0.00 sec)
可以看到,全部数据都回来了。
相关推荐
个人整理,mysql binlog 日志恢复
本篇文章主要介绍了详解如何通过Mysql的二进制日志恢复数据库数据,具有一定的参考价值,有兴趣的可以了解一下。
mysql二进制日志文件用来记录所有用户对数据库操作,即记录用户对数据库操作的sql语句。如果有此文件,当数据库发生意外时,可以通过此文件查看到用户在此文件记录的时间段内用户所做的操作,再和数据库备份配合...
从MySQL ROW二进制日志还原更新。
二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。 2。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。 不良影响: 运行服务器时若启用二进制...
例如,在创建新表或更新现有表上的数据时,这些事件将存储在mysql binlog中,也就是MySQL数据库的二进制日志。 二进制日志在MySQL复制中非常有用,主服务器将数据从二进制日志发送到远程服务器。 当您在MySQL中执行...
二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。 binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。不会...
MySQL日志和数据恢复,错误日志,二进制日志,查询日志,数据恢复。
1、利用Mysqldump+二进制日志实现备份 2、利用LVM快照+二进制日志实现备份 3、使用Xtrabackup备份 一:实验环境介绍: 系统介绍:CentOS6.4_X64 数据库版本:mysql-5.5.33 二:基于Mysqldump命令实现备份恢复 2.1、...
mysql二进制日志记录了数据库所有变更类的操作日志主要有2个作用: MySQL主从配置 数据恢复 参数介绍 server_id=3 log_bin=/data/binlog/mysql-bin: /data/binlog:提前定制好的目录,而且要有mysql.mysql的权限 ...
可以使用mysqlbin命令查看二进制日志的内容。 binlog 的作用 用于数据库的主从复制及数据的增量恢复。 MySQL binlog格式 binlog的格式也有三种:STATEMENT、ROW、MIXED 。 1、STATMENT模式:基于SQL语句的复制...
增量备份:使用二进制日志增量备份,使用mysqlbinlog 命令恢复二进制日志。SQL 语法备份及恢复。拷贝数据文件备份(对Innodb 还需拷贝日志文件)。MyISAM 表的检查与修复(另见《MySql 存储引擎》)。Innodb 表的...
MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。 ————————...
使用事务日志:MySQL 的二进制日志(binlog)记录了数据库的所有变更操作,包括删除操作。你可以通过分析这些日志,找到误删数据的时间点和具体操作,然后通过回滚或者手动重放这些操作来进行数据恢复。 数据恢复...
主要介绍了MySQL中Binary Log二进制日志文件的基本操作小结,包括利用二进制日志恢复数据的方法,需要的朋友可以参考下
要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的...
要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的...
对 MySQL Cluster 集群数据库误操作的一些预防措施和误操作后进行数据恢复的三种方案:通过解析二进制日志生成逆向操作脚本进行恢复、通过全库备份及二进制日志进行恢复、通过延迟备库及二进制日志进行恢复,并给出...
目前MySQL 支持的免费备份工具有:mysqldump、mysqlhotcopy,还可以用 SQL 语法进行备份:BACKUP TABLE 或者 SELECT INTO OUTFILE,又或者备份二进制日志,还可以是直接拷贝数据文件和相关的配置文件。MyISAM 表是...