Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1366019
  • 博文数量: 243
  • 博客积分: 888
  • 博客等级: 准尉
  • 技术积分: 2955
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-05 14:33
个人简介

漫漫长路,其修远兮!

文章分类

全部博文(243)

文章存档

2017年(2)

2016年(22)

2015年(32)

2014年(57)

2013年(107)

2012年(23)

分类: Mysql/postgreSQL

2015-04-03 16:12:35

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

这个idea来自Lazydba同学;在Google稍作搜索,在Xaprb上Baron Schwartz也很早提到了使用类似的方法来恢复,在那篇讨论中,还可以看到Jeremy Cole也提到:使用MySQL手册中推荐的方法是困难重重的,而且这个办法从逻辑上来说也是一个错误–因为这样MySQL不得不在两个不同的地方实现一套相同的逻辑,最终难免会出错。使用binlog来恢复,你可能会需要以下“让人郁闷”的问题:
(*) Max_allowed_packet问题
(*) 恼人的Blob/Binary/text字段问题
(*) 特殊字符的转义问题
(*) 没有”断点恢复”:执行出错后,没有足够的报错,也很难从失败的地方继续恢复

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

以下是一个详细步骤:
binlog 拷贝到目标机器
[mysql@db02 3306]$ scp mysql-binlog.000085 10.211.55.5:/tmp
[mysql@db02 3306]$ scp mysql-binlog.000086 10.211.55.5:/tmp

目标机器,在relay log 目录建立软连接
[mysql@db01 3308]$ ln -s /tmp/mysql-binlog.000085 mysqld_3308-relay-bin.000024
[mysql@db01 3308]$ ln -s /tmp/mysql-binlog.000086 mysqld_3308-relay-bin.000025

修改mysqld_3308-relay-bin.index 增加
./mysqld_3308-relay-bin.000024
./mysqld_3308-relay-bin.000025

调整master 为relay log 方式执行
change master to RELAY_LOG_FILE=’mysqld_3308-relay-bin.000024′,RELAY_LOG_POS=120;

启动slave sql_thread
start slave sql_thread RELAY_LOG_FILE=’mysqld_3308-relay-bin.000024′,RELAY_LOG_POS=2731

其他需要注意的事项
* 配置文件中建议加上skip-slave-start,以免在不需要时候slave线程自己开始执行了
* start slave的时候,可以通过start slave until的方式,控制slave执行到的位点
* slave执行的其实位点,则通过relay-log.info或者change master to来指定

阅读(1616) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~