1碌上、基于語句的復(fù)制(statement-Based Replication)
MySQL5.0及之前的版本僅支持基于語句的復(fù)制(也叫做邏輯復(fù)制,logical replication)。master記錄下改變數(shù)據(jù)的查詢,然后篱昔,slave從中繼日志中讀取事件阔馋,并執(zhí)行它玛荞,這些SQL語句與master執(zhí)行的語句一樣。這種方式的優(yōu)點就是實現(xiàn)簡單呕寝。此外勋眯,基于語句的復(fù)制的二進制日志可以很好的進行壓縮,而且日志的數(shù)據(jù)量也較小下梢,占用帶寬少——例如客蹋,一個更新GB的數(shù)據(jù)的查詢僅需要幾十個字節(jié)的二進制日志。而mysqlbinlog對于基于語句的日志處理十分方便孽江。
但是讶坯,基于語句的復(fù)制并不是像它看起來那么簡單,因為一些查詢語句依賴于master的特定條件岗屏,例如辆琅,master與slave可能有不同的時間。所以这刷,MySQL的二進制日志的格式不僅僅是查詢語句婉烟,還包括一些元數(shù)據(jù)信息,例如暇屋,當前的時間戳似袁。即使如此,還是有一些語句,比如昙衅,CURRENT USER函數(shù)扬霜,不能正確的進行復(fù)制。此外而涉,存儲過程和觸發(fā)器也是一個問題著瓶。
另外一個問題就是基于語句的復(fù)制必須是串行化的。這要求大量特殊的代碼婴谱,配置蟹但,例如InnoDB的next-key鎖等。并不是所有的存儲引擎都支持基于語句的復(fù)制谭羔。
如果語句含有任何不確定的函數(shù)調(diào)用华糖,則可能會導(dǎo)致Master與Slave之間產(chǎn)生不一致的情況。這些函數(shù)有:
LOAD_FILE(filename):讀取文件瘟裸,以字符串的形式返回值客叉。
UUID():生成唯一值的函數(shù),128位。
UUID_SHORT():同UUID(),64位话告。
USER():以utf8字符集返回當前連接MySQL的用戶名及主機名兼搏。
FOUND_ROWS():返回一個包含limit字句獲得的查詢總數(shù)。
SYSDATE():返回動態(tài)執(zhí)行的時間沙郭。
GET_LOCK(str,timeout) :獲得一個以字符串命名的鎖佛呻,且有超時時間。
IS_USED_LOCK(str):檢測str命名的鎖是否在使用中病线。
IS_FREE_LOCK(str):檢測str命名的鎖是否沒在使用吓著。
MASTER_POS_WAIT():控制master/slave的同步。
RAND():實現(xiàn)隨機數(shù)的方法送挑。
RELEASE_LOCK():用來釋放因GET_LOCK()獲取鎖的str绑莺。
SLEEP():實現(xiàn)延遲動作的時間的方法。
VERSION():返回MySQL版本信息的函數(shù)惕耕。
2纺裁、基于行的復(fù)制(Row-Based Replication)
MySQL增加基于行的復(fù)制,在二進制日志中記錄下實際數(shù)據(jù)的改變司澎。這種方式有優(yōu)點欺缘,也有缺點。優(yōu)點就是可以對任何語句都能正確工作挤安,一些語句的效率更高浪南。主要的缺點就是二進制日志可能會很大,而且不直觀漱受,所以,你不能使用mysqlbinlog來查看二進制日志。
對于一些語句昂羡,基于記錄的復(fù)制能夠更有效的工作絮记,如:
mysql> INSERT INTO summary_table(col1, col2, sum_col3)
-> SELECTcol1, col2, sum(col3)
-> FROMenormous_table
-> GROUP BYcol1, col2;
假設(shè),只有三種唯一的col1和col2的組合虐先,但是怨愤,該查詢會掃描原表的許多行,卻僅返回三條記錄蛹批。此時撰洗,基于記錄的復(fù)制效率更高。
另一方面腐芍,下面的語句差导,基于語句的復(fù)制更有效:
mysql> UPDATEenormous_table SET col1 = 0;
此時使用基于記錄的復(fù)制代價會非常高。由于兩種方式不能對所有情況都能很好的處理猪勇,所以设褐,MySQL 5.1支持在基于語句的復(fù)制和基于記錄的復(fù)制之前動態(tài)交換。你可以通過設(shè)置session變量binlog_format來進行控制泣刹。
3助析、混合復(fù)制
MySQL5.1及其以后的版本推薦使用混合模式的復(fù)制,它是根據(jù)事件的類型實時的改變binlog的格式椅您。當設(shè)置為混合模式時外冀,默認為基于語句的格式,但在特定的情況下它會自動轉(zhuǎn)變?yōu)榛谛械哪J健?/p>
當出現(xiàn)如下情況時掀泳,混合模式需要切換到基于行的復(fù)制:
該語句調(diào)用了:
UUID函數(shù)雪隧;
用戶自定義函數(shù)(UDFs);
CURRENT_USER或USER函數(shù);
LOAD_FILE函數(shù)开伏。
.同一個語句更改了兩張或更多包含AUTO_INCREMENT列的表膀跌。
.語句中使用了服務(wù)器變量。
.存儲引擎不允許使用基于語句復(fù)制固灵,如:MySQL Cluster引擎捅伤。