架构M1<->M2,M1主,M2备,双向同步。
现在需要对T1表添加一个字段COL1。
一般的做法是直接在M1上进行ALTER TABLE操作,SQL语句记录到BINLOG,复制到M2,再在M2上重放,完成表结构的修改。这样的操作在表小的时候能够很快完成,但是存在如下几种安全隐患:
1:T1表很大,比如10G,由于MYSQL处理DDL机制,导致这个ALTER TABLE操作需要30分钟才能完成。在这30分钟内,T1表是被锁定的,不能写入,那么只要涉及到T1表的写入业务就会全部等待,直至超时报错退出。严重影响了正常业务的运行。
2:T1表一般大,比如1G,ALTER TABLE处理需要5分钟,而且业务允许5分钟的写入失败。主上的ALTER TABLE写入BINLOG日志后,立刻复制到M2上,在M2上进行回放。由于MYSQL复制是单线程的,M2对于复制的SQL线程在完成ALTER TABLE之前,是不会执行其他SQL的。因为它排在队列的最前面。如果此时M1宕机,M2上还会存在5分钟的SQL没有被执行完,那么M1,M2上的数据是不一致的。这时候M2没法顶上做写入服务。
出现1,2都是不能接受的。
处理1的方式:
在M2上以不记录日志的方式
set sql_log_bin =0
alter table t1.....(在这里给添加的字段一个默认值)
set sql_log_bin =1
此时T1被锁,但是不影响别的表的复制。当M2上的DDL操作完成后,停止M2到M1的复制,再把写入切换到M2上,再做M1上的DDL。全部替换好后,替换新的PHP程序。
处理2的方式:
在M2上操作,不写日志,完成后到M1操作。
阅读(819) | 评论(0) | 转发(0) |