MySQL中二進(jìn)制與重做日志文件的基本概念講解
二進(jìn)制日志記錄了所有對數(shù)據(jù)庫執(zhí)行更改的操作,二進(jìn)制主要有以下兩種作用:
1、恢復(fù)(recovery)2、復(fù)制(replication)
二進(jìn)制日志的啟動:配置參數(shù)log-bin[=name],如果不指定name,則默認(rèn)二進(jìn)制日志文件名為主機(jī)名,后綴名為二級制日志的序列號,所在路徑為數(shù)據(jù)庫所在目錄。
以index為后綴的文件為二進(jìn)制日志的索引文件,用來存儲過往生產(chǎn)的二進(jìn)制日志。
和二進(jìn)制日志相關(guān)的參數(shù):
max_binlog_size、binlog_cache_size、sync_binlog、binlog-do-db、binlog-ignore-db、log-slave-update、binlog_format
max_binlog_size,該參數(shù)指定了單個二進(jìn)制日志文件的最大值,如果超過該值,則產(chǎn)生新的二進(jìn)制日志文件,后綴名+1,并記錄到.index文件,從Mysql5.0開始的默認(rèn)值為1073741824,代表1G。
Mysql5.5的默認(rèn)值
當(dāng)使用事務(wù)的存儲引擎InnoDB時,所有未提交的事務(wù)會記錄到一個緩存中,等待事務(wù)提交時,直接將緩沖中的二進(jìn)制日志寫入二進(jìn)制日志文件,而該緩沖的大小由binlog_cache_size決定,默認(rèn)大小為32KB,此外,binlog_cache_size是基于回話的,也就是,當(dāng)一個線程開始一個事務(wù)時,mysql會自動分配一個大小為binlog_cache_size的緩存,因此該值得設(shè)置需要相當(dāng)小心,可以通過show global status 查看binlog_cache_use、binlog_cache_disk_use的狀態(tài),可以判斷當(dāng)前binlog_cache_size的設(shè)置是否合適。
Binlog_cache_size的默認(rèn)大小為32KB
參數(shù)sync_binlog=[N]表示每寫緩存多少次就同步到磁盤,如果將N設(shè)置為1,則表示采用同步寫磁盤的方式來寫二進(jìn)制日志,該參數(shù)很重要,這個以后還會提到。值得注意的是,在將該參數(shù)設(shè)置為1時,也應(yīng)該將innodb_support_xa設(shè)為1來解決,這可以確保二進(jìn)制日志和InnoDB存儲引擎數(shù)據(jù)文件的同步。
參數(shù)binlog-do-db和binlog-ignore-db表示需要寫入或者忽略寫入哪些庫的日志,默認(rèn)值為空,則表示將所有庫的日志同步到二進(jìn)制日志。
Log-slave-update該參數(shù)在搭建master=>slave=>slave的架構(gòu)時,需要配置。
Binlog_format參數(shù)也特別重要。從mysql5.1版本開始引入這個參數(shù),該參數(shù)可以設(shè)置的值有STATEMENT、ROW、MIXED;
(1)STATEMENT格式和之前的mysql版本一樣,二進(jìn)制日志文件記錄的是日志的邏輯失SQL語句。
。2)在ROW格式下,二進(jìn)制日志記錄的不再是簡單的SQL語句了,而是記錄表的行更改情況,此時可以將InnoDB的事務(wù)隔離基本設(shè)為READ COMMITTED,以獲得更好的.并發(fā)性。
。3)MIXED格式下,mysql默認(rèn)采用的STATEMENT格式進(jìn)行二進(jìn)制日志文件的記錄,但是在一些情況下會使用ROW格式,可能的情況包括:
1)表的存儲引擎為NDB,這時對于表的DML操作都會以ROW格式記錄
2)使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不確定函數(shù)
3)使用了INSERT DELAY語句
4)使用了用戶定義函數(shù)
5)使用了臨時表
重做日志
Mysql默認(rèn)情況下會有兩個文件:ib_logfile0和ib_logfile1,這兩個文件就是重做日志文件,或者事務(wù)日志。
重做日志的目的:萬一實(shí)例或者介質(zhì)失敗,重做日志文件就能派上用場。
每個InnoDB存儲引擎至少有一個重做日志文件組,每個文件組下至少有2個重做日志文件,如默認(rèn)的ib_logfile0、ib_logfile1。InnoDB存儲引擎先寫重做日志文件1,當(dāng)達(dá)到文件的最后時,會切換至重做日志文件2,當(dāng)重做日志文件2也被寫滿時,會再被切換到重做日志文件1中。
影響重做日志的參數(shù):
Innodb_log_file_size、innodb_log_files_in_group、innodb_log_group_home_dir影響著重做日志文件的屬性。
重做日志與二進(jìn)制日志的區(qū)別:
1)二進(jìn)制日志會記錄所有與mysql有關(guān)的日志記錄,包括InnoDB等其他存儲引擎的日志,而InnoDB存儲引擎的重做日志只記錄有關(guān)其本身的事務(wù)日志,
2)記錄的內(nèi)容不容,不管你將二進(jìn)制日志文件記錄的格式設(shè)為哪一種,其記錄的都是關(guān)于一個事務(wù)的具體操作內(nèi)容,而InnoDB存儲引擎的重做日志文件記錄的關(guān)于每個頁的更改的物理情況;
3)寫入的時間也不同,二進(jìn)制日志文件是在事務(wù)提交前進(jìn)行記錄的,而在事務(wù)進(jìn)行的過程中,不斷有重做日志條目被寫入重做日志文件中。
從日志緩沖寫入磁盤上的重做日志文件的條件:
在主線程中每秒會將重做日志緩沖寫入磁盤的重做日志文件中,不論事務(wù)是否提交。另一個觸發(fā)這個過程是由參數(shù)innodb_flush_log_at_trx_commit控制,表示在提交時,處理重做日志的方式。
參數(shù)innodb_flush_log_at_trx_commit可設(shè)的值有0、1、2,0代表當(dāng)提交事務(wù)時,并不將事務(wù)的重做日志寫入磁盤上的日志文件,而是等待主線程每秒的刷新,而1和2不同的地方在于:1是在commit時將重做日志緩沖同步寫到磁盤;2是重做日志異步寫到磁盤,即不能完全保證commit時肯定會寫入重做日志文件,只是有這個動作。
值得注意的一點(diǎn):因?yàn)橹刈鋈罩居袀capacity變量,該值代表了最后的檢查點(diǎn)不能超過這個閥值。
【MySQL中二進(jìn)制與重做日志文件的基本概念講解】相關(guān)文章:
MySQL日志文件的概述06-23
如何修改MySQL日志文件的位置06-23
關(guān)于關(guān)閉mysql日志的方法06-23
情感日志《裸婚》的講解05-26
關(guān)于默認(rèn)的Apache日志文件03-06