前幾節(jié)中有描述,mysql整體來(lái)看,其實(shí)就有兩塊:一塊是server層,它主要做的是mysql功能層面的事情;還有一塊是引擎層,負(fù)責(zé)存儲(chǔ)相關(guān)的具體事宜。第八節(jié)中說(shuō)到粉板redo log是InnoDB引擎特有的日志,而server層也有自己的日志,稱為binlog(歸檔日志)。
bin log
即二進(jìn)制日志,它記錄了數(shù)據(jù)庫(kù)上的所有改變,并以二進(jìn)制的形式保存在磁盤中;它可以用來(lái)查看數(shù)據(jù)庫(kù)的變更歷史、數(shù)據(jù)庫(kù)增量備份和恢復(fù)、Mysql的復(fù)制(主從數(shù)據(jù)庫(kù)的復(fù)制)。語(yǔ)句以“事件”的形式保存,它描述數(shù)據(jù)更改。
因?yàn)橛辛藬?shù)據(jù)更新的binlog,所以可以用于實(shí)時(shí)備份,與master/slave復(fù)制。高可用與數(shù)據(jù)恢復(fù)。
1.恢復(fù)使能夠最大可能地更新數(shù)據(jù)庫(kù),因?yàn)槎M(jìn)制日志包含備份后進(jìn)行的所有更新。
2.在主復(fù)制服務(wù)器上記錄所有將發(fā)送給從服務(wù)器的語(yǔ)句。
出現(xiàn)兩份日志的原因?
最開始mysql里并沒有innoDB引擎。mysql自帶的引擎是myisam,但是myisam沒有crash-safe的能力,binlog日志只能用于歸檔。而Innodb是另外一個(gè)公司以插件形式引入mysql的,既然只依靠binlog是沒有crash-safe能力的,所以innodb使用另外一套日志也就是redo log來(lái)實(shí)現(xiàn)crash-safe能力。

binlog格式
binlog有三種格式:Statement、Row以及Mixed。從安全性來(lái)看,ROW(最安全)、MIXED(不推薦)、STATEMENT(不推薦)。
–基于SQL語(yǔ)句的復(fù)制(statement-based replication,SBR),
–基于行的復(fù)制(row-based replication,RBR),
–混合模式復(fù)制(mixed-based replication,MBR)。
Statement
每一條會(huì)修改數(shù)據(jù)的sql都會(huì)記錄在binlog中。在5.6.24中默認(rèn)格式。
優(yōu)點(diǎn):不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,提高性能。
缺點(diǎn):由于記錄的只是執(zhí)行語(yǔ)句,為了這些語(yǔ)句能在slave上正確運(yùn)行,因此還必須記錄每條語(yǔ)句在執(zhí)行的時(shí)候的一些相關(guān)信息,以保證所有語(yǔ)句能在slave得到和在master端執(zhí)行時(shí)候相同 的結(jié)果。另外mysql 的復(fù)制,像一些特定函數(shù)功能,slave可與master上要保持一致會(huì)有很多相關(guān)問(wèn)題。
ps:相比row能節(jié)約多少性能與日志量,這個(gè)取決于應(yīng)用的SQL情況,正常同一條記錄修改或者插入row格式所產(chǎn)生的日志量還小于Statement產(chǎn)生的日志量,但是考慮到如果帶條件的update操作,以及整表刪除,alter表等操作,ROW格式會(huì)產(chǎn)生大量日志,因此在考慮是否使用ROW格式日志時(shí)應(yīng)該跟據(jù)應(yīng)用的實(shí)際情況,其所產(chǎn)生的日志量會(huì)增加多少,以及帶來(lái)的IO性能問(wèn)題。
Row
5.1.5版本的MySQL才開始支持row level的復(fù)制,它不記錄sql語(yǔ)句上下文相關(guān)信息,僅保存哪條記錄被修改。
優(yōu)點(diǎn): binlog中可以不記錄執(zhí)行的sql語(yǔ)句的上下文相關(guān)的信息,僅需要記錄那一條記錄被修改成什么了。所以rowlevel的日志內(nèi)容會(huì)非常清楚的記錄下每一行數(shù)據(jù)修改的細(xì)節(jié)。而且不會(huì)出現(xiàn)某些特定情況下的存儲(chǔ)過(guò)程,或function,以及trigger的調(diào)用和觸發(fā)無(wú)法被正確復(fù)制的問(wèn)題.
缺點(diǎn):所有的執(zhí)行的語(yǔ)句當(dāng)記錄到日志中的時(shí)候,都將以每行記錄的修改來(lái)記錄,這樣可能會(huì)產(chǎn)生大量的日志內(nèi)容。
ps:新版本的MySQL中對(duì)row level模式也被做了優(yōu)化,并不是所有的修改都會(huì)以row level來(lái)記錄,像遇到表結(jié)構(gòu)變更的時(shí)候就會(huì)以statement模式來(lái)記錄,如果sql語(yǔ)句確實(shí)就是update或者delete等修改數(shù)據(jù)的語(yǔ)句,那么還是會(huì)記錄所有行的變更。
Mixed
從5.1.8版本開始,MySQL提供了Mixed格式,實(shí)際上就是Statement與Row的結(jié)合。
在Mixed模式下,一般的語(yǔ)句修改使用statment格式保存binlog,如一些函數(shù),statement無(wú)法完成主從復(fù)制的操作,則采用row格式保存binlog,MySQL會(huì)根據(jù)執(zhí)行的每一條具體的sql語(yǔ)句來(lái)區(qū)分對(duì)待記錄的日志形式,也就是在Statement和Row之間選擇一種。
查看與配置binlog格式
(1)查看binlog_format
show variableslike'binlog_format;

或者通過(guò)查看配置文件
whereismy.inicat /etc/my.cnf
(2)修改binlog_format
直接修改set globle binlog_format='MIXED'
或者修改配置文件vi /etc/my.cnf

與binlog有關(guān)參數(shù)
log_bin
設(shè)置此參數(shù)表示啟用binlog功能,并指定路徑名稱。默認(rèn)是off
log_bin_basename
log_bin_index
設(shè)置此參數(shù)是指定二進(jìn)制索引文件的路徑與名稱
max_binlog_cache_size
此參數(shù)表示binlog使用的內(nèi)存最大的尺寸
binlog_cache_size
此參數(shù)表示binlog使用的內(nèi)存大小,可以通過(guò)狀態(tài)變量binlog_cache_use和binlog_cache_disk_use來(lái)幫助測(cè)試。
binlog_cache_use:使用二進(jìn)制日志緩存的事務(wù)數(shù)量
binlog_cache_disk_use:使用二進(jìn)制日志緩存但超過(guò)binlog_cache_size值并使用臨時(shí)文件來(lái)保存事務(wù)中的語(yǔ)句的事務(wù)數(shù)量
max_binlog_size
Binlog最大值,最大和默認(rèn)值是1GB,該設(shè)置并不能嚴(yán)格控制Binlog的大小,尤其是Binlog比較靠近最大值而又遇到一個(gè)比較大事務(wù)時(shí),為了保證事務(wù)的完整性,不可能做切換日志的動(dòng)作,只能將該事務(wù)的所有SQL都記錄進(jìn)當(dāng)前日志,直到事務(wù)結(jié)束。
innodb_flush_log_at_trx_commit = N:
N=0? – 每隔一秒,把事務(wù)日志緩存區(qū)的數(shù)據(jù)寫到日志文件中,以及把日志文件的數(shù)據(jù)刷新到磁盤上;
N=1? – 每個(gè)事務(wù)提交時(shí)候,把事務(wù)日志從緩存區(qū)寫到日志文件中,并且刷新日志文件的數(shù)據(jù)到磁盤上;
N=2? – 每事務(wù)提交的時(shí)候,把事務(wù)日志數(shù)據(jù)從緩存區(qū)寫到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盤上,而是取決于操作系統(tǒng)的調(diào)度;
sync_binlog =? N:這個(gè)參數(shù)直接影響mysql的性能和完整性
N>0? — 每向二進(jìn)制日志文件寫入N條SQL或N個(gè)事務(wù)后,將執(zhí)行一次fsync之類的磁盤同步指令,同時(shí)文件系統(tǒng)將Binlog文件緩存刷新到磁盤;
N=0? — 默認(rèn)的,性能最高,風(fēng)險(xiǎn)最大。不主動(dòng)刷新二進(jìn)制日志文件的數(shù)據(jù)到磁盤上,而是由操作系統(tǒng)決定。當(dāng)事務(wù)提交后,Mysql僅僅是將binlog_cache中的數(shù)據(jù)寫入Binlog文件,但不執(zhí)行fsync之類的磁盤同步指令通知文件系統(tǒng)將緩存刷新到磁盤,而讓Filesystem自行決定什么時(shí)候來(lái)做同步,這個(gè)是性能最好的。;
推薦配置組合:
N=1,1? — 適合數(shù)據(jù)安全性要求非常高,而且磁盤IO寫能力足夠支持業(yè)務(wù),比如充值消費(fèi)系統(tǒng);
N=1,0? — 適合數(shù)據(jù)安全性要求高,磁盤IO寫能力支持業(yè)務(wù)不富余,允許備庫(kù)落后或無(wú)復(fù)制;
N=2,0或2,m(0
N=0,0? — 磁盤IO寫能力有限,無(wú)復(fù)制或允許復(fù)制延遲稍微長(zhǎng)點(diǎn)能接受,例如:日志性登記業(yè)務(wù);