查看當前數據庫binlog日志格式:
show global variables like '%binlog_format%';
一、三種格式介紹
1.1 STATEMENT
該格式下每一條會修改數據的sql都會記錄在binlog中;
優點:
不需要記錄每一行的變化,減少了binlog日志量,節約了IO,提高性能。它相比row模式能節約很多性能與日志量,具體節約的多少取決于應用的SQL情況。正常同一條記錄修改或者插入row格式所產生的日志量還小于Statement產生的日志量,考慮到整表刪除等一些大量數據操作,ROW格式會產生大量日志,所以總體來講statement模式會稍微好一些。
缺點:
由于記錄的只是執行語句,為了這些語句能在slave上正確運行,因此還必須記錄每條語句在執行的時候的一些相關信息,以保證所有語句能在slave得到和在master端執行時候相同的結果。
1.2 ROW
此格式不記錄sql語句上下文相關信息,僅保存哪條記錄被修改;
優點:
binlog中可以不記錄執行的sql語句的上下文相關的信息,僅需要記錄那一條記錄被修改成什么了。所以Row格式的日志內容會非常清楚的記錄下每一行數據修改的細節。
缺點:
所有的執行的語句當記錄到日志中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日志內容,比如一條update語句或者一條alter語句,修改多條記錄,則binlog中每一條修改都會有記錄,每條記錄都發生改變,那么該表每一條記錄都會記錄到日志中,這樣造成binlog日志量會很大。
1.3 MIXED
該格式是以上兩種level的混合使用,一般的語句修改使用statment格式保存binlog,當statement無法完成主從復制的操作時(設計一些函數時),則采用Row格式保存binlog,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是在Statement和Row之間選擇一種。
新版本的MySQL中隊Row模式也被做了優化,并不是所有的修改都會以Row模式來記錄,像遇到 表結構變更? 的時候就會以statement模式來記錄。至于update或者delete等修改數據的語句,還是會記錄所有行的變更。
二、實踐驗證
三、到底應該選用哪一種模式?
關于這三中格式的binlog,我們在使用的時候到底應該使用哪一種?我的觀點如下:
如果我們的磁盤空間和服務器性能比較OK的情況下,盡量使用Row模式,因為這種模式能夠最大程度的保證安全性,雖然產生的日志量很多,但是當你誤刪數據的時候,你就會感受到binlog給你帶來的溫暖;
當我們對一些不太重要的業務庫(例如一些log庫)進行數據主從復制的時候,盡量使用statement來執行,因為它的速度快,日志量小,而且不牽扯使用函數,是簡單的數據同步;
如果有一些場景需要盡量保證性能,但是又沒有十分嚴格的要求時,我們可以設置為Mixed格式,它可以在statement和Row之間進行切換,保證了業務的寫入性能;
最后一點,在RC和RU隔離界別下,不能使用statement格式的binlog日志;