Chinaunix首页 | 论坛 | 博客
  • 博客访问: 351785
  • 博文数量: 166
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1640
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-05 11:44
个人简介

文章不在长,坚持不懈记录下努力前行的脚步

文章分类

全部博文(166)

文章存档

2017年(19)

2016年(59)

2015年(88)

我的朋友

分类: Mysql/postgreSQL

2015-12-24 11:43:57

20151223
主题:利用mysqlbinlog恢复
(来自MySQL reference manual 4.6.8)
=============================================
在官档的4.6.8前置描述的最后部分提到临时表跨binlog可能会导致恢复出现一些问题
一、提出问题
是这样的,比如我的第一个log记录了create temporary table,然而使用该临时表的语句可能被记录到了下一个日志中,如果我们像下面的这种方式来恢复数据可能会出现问题
shell> mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!
因为第一条命令恢复数据后,也意味着该进程的结束,其实这个时候刚刚恢复的临时表是被server给drop掉了的,在执行第二条命令的时候,可能会包表不存在这样的错误;

一般可以采取两种方式解决这类问题

二、解决办法
1、将两个日志拼接在一起执行
shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
2、将日志管道到一个文件中,在一个进程内一次执行结束恢复操作
shell> mysqlbinlog binlog.000001 >  /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql
shell> mysql -u root -p -e "source /tmp/statements.sql"

备注:一个不错的办法是新建一个DB,将要恢复的操作都source到这个DB上,再将结果复制到原DB上,这样做可以尽量保证数据的安全;

总结:恢复数据的时候,如果碰到跨日志这样的操作,最好将日志拼接在一块或者管道到同一个文件执行,也可以在恢复之前通过tail和head命令查看文件衔接处是否存在临时表之类的操作。
阅读(1253) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~