InnoDB儲存引擎——兩次寫
Insert Buffer給InnoDB儲存引擎帶來的是效能上的提升,doublewrite(兩次寫)給InnoDB儲存引擎帶來的是資料頁的可靠性。
當資料庫發生當機時,可能InnoDB儲存引擎正在寫入某個頁表中,而這個頁只寫了一部分,比如16K的頁,只寫了前4K,之後就發生了當機,這種情況被稱為部分寫失效。
在InnoDB儲存引擎未使用doublewrite技術前,曾經出現過因為部分寫失效而導致資料丟失的情況。
doublewrite由兩部分組成,一部分是記憶體中的doublewrite buffer,大小為2MB,另一部分是物理磁碟上共享表空間中連續的128個頁,即2個區(extent),大小也為2MB。
第一次寫:在對緩衝池的髒頁進行重新整理時,並不直接寫磁碟,而是會通過memcpy函式將髒頁先複製到記憶體中的doublewrite buffer,之後通過doublewrite buffer再分兩次,每次1MB順序地寫入共享表空間的物理磁碟上,然後馬上呼叫fsync函式,同步磁碟,避免緩衝寫帶來的問題。這個過程中是順序寫的,所以開銷並不大。
第二次寫:在完成doublewrite頁的寫入後,再將doublewrite buffer中的頁寫入各個表空間檔案中,此時的寫入是離散的。
可以通過下面的命令觀察到doublewrite執行的情況:
mysql> show global status like 'innodb_dblwr%'\G
*************************** 1. row ***************************
Variable_name: Innodb_dblwr_pages_written
Value: 0
*************************** 2. row ***************************
Variable_name: Innodb_dblwr_writes
Value: 0
2 rows in set (0.03 sec)
從上面可以看出doublewirte一共寫了Innodb_dblwr_pages_written個頁,但實際的寫入次數為Innodb_dblwr_writes。
如果作業系統在第二次寫的時候,也就是從doublewrite buffer中將頁寫入到磁碟的過程中發生了崩潰,在恢復過程中,InnoDB儲存引擎可以從共享表空間中的doublewrite中找到該頁的一個副本,將其複製到表空間中,再應用重做日誌。
Innodb_buffer_pool_pages_flushed變數表示當前緩衝池中重新整理到磁碟頁的數量。因為在預設情況下,緩衝中的所有頁首先都需要放入到doublewrite中,因此該變數應該和Innodb_dblwr_pages_written一致。
引數skip_innodb_doulewrite可以禁止使用doublewrite功能,不過這時可能會引起前面說的寫失效問題。
有些檔案系統本身就提供了部分寫失效的防範機制,比如ZFS檔案系統。在這種情況下,使用者就不要啟動doublewrite了。
相關文章
- MyISAM 儲存引擎,Innodb 儲存引擎儲存引擎
- Innodb儲存引擎儲存引擎
- InnoDB儲存引擎——表儲存引擎
- MySQL InnoDB儲存引擎MySql儲存引擎
- InnoDB儲存引擎簡介儲存引擎
- InnoDB儲存引擎檔案儲存引擎
- Mysql技術內幕InnoDB儲存引擎讀書筆記--《二》InnoDB儲存引擎MySql儲存引擎筆記
- MySQL InnoDB 儲存引擎探祕MySql儲存引擎
- InnoDB儲存引擎——記憶體儲存引擎記憶體
- InnoDB儲存引擎——Checkpoint技術儲存引擎
- InnoDB儲存引擎——插入緩衝儲存引擎
- InnoDB儲存引擎——非同步IO儲存引擎非同步
- MySQL兩種儲存引擎: MyISAM和InnoDB 簡單總結MySql儲存引擎
- 【轉】Mysql兩種儲存引擎的異同【MyISAM和InnoDB】MySql儲存引擎
- 你真的瞭解Innodb儲存引擎?儲存引擎
- InnoDB儲存引擎MVCC實現原理儲存引擎MVC
- 14.1 InnoDB 儲存引擎介紹儲存引擎
- innodb儲存引擎備份工具--Xtrabackup儲存引擎
- 第二章 InnoDB儲存引擎儲存引擎
- [Mysql技術內幕]Innodb儲存引擎MySql儲存引擎
- InnoDB儲存引擎鎖機制(一、案例)儲存引擎
- innodb儲存引擎鎖的實現(一)儲存引擎
- MySQL InnoDB儲存引擎體系結構MySql儲存引擎
- 《MySQL 效能優化》之 InnoDB 儲存引擎MySql優化儲存引擎
- InnoDB儲存引擎——後臺執行緒儲存引擎執行緒
- MySQL儲存引擎--MyISAM與InnoDB區別MySql儲存引擎
- MySQL技術內幕:InnoDB儲存引擎MySql儲存引擎
- MySQLInnoDB儲存引擎(一):精談innodb的儲存結構MySql儲存引擎
- MySQL常見的兩種儲存引擎:MyISAM與InnoDB的愛恨情仇MySql儲存引擎
- MyISAM與innoDB儲存引擎有何差別儲存引擎
- MySQL儲存引擎:MyISAM和InnoDB的區別MySql儲存引擎
- InnoDB儲存引擎——Master Thread工作方式儲存引擎ASTthread
- InnoDB儲存引擎——自適應雜湊索引儲存引擎索引
- MySQL儲存引擎MyISAM與InnoDB的優劣MySql儲存引擎
- Mysql核心:INNODB儲存引擎--《十一》Insert BufferMySql儲存引擎
- MySQL核心InnoDB儲存引擎(卷1)筆記MySql儲存引擎筆記
- Mysql innodb儲存引擎的效能最佳化MySql儲存引擎
- 總結MySQL儲存引擎MyISAM與InnoDB區別MySql儲存引擎