mysql innodb double write概念彙總
double write原理圖如下:
通過引入doublewrite buffer的方案,每次innodb在準備寫出一個page時,先把page寫到doublewrite buffer中.如果在寫doublewrite buffer時,發生了意外,但是資料檔案中的原來的page不受影響,這樣在下次啟動時,可以通過innodb的redolog進行恢復.如果在寫doublewrite buffer成功後,mysql會把doublewrite buffer的內容寫到資料檔案中,如果在這個過程又出現了
意外,沒有關係,重啟後mysql可以通過從doublewrite buffer找到好的page,再用該好的page去覆蓋磁碟上壞的page即可。
所以在正常的情況下,mysql寫資料page時,會寫兩遍到磁碟上,第一遍是寫到doublewrite buffer,第二遍是從doublewrite buffer寫到真正的資料檔案中.
為了解決 partial page write問題 ,當mysql將髒資料flush到data file的時候,先使用memcopy將髒資料複製到記憶體中的double write buffer,通過double write buffer再分2次,每次寫入1MB到共享表空間,然後馬上呼叫fsync函式,同步到磁碟上,避免緩衝帶來的問題。
兩次寫需要額外新增兩個部分:
1)記憶體中的兩次寫緩衝(doublewrite buffer),大小為2MB
2)磁碟上共享表空間中連續的128頁,大小也為2MB。其中120個用於批量寫髒頁,另外8個用於Single Page Flush。做區分的原因是批量刷髒是後臺執行緒做的,不影響前臺執行緒。而Single page flush是使用者執行緒發起的,需要儘快的刷髒頁並替換出一個空閒頁出來。
相關引數解釋:
(root@localhost)-[11:35:25]-[(none)]>show status like "%InnoDB_dblwr%";
+----------------------------+-----------+
| Variable_name | Value |
+----------------------------+-----------+
| Innodb_dblwr_pages_written | 882384812 |
| Innodb_dblwr_writes | 61236457 |
+----------------------------+-----------+
2 rows in set (0.01 sec)
InnoDB_dblwr_pages_written doublewrite寫的頁的總數
InnoDB_dblwr_writes doublewrite寫的檔案的次數
因為髒頁重新整理到磁碟的寫入單元小於單個頁的大小,如果在寫入過程中資料庫突然當機,可能會使資料頁的寫入不完成,
造成資料頁的損壞。而redo log中記錄的是對頁的物理操作,如果資料頁損壞了,通過redo log也無法進行恢復。
所以為了保證資料頁的寫入安全,引入了double write。double write的實現分兩個部分,一個是緩衝池中2M的記憶體塊
大小,一個是共享表空間中連續的128個頁,大小是2M。髒頁從flush list重新整理時,並不是直接重新整理到磁碟而是先呼叫
函式(memcpy),將髒頁拷貝到double write buffer中,然後再分兩次,每次1M將double write buffer 重新整理到
磁碟double write 區,之後再呼叫fsync操作,同步到磁碟。
如果是寫doublewrite buffer本身失敗,那麼這些資料不會被寫到磁碟,innodb此時會從磁碟載入原始的資料,然後通過innodb的事務日誌來計算出正確的資料,重新 寫入到doublewrite buffer。
如果應用在業務高峰期, innodb_dblwr_pages_written:innodb_dblwr_writes遠小於64:1,則說明,系統寫入壓力不大。
雖然,double write buffer重新整理到磁碟的時候是順序寫,但還是是有效能損耗的。
如果系統本身支援頁的安全性保障(部分寫失效防範機制),如ZFS,那麼就可以禁用掉該特性(skip_innodb_doublewrite)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2305483/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL double writeMySql
- 【MySQL】八、double write 淺析.MySql
- MySQL double write存在意義MySql
- 敲黑板:InnoDB的Double Write,你必須知道
- MySQL的Double Write並不難理解MySql
- MySQL知識彙總MySql
- MySQL-知識彙總MySql
- mysql 面試題彙總MySql面試題
- MySQL常用函式彙總MySql函式
- MySql 常用語法彙總MySql
- 前端佈局方式彙總及概念淺析前端
- mysql報錯程式碼彙總MySql
- MySQL8.0-新特性彙總MySql
- MySQL MVCC知識點彙總MySqlMVC
- MySQL視窗函式彙總MySql函式
- Mysql常用命令彙總MySql
- MySQL 8.0 新特性梳理彙總MySql
- MySQL 常用命令彙總MySql
- MySQL Deadlocks in InnoDBMySql
- MySQL InnoDB 索引MySql索引
- MySQL sys庫常用SQL彙總大全MySql
- MySql常用操作SQL語句彙總MySql
- mysql 索引的基礎操作彙總MySql索引
- MySQL日誌維護策略彙總MySql
- 總結MySQL儲存引擎MyISAM與InnoDB區別MySql儲存引擎
- mysql資料庫最佳化彙總MySql資料庫
- MySQL備份和恢復方法彙總MySql
- MySQL日期和時間函式彙總MySql函式
- mysql innodb索引高度MySql索引
- MySQL InnoDB update流程MySql
- 關於sass、scss、less的概念性知識彙總CSS
- Double BigDecimal 精度丟失總結Decimal
- MySQL兩種儲存引擎: MyISAM和InnoDB 簡單總結MySql儲存引擎
- 常用的MySQL中介軟體網址彙總MySql
- Mysql 常用函式(1)- 常用函式彙總MySql函式
- LeetCode 資料庫解題彙總 MySql版LeetCode資料庫MySql
- 2023最新MySQL高頻面試題彙總MySql面試題
- Vagrant box 命令彙總彙總