MySQL Binlog日志有三種格式:
- Statement
- ROW
- MiXED
查看Binlog使用格式命令:show global variables like %binlog_format%
設置Binlog使用格式命令:set global binlog_format=statement
三種格式介紹:
1.Statement:每一條會修改數據的sql都會被記錄在binlog中
優點:不需要記錄每一行的變化,減少了binlog日志量,節省了IO,提高性能。(相比ROW能節省多少性能與日志量,取決於應用的sql情況,正常同一條記錄修改與插入ROW格式所產生的數據量還小於Statement格式產生的數據量,但是考慮到如果帶條件的update操作、以及整表刪除、alter表等操作,ROW格式會產生大量日志,因此在考試是否使用ROW格式時應該根據應用的實際情況,其所產生的日志量會增加多少,以及帶來的IO性能問題)
缺點:由於記錄的只是執行語句,為了這些語句能在slave上正常執行,因此還必須記錄每條語句執行時的相關信息,以保證所有語句能在slave得到和master端執行時相同的結果。另外mysql的復制,像一些特定函數功能,slave可與master上要保持一致會有很多相關問題(如sleep()函數、last_inster_id()、以及userr-defined functions(udf)會出現問題),使用以下函數的語句也無法被復制:
- load_file()
- uuid()
- user()
- found_rows()
- sysdate()(除非啟用時設置了--sysdate-is-now選項)
2.ROW:不設置sql語句上下文相關信息,僅保存哪條記錄被修改
優點:binlog中可以不記錄執行的sql語句的上下文相關的信息,僅需要記錄哪一條記錄被修改成什么,所以rowslave的日志內容會非常清楚的記錄下每一行數據修改的細節,而且不會出現某些特定情況下的存儲過程,或function,以及trigger的調用和觸發無法被正確復制的問題
缺點:所有執行的語句當記錄到日志中時,都將以每行的記錄來記錄,這樣可能會產生大量的日志內容,比如一條update語句,修改多條記錄,則binlog中每一條修改都會被記錄,這樣造成binlog的日志量會很大,特別是當執行alter table之類的語句時,由於表結構修改,每條記錄都發生變化,那么該表每一條記錄都會記錄到日志中。
3.MiXED:是以上兩種level的混合使用,一般的語句修改使用Statement格式保存binlog,如一些函數,statement無法完成主從復制的操作,則采用ROW格式保存binlog。mysql會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是從Statement和ROW中之間選擇一種。新版本的mysql中對ROW模式也做了優化,並不是所有的操作都會以ROW格式記錄,像遇到表結構變更的時候就會以Statement模式來記錄,至於update和delete等修改數據的語句還是會記錄所有行的變更。
原文出自:https://blog.csdn.net/sj349781478/article/details/77816524
