- 論壇徽章:
- 0
|
架構(gòu)M1<->M2,M1主,M2備,雙向同步。
現(xiàn)在需要對T1表添加一個字段COL1。 一般的做法是直接在M1上進行ALTER TABLE操作,SQL語句記錄到BINLOG,復(fù)制到M2,再在M2上重放,完成表結(jié)構(gòu)的修改。這樣的操作在表小的時候能夠很快完成,但是存在如下幾種安全隱患:
1:T1表很大,比如10G,由于MYSQL處理DDL機制,導(dǎo)致這個ALTER TABLE操作需要30分鐘才能完成。在這30分鐘內(nèi),T1表是被鎖定的,不能寫入,那么只要涉及到T1表的寫入業(yè)務(wù)就會全部等待,直至超時報錯退出。嚴(yán)重影響了正常業(yè)務(wù)的運行。
2:T1表一般大,比如1G,ALTER TABLE處理需要5分鐘,而且業(yè)務(wù)允許5分鐘的寫入失敗。主上的ALTER TABLE寫入BINLOG日志后,立刻復(fù)制到M2上,在M2上進行回放。由于MYSQL復(fù)制是單線程的,M2對于復(fù)制的SQL線程在完成ALTER TABLE之前,是不會執(zhí)行其他SQL的。因為它排在隊列的最前面。如果此時M1宕機,M2上還會存在5分鐘的SQL沒有被執(zhí)行完,那么M1,M2上的數(shù)據(jù)是不一致的。這時候M2沒法頂上做寫入服務(wù)。
出現(xiàn)1,2都是不能接受的。 處理1的方式: 在M2上以不記錄日志的方式
set sql_log_bin =0 alter table t1.....(在這里給添加的字段一個默認(rèn)值) set sql_log_bin =1
此時T1被鎖,但是不影響別的表的復(fù)制。當(dāng)M2上的DDL操作完成后,停止M2到M1的復(fù)制,再把寫入切換到M2上,再做M1上的DDL。全部替換好后,替換新的PHP程序。
處理2的方式: 在M2上操作,不寫日志,完成后到M1操作。
|
|