合買源碼搭建建與MySQL · 引擎特性
阿新 • • 發佈:2018-08-08
大小 產生 innodb ash 執行 緩沖區 和數 隨著 home 一 序
本文根據《MYSQL運維內參》第11章INNODB日誌管理機制整理,本篇書上側重於原理說明日誌的生成、格式、工作原理、刷盤機制等。限於篇幅,崩潰恢復的需要單獨整理。InnoDB 有兩塊非常重要的日誌,一個是undo log,另外一個是redo log,前者用來保證事務的原子性以及InnoDB的MVCC,後者用來保證事務的持久性。解釋下redolog與事務持久性:redo log用來數據異常恢復和數據庫重啟時頁數據同步恢復,redo log是建立在在mini transaction基礎上。數據庫在執行事務時,通過minitransaction產生redo log來保證事務的持久性。合買源碼搭建QQ:2152876294 網址diguaym.com
本文根據《MYSQL運維內參》第11章INNODB日誌管理機制整理,本篇書上側重於原理說明日誌的生成、格式、工作原理、刷盤機制等。限於篇幅,崩潰恢復的需要單獨整理。InnoDB 有兩塊非常重要的日誌,一個是undo log,另外一個是redo log,前者用來保證事務的原子性以及InnoDB的MVCC,後者用來保證事務的持久性。解釋下redolog與事務持久性:redo log用來數據異常恢復和數據庫重啟時頁數據同步恢復,redo log是建立在在mini transaction基礎上。數據庫在執行事務時,通過minitransaction產生redo log來保證事務的持久性。合買源碼搭建QQ:2152876294 網址diguaym.com
和大多數關系型數據庫一樣,InnoDB記錄了對數據文件的物理更改,並保證總是日誌先行,也就是所謂的WAL(log write ahead),即在持久化數據文件前,保證之前的redo日誌已經寫到磁盤。 LSN(log sequence number) 用於記錄日誌序號,它是一個不斷遞增的 unsigned long long 類型整數。在 InnoDB 的日誌系統中,LSN 無處不在,它既用於表示修改臟頁時的日誌序號,也用於記錄checkpoint,通過LSN,可以具體的定位到其在redo log文件中的位置。LSN在引擎中定義的是一個dulint_t類型值。源碼在innobase/include/log0log.h
/ Type used for all log sequence number storage and arithmetics /
typedef ib_uint64_t lsn_t;
LSN的含義是儲存引擎向重做日誌系統寫入的日誌量(字節數),這個日誌量包括寫入的日誌字節 + LOG_BLOCK_HDR_SIZE + LOG_BLOCK_TRL_SIZE;代碼參見函數log_write_low(源碼在innobase/log/log0log.cc)。在調用日誌寫入函數LSN就一直隨著寫入的日誌長度增加,它是一個集物理意義與邏輯意義與一體的。
為了管理臟頁,在 Buffer Pool 的每個instance上都維持了一個flush list,flush list 上的 page 按照修改這些 page 的LSN號進行排序。因此定期做redo checkpoint點時,選擇的 LSN 總是所有 bp instance 的 flush list 上最老的那個page(擁有最小的LSN)。由於采用WAL的策略,每次事務提交時需要持久化 redo log 才能保證事務不丟。而延遲刷臟頁則起到了合並多次修改的效果,避免頻繁寫數據文件造成的性能問題。 innodb在5.6設計了3個層模塊,即redo log buffer(redo log的日誌內存緩沖區)、group files( redo log文件組)和archive files( 歸檔日誌文件)。由於 InnoDB 日誌組的特性已經被廢棄(redo日誌寫多份),歸檔日誌(archive log)特性也在5.7被徹底移除,所以不做展開。
好吧,雖然上面都是常識,但是對於初次接觸的還是要理解下。因為百度出來的文章不一定是基於那個版本。
二 InnoDB 日誌文件
InnoDB的redo log可以通過參數innodb_log_files_in_group配置成多個文件,另外一個參數innodb_log_file_size表示每個文件的大小。因此總的redo log大小為innodb_log_files_in_group * innodb_log_file_size。
Redo log文件以ib_logfile[number]命名,日誌目錄可以通過參數innodb_log_group_home_dir控制。Redo log 以順序的方式寫入文件文件,寫滿時則回溯到第一個文件,進行覆蓋寫
在InnoDB內部,邏輯上ib_logfile被當成了一個文件,對應同一個space id。由於是使用512字節block對齊寫入文件,可以很方便的根據全局維護的LSN號計算出要寫入到哪一個文件以及對應的偏移量。
Redo log文件是循環寫入的,在覆蓋寫之前,總是要保證對應的臟頁已經刷到了磁盤。在非常大的負載下,Redo log可能產生的速度非常快,導致頻繁的刷臟操作,進而導致性能下降,通常在未做checkpoint的日誌超過文件總大小的76%之後,InnoDB 認為這可能是個不安全的點,會強制的preflush臟頁,導致大量用戶線程stall住。
除了redo log文件外,InnoDB還有其他的日誌文件,例如為了保證truncate操作而產生的中間日誌文件,包括 truncate innodb 表以及truncate undo log tablespace,都會產生一個中間文件,來標識這些操作是成功還是失敗,如果truncate沒有完成,則需要在 crash recovery 時進行重做。
Log Block
合買源碼搭建建與MySQL · 引擎特性