概述
binlog 是 MySQL 的 Server 層實(shí)現(xiàn)的,所有引擎都可用。binlog 存儲(chǔ)了完整的邏輯日志。
binlog 三種格式
STATMENT
基于SQL語(yǔ)句的復(fù)制(statement-based replication, SBR),每一條會(huì)修改數(shù)據(jù)的sql語(yǔ)句會(huì)記錄到binlog中。
優(yōu)點(diǎn):不需要記錄每一條SQL語(yǔ)句與每行的數(shù)據(jù)變化,這樣子binlog的日志也會(huì)比較少,減少了磁盤IO,提高性能。
缺點(diǎn):在某些情況下會(huì)導(dǎo)致master-slave中的數(shù)據(jù)不一致(如sleep()函數(shù),last_insert_id(),以及user-defined functions(udf)等會(huì)出現(xiàn)問題)
ROW
基于行的復(fù)制(row-based replication, RBR):不記錄每一條SQL語(yǔ)句的上下文信息,僅需記錄哪條數(shù)據(jù)被修改了,修改成了什么樣子了。
優(yōu)點(diǎn):不會(huì)出現(xiàn)某些特定情況下的存儲(chǔ)過(guò)程、或function、或trigger的調(diào)用和觸發(fā)無(wú)法被正確復(fù)制的問題
缺點(diǎn):會(huì)產(chǎn)生大量的日志,尤其是alter table的時(shí)候會(huì)讓日志暴漲。
MIXED
混合模式復(fù)制(mixed-based replication, MBR):以上兩種模式的混合使用
一般的復(fù)制使用STATEMENT模式保存binlog,對(duì)于STATEMENT模式無(wú)法復(fù)制的操作使用ROW模式保存binlog,MySQL會(huì)根據(jù)執(zhí)行的SQL語(yǔ)句選擇日志保存方式
怎么知道 binlog 是完整的
一個(gè)事務(wù)的 binlog 是有完整格式的:
- statement格式: 最后會(huì)有 COMMIT;
- row格式:最后會(huì)有一個(gè) XID event;
sync_binlog
sync_binlog:是MySQL 的二進(jìn)制日志(binary log)同步到磁盤的頻率。 取值:0-N:
- sync_binlog=0,當(dāng)事務(wù)提交之后,MySQL不做fsync之類的磁盤同步指令刷新binlog_cache中的信息到磁盤,而讓Filesystem自行決定什么時(shí)候來(lái)做同步,或者cache滿了之后才同步到磁盤。這個(gè)是性能最好的。
- sync_binlog=1,當(dāng)每進(jìn)行1次事務(wù)提交之后,MySQL將進(jìn)行一次fsync之類的磁盤同步指令來(lái)將binlog_cache中的數(shù)據(jù)強(qiáng)制寫入磁盤。
- sync_binlog=n,當(dāng)每進(jìn)行n次事務(wù)提交之后,MySQL將進(jìn)行一次fsync之類的磁盤同步指令來(lái)將binlog_cache中的數(shù)據(jù)強(qiáng)制寫入磁盤。