主从切换问题总结
[机器列表]
tc-dr-amdb-00.tc(旧主库)
tc-dr-amdb-01.tc(新主库)
yf-dba-darwin-admaker00.yf01(yf从库)
db-ku-view11.db01(db线下库)
[问题]
- 旧主库和新主库授权信息不一致,导致新主库出现access denied;
- 旧主库tc-dr-amdb-00.tc同步新主库tc-dr-amdb-01.tc,出现问题如下问题:
- 先在旧主库上stop slave && change master,而没有在旧主库change master之前在yf从库和db线下库上stop slave,此时这两个从库还是同步旧主库,结构变为:
![](http://images0.cnblogs.com/blog/532389/201305/25150224-71cd9e828f58422fb9244546b2ee36b5.jpg)
但是旧主库上配置了log_slave_updates,结构变为三层结构,此时yf从库和db线下库无法按照新主库记录的同步点同步。
- 在旧主库上change master发现没有新主库对它没有复制授权(IO线程同步中断,SQL线程同步正常),在临时授权之后,误以为还需要再一次change master(依旧使用第一次change master的同步点),导致Duplicate entry的错误,IO线程同步正常,SQL线程同步中断。
- 旧主库出现同步中断,使用STOP SALVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE几次之后,还是无法解决问题,认为当前数据损坏,需要重做数据。在重做数据的时候遇到以下问题:
- 拷贝db线下库的var目录时候,只停同步而没有停mysql进程,导致在内存或者cache的数据没有刷盘,从而拷贝的var目录数据不正确;
- 在mv旧主库的var目录后,直接拷贝db线下库的var目录到旧主库的/home/mysql/mysql/目录下,然后将新var下面mysql和relay-log相关文件move,使用旧主库的var目录下mysql代替。
问题在于:没有保留一份scp过来的var,如果无意删除新var的文件的话,则还需要再跨机器拷贝一份数据过来,比较耗时。
[解决方案]
1、 首先确认旧主库和新主库授权一致后,然后再进行主从切换、Handoff操作;
2、 应该先到旧主库、yf从库、db线下库上先stop slave操作,然后再change master或者是先处理yf从库、db线下库的同步最后处理旧主库同步。
对于变成三层结构的问题处理方法如下:
1、将旧主库和新主库之间的同步停止,待旧主库同步更新完毕之后,记录Master_Log_FILE和Exec_Master_Log_Pos;
2、停止yf从库和db线下库和新主库的同步,待同步更新完毕后,使用步骤1记录的同步点重新change master;
3、开启yf从库和db线下库同步,检查状态;
4、开启旧主库和新主库的同步,检查状态。