InnoDB髒頁重新整理機制
我們知道InnoDB採用Write Ahead Log策略來防止當機資料丟失,即事務提交時,先寫重做日誌,再修改記憶體資料頁,
這樣就產生了髒頁。既然有重做日誌保證資料永續性,查詢時也可以直接從緩衝池頁中取資料,那為什麼還要重新整理髒頁
到磁碟呢?如果重做日誌可以無限增大,同時緩衝池足夠大,能夠快取所有資料,那麼是不需要將緩衝池中的髒頁重新整理
到磁碟。但是,通常會有以下幾個問題:
伺服器記憶體有限,緩衝池不夠用,無法快取全部資料
重做日誌無限增大成本要求太高
當機時如果重做全部日誌恢復時間過長
事實上,當資料庫當機時,資料庫不需要重做所有的日誌,只需要執行上次刷入點之後的日誌。這個點就叫做Checkpoint,
它解決了以上的問題:
縮短資料庫恢復時間
緩衝池不夠用時,將髒頁重新整理到磁碟
重做日誌不可用時,重新整理髒頁
重做日誌被設計成可迴圈使用,當日志檔案寫滿時,重做日誌中對應資料已經被重新整理到磁碟的那部分不再需要的日誌可以被
覆蓋重用。
InnoDB引擎透過LSN(Log Sequence Number)來標記版本,LSN是日誌空間中每條日誌的結束點,用位元組偏移量來表示。
每個page有LSN,redo log也有LSN,Checkpoint也有LSN。可以透過命令show engine innodb status來觀察:
---
LOG
---
Log sequence number 11102619599
Log flushed up to 11102618636
Last checkpoint at 11102606319
0 pending log writes, 0 pending chkp writes
15416290 log i/o's done, 12.32 log i/o's/second
Checkpoint機制每次重新整理多少頁,從哪裡取髒頁,什麼時間觸發重新整理?這些都是很複雜的。有兩種Checkpoint,分別為:
Sharp Checkpoint
Fuzzy Checkpoint
Sharp Checkpoint發生在關閉資料庫時,將所有髒頁刷回磁碟。在執行時使用Fuzzy Checkpoint進行部分髒頁的重新整理。
部分髒頁重新整理有以下幾種:
Master Thread Checkpoint
FLUSH_LRU_LIST Checkpoint
Async/Sync Flush Checkpoint
Dirty Page too much Checkpoint
Master Thread Checkpoint
Master Thread以每秒或每十秒的速度從緩衝池的髒頁列表中重新整理一定比例的頁回磁碟。這個過程是非同步的,不會阻塞查詢
執行緒。
FLUSH_LRU_LIST Checkpoint
InnoDB要保證LRU列表中有100左右空閒頁可使用。在InnoDB1.1.X版本前,要檢查LRU中是否有足夠的頁用於使用者查詢
操作執行緒,如果沒有,會將LRU列表尾端的頁淘汰,如果被淘汰的頁中有髒頁,會強制執行Checkpoint刷回髒頁資料到
磁碟,顯然這會阻塞使用者查詢執行緒。從InnoDB1.2.X版本開始,這個檢查放到單獨的Page Cleaner Thread中進行,
並且使用者可以透過innodb_lru_scan_depth控制LRU列表中可用頁的數量,預設值為1024。
Async/Sync Flush Checkpoint
是指重做日誌檔案不可用時,需要強制將髒頁列表中的一些頁重新整理回磁碟。這可以保證重做日誌檔案可迴圈使用。
在InnoDB1.2.X版本之前,Async Flush Checkpoint會阻塞發現問題的使用者查詢執行緒,Sync Flush Checkpoint會阻塞
所有查詢執行緒。InnoDB1.2.X之後放到單獨的Page Cleaner Thread。
Dirty Page too much Checkpoint
髒頁數量太多時,InnoDB引擎會強制進行Checkpoint。目的還是為了保證緩衝池中有足夠可用的空閒頁。其可以透過
引數innodb_max_dirty_pages_pct來設定:
mysql> show variables like 'innodb_max_dirty_pages_pct';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| innodb_max_dirty_pages_pct | 60 |
+----------------------------+-------+
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2374976/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL InnoDB髒頁管理MySql
- MySQL學習筆記 - 髒頁重新整理策略MySql筆記
- 關於ORACLE 和MYSQL INNODB 觸發髒資料寫的機制對比OracleMySql
- Innodb關鍵特性之重新整理鄰接頁
- RecyclerView重新整理機制View
- MySQL InnoDB 中的鎖機制MySql
- InnoDB 崩潰恢復機制
- MySQL InnoDB檢查點機制MySql
- 【MySQL】InnoDB鎖機制之一MySql
- MySQL 引擎特性:InnoDB 同步機制MySql
- 【MySQL】InnoDB鎖機制之二MySql
- PostgreSQL的"double buffers"刷髒機制和引數SQL
- AngularJS 的髒值檢查和事件機制AngularJS事件
- Android View重新整理機制AndroidView
- 分頁機制
- InnoDB儲存引擎鎖機制(一、案例)儲存引擎
- Android 螢幕重新整理機制Android
- 頁面渲染機制
- innodb master執行緒的工作機制AST執行緒
- dba_tab_modifications的重新整理機制
- InnoDB儲存引擎——重新整理鄰接頁、啟動、關閉和恢復儲存引擎
- mySql\oracle分頁機制MySqlOracle
- MySQL學習之flush(刷髒頁)MySql
- 一文說清 InnoDB 的事務機制
- 資料庫系列:MySQL InnoDB鎖機制介紹資料庫MySql
- IOS Widget(5):小元件重新整理機制iOS元件
- 全面瞭解mysql鎖機制(InnoDB)與問題排查MySql
- InnoDB儲存引擎鎖機制(五、 常見問題)儲存引擎
- InnoDB儲存引擎鎖機制(二、 鎖的型別)儲存引擎型別
- 面試題:瞭解MySQL的Flush-List嗎?順便說一下髒頁的落盤機制!(文末送書)面試題MySql
- InnoDB儲存引擎鎖機制(三、鎖的演算法)儲存引擎演算法
- MySQL學習系列之InnoDB下事務隔離機制MySql
- mysql-innodb 日誌機制分析----寫在死鎖前面MySql
- Linux的磁碟快取和刷髒頁Linux快取
- 瀏覽器頁面渲染機制瀏覽器
- 分頁機制圖文詳解
- 淺析前端頁面渲染機制前端
- 理解Window的新增,刪除,重新整理內部機制