日誌

當前位置 /首頁/語文基礎/日誌/列表

MySQL中二進位制與重做日誌檔案的基本概念講解

二進位制日誌記錄了所有對資料庫執行更改的操作,二進位制主要有以下兩種作用:

MySQL中二進位制與重做日誌檔案的基本概念講解

1、恢復(recovery)2、複製(replication)

二進位制日誌的啟動:配置引數log-bin[=name],如果不指定name,則預設二進位制日誌檔名為主機名,字尾名為二級制日誌的序列號,所在路徑為資料庫所在目錄。

以index為字尾的檔案為二進位制日誌的索引檔案,用來儲存過往生產的二進位制日誌。

和二進位制日誌相關的引數:

max_binlog_size、binlog_cache_size、sync_binlog、binlog-do-db、binlog-ignore-db、log-slave-update、binlog_format

max_binlog_size,該引數指定了單個二進位制日誌檔案的最大值,如果超過該值,則產生新的二進位制日誌檔案,字尾名+1,並記錄到x檔案,從Mysql5.0開始的預設值為1073741824,代表1G。

Mysql5.5的預設值

當使用事務的儲存引擎InnoDB時,所有未提交的事務會記錄到一個快取中,等待事務提交時,直接將緩衝中的二進位制日誌寫入二進位制日誌檔案,而該緩衝的大小由binlog_cache_size決定,預設大小為32KB,此外,binlog_cache_size是基於回話的,也就是,當一個執行緒開始一個事務時,mysql會自動分配一個大小為binlog_cache_size的快取,因此該值得設定需要相當小心,可以通過show global status 檢視binlog_cache_use、binlog_cache_disk_use的狀態,可以判斷當前binlog_cache_size的設定是否合適。

Binlog_cache_size的預設大小為32KB

引數sync_binlog=[N]表示每寫快取多少次就同步到磁碟,如果將N設定為1,則表示採用同步寫磁碟的方式來寫二進位制日誌,該引數很重要,這個以後還會提到。值得注意的是,在將該引數設定為1時,也應該將innodb_support_xa設為1來解決,這可以確保二進位制日誌和InnoDB儲存引擎資料檔案的同步。

引數binlog-do-db和binlog-ignore-db表示需要寫入或者忽略寫入哪些庫的日誌,預設值為空,則表示將所有庫的日誌同步到二進位制日誌。

Log-slave-update該引數在搭建master=>slave=>slave的架構時,需要配置。

Binlog_format引數也特別重要。從mysql5.1版本開始引入這個引數,該引數可以設定的值有STATEMENT、ROW、MIXED;

(1)STATEMENT格式和之前的mysql版本一樣,二進位制日誌檔案記錄的是日誌的邏輯失SQL語句。

(2)在ROW格式下,二進位制日誌記錄的不再是簡單的SQL語句了,而是記錄表的行更改情況,此時可以將InnoDB的事務隔離基本設為READ COMMITTED,以獲得更好的併發性。

(3)MIXED格式下,mysql預設採用的STATEMENT格式進行二進位制日誌檔案的記錄,但是在一些情況下會使用ROW格式,可能的情況包括:

1)表的儲存引擎為NDB,這時對於表的DML操作都會以ROW格式記錄

2)使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不確定函式

3)使用了INSERT DELAY語句

4)使用了使用者定義函式

5)使用了臨時表

重做日誌

Mysql預設情況下會有兩個檔案:ib_logfile0和ib_logfile1,這兩個檔案就是重做日誌檔案,或者事務日誌。

重做日誌的目的:萬一例項或者介質失敗,重做日誌檔案就能派上用場。

每個InnoDB儲存引擎至少有一個重做日誌檔案組,每個檔案組下至少有2個重做日誌檔案,如預設的ib_logfile0、ib_logfile1。InnoDB儲存引擎先寫重做日誌檔案1,當達到檔案的最後時,會切換至重做日誌檔案2,當重做日誌檔案2也被寫滿時,會再被切換到重做日誌檔案1中。

影響重做日誌的引數:

Innodb_log_file_size、innodb_log_files_in_group、innodb_log_group_home_dir影響著重做日誌檔案的屬性。

重做日誌與二進位制日誌的區別:

1)二進位制日誌會記錄所有與mysql有關的日誌記錄,包括InnoDB等其他儲存引擎的日誌,而InnoDB儲存引擎的重做日誌只記錄有關其本身的事務日誌,

2)記錄的內容不容,不管你將二進位制日誌檔案記錄的格式設為哪一種,其記錄的都是關於一個事務的具體操作內容,而InnoDB儲存引擎的重做日誌檔案記錄的關於每個頁的.更改的物理情況;

3)寫入的時間也不同,二進位制日誌檔案是在事務提交前進行記錄的,而在事務進行的過程中,不斷有重做日誌條目被寫入重做日誌檔案中。

從日誌緩衝寫入磁碟上的重做日誌檔案的條件:

在主執行緒中每秒會將重做日誌緩衝寫入磁碟的重做日誌檔案中,不論事務是否提交。另一個觸發這個過程是由引數innodb_flush_log_at_trx_commit控制,表示在提交時,處理重做日誌的方式。

引數innodb_flush_log_at_trx_commit可設的值有0、1、2,0代表當提交事務時,並不將事務的重做日誌寫入磁碟上的日誌檔案,而是等待主執行緒每秒的重新整理,而1和2不同的地方在於:1是在commit時將重做日誌緩衝同步寫到磁碟;2是重做日誌非同步寫到磁碟,即不能完全保證commit時肯定會寫入重做日誌檔案,只是有這個動作。

值得注意的一點:因為重做日誌有個capacity變數,該值代表了最後的檢查點不能超過這個閥值。