MySQL binlog的格式有三種吩抓,基于SQL語句的復(fù)制(statement-based replication, SBR)赌躺,基于行的復(fù)制(row-based replication, RBR)匾委,
混合模式復(fù)制(mixed-based replication, MBR)惩系。相應(yīng)地廉嚼,binlog的格式也有三種:STATEMENT药磺,ROW嫌套,MIXED逆屡。它主要用于mysql的復(fù)制技術(shù)。
Row Level 行模式
日志中會記錄每一行數(shù) 據(jù)被修改的形式踱讨,然后在slave端再對相同的數(shù)據(jù)進(jìn)行修改
優(yōu)點:在row level模式下魏蔗,bin-log中可以不記錄執(zhí)行的sql語句的上下文相關(guān)的信息,僅僅只需要記錄那一條被修改痹筛。所以rowlevel的日志內(nèi)容會非常清楚的記錄下每一行數(shù)據(jù)修改的細(xì)節(jié)莺治。不會出現(xiàn)某些特定的情況下的存儲過程或function,以及trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題
缺點:row level帚稠,所有的執(zhí)行的語句當(dāng)記錄到日志中的時候谣旁,都將以每行記錄的修改來記錄,會產(chǎn)生大量的日志內(nèi)容滋早。
Statement Level(默認(rèn))
每一條會修改數(shù)據(jù)的sql都會記錄到master的bin-log中榄审。slave在復(fù)制的時候sql進(jìn)程會解析成和原來master端執(zhí)行過的相同的sql來再次執(zhí)行
**優(yōu)點:**statement level下的優(yōu)點首先就是解決了row level下的缺點,不需要記錄每一行數(shù)據(jù)的變化杆麸,減少bin-log日志量搁进,節(jié)約IO,提高性能昔头,因為它只需要在Master上鎖執(zhí)行的語句的細(xì)節(jié)饼问,以及執(zhí)行語句的上下文的信息。
缺點:由于只記錄語句揭斧,所以莱革,在statement level下 已經(jīng)發(fā)現(xiàn)了有不少情況會造成MySQL的復(fù)制出現(xiàn)問題,主要是修改數(shù)據(jù)的時候使用了某些定的函數(shù)或者功能的時候會出現(xiàn)。
Mixed 自動模式
在Mixed模式下盅视,MySQL會根據(jù)執(zhí)行的每一條具體的sql語句來區(qū)分對待記錄的日志格式捐名,也就是在Statement和Row之間選擇一種。如果sql語句確實就是update或者delete等修改數(shù)據(jù)的語句闹击,那么還是會記錄所有行的變更桐筏。
企業(yè)場景如何選擇binlog模式
1、互聯(lián)網(wǎng)公司拇砰,使用MySQL的功能相對少(存儲過程、觸發(fā)器狰腌、函數(shù))
選擇默認(rèn)的語句模式除破,Statement Level(默認(rèn))
2、公司如果用到使用MySQL的特殊功能(存儲過程琼腔、觸發(fā)器瑰枫、函數(shù))
則選擇Mixed模式
3、公司如果用到使用MySQL的特殊功能(存儲過程丹莲、觸發(fā)器光坝、函數(shù))又希望數(shù)據(jù)最大化一直,此時最好選擇Row level模式
行模式和語句模式的區(qū)別
1.語句模式:
100萬條記錄
只需1條delete * from test甥材;就可以刪除100萬條記錄
2.row模式
100萬條記錄
記錄100萬條刪除命令
配置查看binlog
在數(shù)據(jù)庫中查看binlog模式
配置文件參數(shù)如下:
[myslqd]
log-bin=mysql-bin
#binlog_format="STATEMENT"
#binlog_format="ROW"
#binlog_format="MIXED"
1
2
3
4
5
運行時在線修改臨時盯另;
mysql>SET GLOBAL binlog_format = 'ROW';
mysql>show global variables like '%binlog_format%';
1
2
其他模式命令為:
SET GLOBAL binlog_format = 'MIXED';
SET GLOBAL binlog_format = 'STATEMENT';
1
2
解釋:
GLOBAL=全局會話
SESSION=當(dāng)前會話
檢驗ROW模式下binlog日志記錄效果