innodb的redo log以及與binary log的區別

myownstars發表於2013-03-05

innoDB重做日誌

記錄資料庫頁的變化,諸如space id/page no/operation code/data,大致原理等同於oracle redo log,可用於crash recovery,但是其功能有一定侷限。

執行crash recovery時所操作的頁必須是consistent,如果頁已經損壞則無法recover,幸好及時引入了double write功能

 

日誌頭儲存著最近一次checkpoint資訊,日誌以記錄而非頁的方式寫入,採用512位元組對齊(與磁碟扇區同等)SSD可以設定4096位元組;

 

Redo log不能歸檔,因此必須迴圈利用,其相應設定引數為innodb_log_file_size/innodb_log_files_in_group/innodb_log_group_home_dir

選擇合適的檔案大小對innodb寫效能至關重要,通常一個檔案至少能夠容納一個小時的日誌量

 

Mysql採用fuzzy checkpoint機制,每次讀取最老的髒頁而非全部髒頁,將其LSN作為檢查點記錄到日誌檔案(這之前的LSN對應的日誌和資料都寫入檔案,不需要恢復)

恢復資料檔案時,innodb掃描日誌檔案的檢查點資訊,只恢復page LSN> checkpoint LSN的內容

 

redo log重新整理條件

每秒重新整理一次,由master thread執行;

事務commit,由引數innodb_flush_log_at_trx_commit決定,0表示不重新整理,1同步重新整理,2非同步重新整理至磁碟

 

相關引數

Innodb_log_buffer_size:快取redo log以待重新整理至磁碟,預設8M;經常發生大事務的時候可適當調大;

Innodb_log_file_size:日誌檔案大小,預設5M,上限為4G(InnoDB最初只為32位系統設計);越大則檢查點發生次數就越少,但crash recovery時間就越長;

Innodb_log_files_in_group:日誌檔案數量,預設為2,上限100

Innodb_flush_log_at_trx_commit

oracle一樣,commit返回前提交所有的redo log,不同的是,innodb提供innodb_flush_log_at_trx_commit引數定製化commit返回時日誌是否重新整理到磁碟,

innodb_flush_log_at_trx_commit = 0 /* Write log buffer to log about once a second and flush */

innodb_flush_log_at_trx_commit = 1 /* Write log buffer to log and flush to disk */

innodb_flush_log_at_trx_commit = 2 /* Write log buffer to log and flush about once per second */

 

設定為1 時資料庫crash仍能保證資料一致性,而作業系統crash則可能導致部分redo丟失;

可使用有備用電池的儲存與之互補,即提升速度又能保證資料一致性

 

 

二進位制日誌

頭部有4位元組偏移量;

二進位制日誌以格式描述事件開始,日誌輪換時間結束;

格式描述事件包括該檔案的版本號/mysql版本以及日誌資訊, 以及標誌binlog是否正常關閉;日誌輪換包含下一個binlog名稱;

根據複製方式不同,二進位制記錄的內容也不一樣:

statement記錄sql本身;

row則以二進位制形式呈現,每1行可能包含前映象或後映象,包含3中型別write_rows_log_event/update_rows_log_event/delete_rows_log_event

 

何時重新整理

Sync_binlog:預設為0,如果設定為N,則在Nbinlog寫後呼叫fdatasync()將其重新整理至磁碟;使用autocommit1sql1次寫,否則1個事務為1次寫;

N=1的安全度最高,在mysql crash時最多丟失一個事務,但也最慢;

 

相關引數

Max_binlog_size:規定binlog的最大尺寸,範圍為4k – 1G

binlog_cache_size:每個客戶端分配一個,當伺服器支援事務引擎且啟用bin log時使用,用於記錄事務快取以便寫入binlog

此引數有個演化史:

5.5.3 – 5.5.8:非事務語句也分配同等大小的binlog cache,實際分配的cache為此引數的2倍;

5.5.9引入binglog_stmt_cache_size,專門分配非事務語句;

與之對應的還有max_binlog_cache_size,假定某事務大小超過此設定,會抱錯generates a Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage

 

 

與二進位制日誌區別

二進位制日誌記錄所有引擎的日誌,而重做日誌只記錄InnoDB

2二進位制日誌記錄事務的具體操作內容,而後者記錄每個頁更改的物理情況

3前者用於point-in-time恢復,後者用於crash recovery;如果mysql發生介質損壞,則需要從備份中恢復然後應用binary log執行point-in-time recovery

4 bin log大小達到上限或者flush log會生成一個新的檔案,而redo log只能迴圈利用

5 bin log有索引檔案,儲存所有bin log檔案列表

6 bin log可由每個執行緒寫(加鎖以避免混亂),而redo log只能由master thread

 

什麼是double write buffer

2部分:記憶體中的buffer(2M);共享表空間中連續的128(2M);重新整理髒頁時先透過memcpy將其複製到doublewrite buffer,接著分2次將其重新整理到共享表空間,然後呼叫fsync同步髒頁到磁碟;

即先將髒資料順序寫入共享表空間,然後再呼叫fsync寫入資料檔案,如果此時OS崩潰,recovery時可以從共享表空間找到該頁的副本,將其copy的資料檔案然後應用redo log

由引數innodb_doublewrite決定,預設為true

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-755325/,如需轉載,請註明出處,否則將追究法律責任。

相關文章