weixin_42298206
2008-11-11 08:03
浏览 1.9k
已采纳

mysqlbinlog 怎么将数据库恢复到指定的时间?

在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?
[b]问题补充:[/b]
在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?

================================
嗯,谢谢楼上几位的回答,目前已经不报告错误了。

但是执行完毕以后,数据库中的数据并不会恢复到那个时间点,使用了
mysqlbinlog --stop-position="n" 这样的参数也不行。

[b]问题补充:[/b]
在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?
[b]问题补充:[/b]
在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?

================================
嗯,谢谢楼上几位的回答,目前已经不报告错误了。

但是执行完毕以后,数据库中的数据并不会恢复到那个时间点,使用了
mysqlbinlog --stop-position="n" 这样的参数也不行。

应该是事务性的数据库

CREATE TABLE demotable (
id INTEGER(8) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) COLLATE latin1_swedish_ci DEFAULT '',
PRIMARY KEY (id)
)ENGINE=InnoDB
AUTO_INCREMENT=19 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 4096 kB';

这里是测试的DDL,大家看看是不是用的InnoDB作为引擎的。

[b]问题补充:[/b]
在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?
[b]问题补充:[/b]
在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?

================================
嗯,谢谢楼上几位的回答,目前已经不报告错误了。

但是执行完毕以后,数据库中的数据并不会恢复到那个时间点,使用了
mysqlbinlog --stop-position="n" 这样的参数也不行。

[b]问题补充:[/b]
在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?
[b]问题补充:[/b]
在windows 2003下安装了wamp server,其中的mysql开启了二进制日志功能,请问怎么样利用mysqlbinlog将数据恢复到指定的时间。

目前用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 |mysql -uroot -p 会报告错误。

请问确切的使用方式是什么?

================================
嗯,谢谢楼上几位的回答,目前已经不报告错误了。

但是执行完毕以后,数据库中的数据并不会恢复到那个时间点,使用了
mysqlbinlog --stop-position="n" 这样的参数也不行。

应该是事务性的数据库

CREATE TABLE demotable (
id INTEGER(8) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) COLLATE latin1_swedish_ci DEFAULT '',
PRIMARY KEY (id)
)ENGINE=InnoDB
AUTO_INCREMENT=19 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 4096 kB';

这里是测试的DDL,大家看看是不是用的InnoDB作为引擎的。

应该是有的,因为我也使用了--stop-position="n"这样的参数来恢复,而参数中的n就是根据show binlog events来查看的.

[b]问题补充:[/b]

执行:
mysqlbinlog C:/logs/demolog.000001

at 3473

#081111 9:02:49 server id 1 end_log_pos 3501 Intvar
SET INSERT_ID=16/*!*/;

at 3501

#081111 9:02:49 server id 1 end_log_pos 3619 Query thread_id=10 exec_tim
e=0 error_code=0
SET TIMESTAMP=1226365369/*!*/;
[color=red]INSERT INTO demotable (id,name) VALUES (NULL,'p')/*!*/;

at 3619[/color]

#081111 9:02:49 server id 1 end_log_pos 3646 Xid = 139
COMMIT/*!*/;

at 3646

#081111 9:02:51 server id 1 end_log_pos 3674 Intvar
SET INSERT_ID=17/*!*/;

at 3674

#081111 9:02:51 server id 1 end_log_pos 3792 Query thread_id=10 exec_tim
e=0 error_code=0
SET TIMESTAMP=1226365371/*!*/;
INSERT INTO demotable (id,name) VALUES (NULL,'q')/*!*/;

at 3792

#081111 9:02:51 server id 1 end_log_pos 3819 Xid = 141
COMMIT/*!*/;

at 3819

#081111 9:02:57 server id 1 end_log_pos 3847 Intvar
SET INSERT_ID=18/*!*/;

at 3847

#081111 9:02:57 server id 1 end_log_pos 3964 Query thread_id=10 exec_tim
e=0 error_code=0
SET TIMESTAMP=1226365377/*!*/;

这样,我执行:

mysqlbinlog --stop-position="3646" C:/logs/demolog.000001 -uroot -p
或者:
mysqlbinlog --stop-date="2008-11-11 9:02:48" C:/logs/demolog.000001 -uroot -p

这样是不是就可以把数据库恢复到9:02:49之前的数据库状态,或者是就是3646操作点之前的状态,还需要别的额外的什么操作吗?

如果不需要别的操作,我目前遇到的问题,就是这样执行以后,不报告错误,也不能改变数据库。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • iteye_521 2008-11-11 09:28
    已采纳

    [quote]但是执行完毕以后,数据库中的数据并不会恢复到那个时间点,使用了
    mysqlbinlog --stop-position="n" 这样的参数也不行。 [/quote]
    貌似binlog功能只对事务性存储引擎有效,你不会使用的是MyISAM存储引擎吧

    打赏 评论
  • iteye_521 2008-11-11 08:25

    [quote]用mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 [color=red]|[/color]mysql -uroot -p 会报告错误。[/quote]
    那个竖线是linux/unix上shell中的管道符,windows中不支持,mysql文档中都是在linux平台上的情况,windows上应该:
    [quote]mysqlbinlog --stop-date="2008-11-10 20:00" c:/logs/demo.000001 -uroot -p [/quote]
    直接给mysqlbinlog加上-uroot -p选项就行了

    打赏 评论
  • 小毛1983 2008-11-11 08:26

    mysqlbinlog --stop-date="2008-11-10 20:00:00" c:/logs/demo.000001 | mysql -uroot -p

    打赏 评论
  • iteye_521 2008-11-11 08:27

    注意:[color=red]mysql文档中全部是基于linux操作系统进行讲解的,一定要注意linux命令中的管道符号,windows上可不支持这个[/color]

    打赏 评论
  • 小毛1983 2008-11-11 09:33

    Innodb才ok把。。。如jones说的,存储引擎不支持事务把

    打赏 评论
  • iteye_521 2008-11-11 12:33

    [quote]ENGINE=InnoDB [/quote]
    InnoDB 当然是事务型存储引擎了

    打赏 评论
  • 小毛1983 2008-11-11 12:43

    mysqlbinlog c:/logs/demo.000001
    查看一下

    那个时间段是否包含在这个日志文件里边

    打赏 评论
  • 小毛1983 2008-11-11 22:09

    mysqlbinlog --stop-date="2008-11-10 20:00:00" c:/logs/demo.000001 -uroot -p

    mysqlbinlog c:/logs/demo.000001 查看日志内容

    打赏 评论
  • 小毛1983 2008-11-11 22:11

    貌似只有该日志文件存在的时间段才会给恢复。。所以要确认里边日志里边的时间段

    打赏 评论
  • iteye_521 2008-11-12 14:24

    呵呵,这个问题可不好说了,估计是你mysql环境哪里有问题,实在不行换个版本试试

    打赏 评论

相关推荐 更多相似问题