MySQL - 日志 - binlog

概述

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)制寫入磁盤。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容