合買源碼搭建建與MySQL · 引擎特性

來源:互聯網
上載者:User

標籤:arch   group   整數   file   poi   inno   寫入檔案   工作原理   number   

一 序
本文根據《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 · 引擎特性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.