生活随笔
收集整理的這篇文章主要介紹了
InnoDB的ib_logfile写入策略
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
ib_logfile是InnoDB的事務日志文件。本文簡要說明其寫入時機、寫入策略及如何保證數據安全。
1、?基本概念
redo是物理日志,記錄的是頁的物理修改操作,是冪等的。ib_logfile文件個數由innodb_log_files_in_group配置決定,若為2,則在datadir目錄下有兩個文件,命令從0開始,分別為ib_logfile0和ib_logfile.文件為順序寫入,當達到最后一個文件末尾時,會從第一個文件開始順序復用。lsn: Log Sequence Number,是一個遞增的整數。?Ib_logfile中的每次寫入操作都包含至少1個log,每個log都帶有一個lsn。在內存page修復過程中,只有大于page_lsn的log才會被使用。lsn的保存在全局內存結構log_sys中。遞增數值等于每個log的實際內容長度。即如果新增的一個log長度是len,則log_sys->lsn += len.ib_logfile每次寫入以512(OS_FILE_LOG_BLOCK_SIZE)字節為單位。實際寫入函數?log_group_write_buf(log/log0log.c)每次寫盤后是否flush,由參數innodb_flush_log_at_trx_commit控制。 2、?log_sys介紹
log_sys是一個全局內存結構。以下說明幾個成員的意義。
| lsn | 表示已經分配的最后一個lsn的值。 |
| written_to_all_lsn | n表示實際已經寫盤的lsn。需要這個值是因為并非每次生成log后就寫盤。 |
| flushed_to_disk_lsn | 表示刷到磁盤的lsn。需要這個值是因為并非每次寫盤后就flush。 |
| buf | 待寫入的內容保存在buf中 |
| buf_size | buf的大小。由配置中innodb_log_buffer_size決定,實際大小為innodb_log_buffer_size /16k * 16k。 |
| buf_next_to_write | buf中下一個要寫入磁盤的位置 |
| buf_free ? | buf中實際內容的最后位置。當buf_free> buf_next_to_write時,說明內存中還有數據未寫盤。 |
3、相關更新
用一個簡單的更新語句來說明log_sys以及ib_logfile的更新內容的過程。假設我們的更新只涉及到非索引的固定長度字段。
在bufferpool中寫入undo log。?對于一個單一的語句,需要先創建一個undolog頭。在bufferpool中寫入undo log的實際內容。在log_sys->buf中寫入buffer page的更新內容。此處保存了更新的完整信息。在log_sys->buf中寫入啟動事務(trx_prepare)的日志將c、d更新的log內容寫入ib_logfile中。在log_sys->buf中寫入事務結束(trx_commit)的日志將f步驟的log內容寫入ib_logfile中。 4、?說明
完成上述所有操作時,數據文件還沒有更新。
每次寫入log_sys->buf時同時更新lsn和buf_free。?每次寫ib_logfile時同時更新written_to_all_lsn和buf_next_to_write;每次寫ib_logfile時以512字節為對齊,如需寫入600字節,則實際寫入1k。寫到最后一個文件末尾則從第一個文件重復使用。從上述流程看到,在a~d過程中若出現異常關閉,由于沒有寫入到磁盤中,因此整個事務放棄;若在e剛完成時出現異常關閉,雖然事務內容已經寫盤,但沒有提交。在重啟恢復的時候,發現這個事務還沒有提交,邏輯上整個事務放棄。?(重啟日志中會有Found 1 prepared transaction(s) in InnoDB字樣)。在g完成后出現異常關閉,則能夠在重啟恢復中正常提交。在e和f之間會寫mysql的bin-log,若bin-log寫完前異常關閉,事務無效,bin-log寫入成功后,則異常重啟后能夠根據bin-log恢復事務的修改。若涉及到索引更新,在步驟c之后會增加索引更新的log。由于索引可能有merge過程,因此在merge過程中會另外增加寫入一個log。但事務完全提交仍在步驟g中。索引的更新由于已經寫盤,并不會因此丟失。?
?
更改innodb_log_file_size, 解決InnoDB: ERROR: the ag...
轉載于:https://my.oschina.net/anxiaole/blog/2222723
總結
以上是生活随笔為你收集整理的InnoDB的ib_logfile写入策略的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。