使用MySQL自身复制来恢复binlog

2013-11-25  |  22:47分类:MySQL  |  标签:  |  

如果需要恢复的二进制日志较多,较复杂,强烈建议使用MySQL自身复制来恢复binlog,而不要使用mysqlbinlog。

在MySQL手册中一直是推荐使用mysqlbinlog工具来实现指定时间点的数据恢复,事实上,这是一个经常"让人郁闷"的办法。更好的办法是,使用MySQL内部复制线程中的SQL Thread来做恢复。

这个idea来自Lazydba同学;在Google稍作搜索,在Xaprb上Baron Schwartz也很早提到了使用类似的方法来恢复binlog,在那篇讨论中,还可以看到Jeremy Cole也提到:使用MySQL手册中推荐的方法是困难重重的,而且mysqlbinlog这个办法从逻辑上来说也是一个错误--因为这样MySQL不得不在两个不同的地方实现一套相同的逻辑,最终难免会出错。使用mysqlbinlog来恢复,你可能会需要以下“让人郁闷”的问题:

(*) Max_allowed_packet问题 (*) 恼人的Blob/Binary/text字段问题 (*) 特殊字符的转义问题 (*) 没有"断点恢复":执行出错后,没有足够的报错,也很难从失败的地方继续恢复

1. 如何操作

本文不打算写一个step by step的文档,只介绍主要的思路和粗略的操作步骤。

1.1 将binlog作为relay log来执行

优点:实施简单;缺点:需要关闭一次数据库(不确定不关闭数据库行不行);

思路:直接将要恢复的binlog拷贝到relay log目录,并修改slave-info相关的文件,让MySQL把binlog当做relay log来执行

简单的操作步骤:

* 关闭当前实例 * 将binlog拷贝到对应的relay log目录(datadir或者relay-log参数指定的目录) * 打开relay-log-info-file参数指定的relay-log.info文件(默认是datadir目录下的relay-log.info文件),修改文件前面两行。 这两行的意义分别是:当前执行的relay log文件;当前执行到relay log文件的位置(position) * 打开relay-log-index文件(由参数--relay-log-index,默认是数据目录下的host_name-relay-bin.index)将需要恢复的binlog文件全路径列表存在该文件中 * 启动数据库,并start slave io_thread

1.2 从专门构建的binlog server上拉binlog

这个方法,无需启动数据库,但是需要重新启动一个全新的实例,将binlog拷贝到该实例中,这里称这个实例为binlog server。然后把需要恢复的实例复制指向这个binlog server。这里需要做的是,将日志拷贝到binlog server对应目录下,并修改对应的master-info文件,使得备库能够dump到这些binlog文件。

2. 其他需要注意的事项

* 配置文件中建议加上skip-slave-start,以免在不需要时候slave线程自己开始执行了

* start slave的时候,可以通过start slave until的方式,控制slave执行到的位点

* slave执行的其实位点,则通过relay-log.info或者change master to来指定

Good Luck.

喜欢本文,那就收藏到:

7条评论 关于 “使用MySQL自身复制来恢复binlog”

  1. xupeng 发表于: 十一月 29th, 2013 23:53

    我喜欢使用 binlog server 来恢复,原因是很多时候 PITR 都只是需要恢复个别表而不是整库,使用 binlog server + replication 方便按表过滤加快恢复速度,我这边会把 binlog 备份到分布式文件系统上,需要恢复时直接从分布式文件系统启动 binlog server,很方便。

  2. admon 发表于: 十二月 30th, 2013 15:13

    >> 1.2 从专门构建的binlog server上拉binlog
    这里能否再介绍一下? 也就是启动一个mysql实例,里面放置需要执行的binlog,然后通过它为mysql slave提供binlog吧?谢谢!

  3. admin 发表于: 一月 6th, 2014 13:59

    就是你说的这个意思。需要修改一下master.info文件就可以了

  4. waityou81 发表于: 一月 9th, 2014 15:14

    应该是start slave sql_thread而不是start slave io_thread吧?

  5. 匿名 发表于: 二月 21st, 2014 22:29

    这种方式也要有一个有binlog坐标的全备的吧?
    恢复最近的全备,再用文中说的方式去恢复binlog,是吧??

  6. 刘家奇 发表于: 十一月 27th, 2014 15:33

    比如我drop了一个表,需要用binlog server恢复,怎么寻找 drop table操作的那个binlog位置呢?

  7. iubuntu 发表于: 三月 12th, 2015 14:56

    已经上线了 很好是 使用的 是 binlog server 方式 ..


发表您的评论