MySQL二進位制日誌的三種模式解析
原文出自 http://www.abcdocker.com/abcdocker/213
Row Level 行模式
日誌會記錄每一行資料被修改的形式,然後在slave端再對相同的資料進行修改
優點:在 row level模式下,bin-log中可以不記錄執行sql語句的上下文相關的資訊,僅僅只需要記錄哪一條被修改。所以row level的日誌內容會非常清楚的記錄每一行資料修改的細節。不會出現某些特定的情況下的儲存過程或者function,以及trigger的呼叫和觸發無法被正確複製的問題。
缺點:row level 所有的執行的語句當記錄到日誌中的是後,都將以每行記錄的修改來記錄,會產生大量的日誌內容。
Statement Leve (預設)
每一條會修改資料的sql語句都會記錄到master的bin-log中。slave在複製的時候sql程序會解析成和原來master端執行過的的相同的sql來再次執行。
優點:statement leve下的優點就是解決了row level下的缺點,不需要記錄每一行的資料變化,減少bin-log日誌量,節約IO,提高效能。
缺點:由於只記錄,所以,在statement level下已經發現不少情況會造成MySQL的複製出現問題,主要是修改資料庫的時候使用某些特定的函式或者功能的是會出現。
Mixed 自動模式
在該模式下,MySQL會根據執行的sql語句來區分對待記錄日誌的格式,也就是在statement和Row之前選擇一種,如果sql語句確實就是update或者delete等修改資料的語句,那麼還會記錄所有行的變更。
###解析行模式和語句模式的區別
如果我們有要刪除一百萬條記錄,在行模式(ROW )日誌會記載100萬條刪除命令,而語句模式(ststement)只需記錄一條delete * from test
企業場景如何選擇binlog的模式
1、如果生產中使用MySQL的特殊功能相對較少(儲存過程,觸發器,函式),選擇預設的語句模式即Statement Level。
2、如果生產中使用MySQL的特殊功能比較多的,可以選用Mixed模式。
3、如果生產中使用MySQL的特殊功能較多,有些昂資料最大化一致,此時最好Row level模式,但要注意該模式的日誌量將非常大。
檢視binlog模式
mysql> show global variables like "%binlog_format%"
配置binlog日誌模式
# vim my.cnf #在[mysql]模組中配置 log-bin = /data/3306/mysql-bin binlog_format="STATEMENT" #binlog_format="ROW" #binlog_format="MIXED" 也可以修改環境變數來修改binlog的模式 mysql> SET global binlog_format='STATEMENT'