西邮大三狗!!!
分类: Mysql/postgreSQL
2014-12-02 21:47:19
如果需要恢复的二进制日志较多,较复杂,强烈建议使用 MySQL 自身复制来恢复 binlog,而不要使用 mysqlbinlog。
在MySQL手册中一直是推荐使用 mysqlbinlog 工具来实现指定时间点的数据恢复,事实上,这是一个经常"让人郁闷"的办法。更好的办法是,使用 MySQL内部复制线程中的SQLThread来做恢复。
这个 idea 来自 Lazydba 同学;在 Google 稍作搜索,在 Xaprb 上 BaronSchwartz 也很早提到了使用类似的方法来恢复 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来指定
转自: