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命令查看文件衔接处是否存在临时表之类的操作。
阅读(1293) | 评论(0) | 转发(0) |