因为服务器迁移,需要将一套硬件老化的MySQL主从服务器更换为新的服务器。经过综合评估,没有改动版本,采用较新的5.6版本。颠覆。就是下图中的左右。如果要做这个彻底的切换,其实有很多方法和思路,我选择了一个来做。首先,我低估了数据的情况,以为都是InnoDB的表,所以用--single-transaction把表数据从主库导出,直接导入。貌似没有明显异常,但是启动slave的时候发现数据冲突了。2017-08-0717:40:3175211[警告]从属:键'PRIMARY'的重复条目'632107'错误代码:10622017-08-0717:40:3175211[错误]运行查询时出错,从属SQL线程中止.修复问题,并使用“SLAVESTART”重新启动从SQL线程。我们停在日志'binlog.000019'位置934115248于是我们仔细查看数据,发现数据库中有大量的MYISAM表。这种情况下备份MYISAM表数据时可能会出现问题,因为--single-transaction不会生效,可以使用mysqlhotcopy来备份。不喜欢MYISM的表,而且这个人其实比较懒,不想这么折腾,而且对主库也有一定的影响。于是我把目光投向了奴隶图书馆。为了保证数据的一致性,我可以先停止slave,限时导出数据,对主库是透明的。需要注意的是,使用mysqldump导出usingmaster-data的选项肯定会冲突,所以我们完全可以使用master-data=2的选项,直接根据showslavestatus的结果得到具体的offset\G。#mysqldump--all-databases--master-data=2>master.sqlmysqldump:Error:Binloggingonservernotactive新的主库和新的备库都是这样搭建的,数据来自旧的从库,这样的话,如果配置了服务,主库就会有3个binlogDump线程。整个数据导入过程中,根据processlist数据可以看出,处理MyISAM表还是比较耗时的。我只是等待几个大型MyISAM表的线程状态从“通过排序修复”切换到“使用keycache修复”。这时候,我们就需要切换了。我们可以将新的从库指向新的主库,即实现级联复制。要做这个工作,数据均衡后,最好先停止新的主库。从线程,让新的从库再次使用新的主库的log(showmasterstatus\G)这样就万事俱备了,一个级联环境就做好了。后期的一些微调自然也可以做到。当正式切换时,实际上几乎不需要任何工作。新建主库可以使用resetslaveall。以上是一个非常基本的环境切换。如果我们能更进一步,把网络层面做好,其实这个开关会更加透明,完全非感知。
