突然斷電,是否會影響Mysql的執行結果
MySQL採用buffer機制,避免每次讀寫進行磁碟IO,提升效率:
- 《緩衝池(buffer pool)》
- 《寫緩衝(change buffer)》
- 《日誌緩衝(log buffer)》
- 第一步:頁資料先memcopy到DWB的記憶體裡;
- 第二步:DWB的記憶體裡,會先刷到DWB的磁碟上;
- 第三步:DWB的記憶體裡,再刷到資料磁碟儲存上;
- InnoDB檢測到上一次為異常關閉;
- 嘗試恢復ibd資料,失敗;
- 從DWB中恢復寫了一半的頁;
- 第一步,頁資料memcopy到DWB的記憶體,速度很快;
- 第二步,DWB的記憶體fsync刷到DWB的磁碟,屬於順序追加寫,速度也很快;
- 第三步,刷磁碟,隨機寫,本來就需要進行,不屬於額外操作;
- write-ahead-log之所以效能高,就是因為順序追加寫;
- 有第三方測評,評估約10%效能損失;
- Innodb_dblwr_pages_written:記錄寫入DWB中頁的數量。
- Innodb_dblwr_writes:記錄DWB寫操作的次數。
MySQL的buffer一頁的大小是16K,檔案系統一頁的大小是4K,也就是說,MySQL將buffer中一頁資料刷入磁碟,要寫4個檔案系統裡的頁。
如上圖所示,MySQL裡page=1的頁,物理上對應磁碟上的1+2+3+4四個格。
那麼,問題來了,這個操作並非原子,如果執行到一半斷電,會不會出現問題呢?
會,這就是所謂的“頁資料損壞”。
如上圖所示,MySQL內page=1的頁準備刷入磁碟,才刷了3個檔案系統裡的頁,掉電了,則會出現:重啟後,page=1的頁,物理上對應磁碟上的1+2+3+4四個格,資料完整性被破壞。
畫外音:redo無法修復這類“頁資料損壞”的異常,修復的前提是“頁資料正確”並且redo日誌正常。
很容易想到的方法是,能有一個“副本”,對原來的頁進行還原,這個儲存“副本”的地方,就是Double Write Buffer。
Double Write Buffer,但它與傳統的buffer又不同,它分為記憶體和磁碟的兩層架構。
畫外音:傳統的buffer,大部分是記憶體儲存;而DWB裡的資料,是需要落地的。
如上圖所示,當有頁資料要刷盤時:
畫外音:DWB由128個頁構成,容量只有2M。
步驟2和步驟3要寫2次磁碟,這就是“Double Write”的由來。
假設步驟2掉電,磁碟裡依然是1+2+3+4的完整資料。
畫外音:只要有頁資料完整,就能通過redo還原資料。
假如步驟3掉電,DWB裡儲存著完整的資料。
所以,一定不會出現“頁資料損壞”問題。
畫外音:寫了2次,總有一個地方的資料是OK的。
自己實驗了幾十次,仍沒能復現“頁資料損壞”,在網上找了一個“頁資料損壞”時,MySQL重啟過程利用DWB修復頁資料的圖。
可以看到,啟動過程中:
分析DWB執行的三個步驟:
另外,128頁(每頁16K)2M的DWB,會分兩次刷入磁碟,每次最多64頁,即1M的資料,執行也是非常之快的。
綜上,效能會有所影響,但影響並不大。
畫外音:
更具體的,InnoDB裡有兩個變數可以檢視double write buffer相關的情況:
可以通過:
show global status like "%dblwr%"
來進行查詢。
MySQL有很強的資料安全性機制:
double write buffer:
知其然,知其所以然。
思路比結論重要,希望大家有收穫。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2890243/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 判斷ssh遠端命令是否執行結束
- CSS3實現動畫不會影響主執行緒,JS實現動畫會影響主執行緒CSSS3動畫執行緒JS
- “JIT”供應鏈政策是否會對電子零部件行業產生不利影響?行業
- cluster factor對執行計劃的影響
- 評“MySQL 隱式轉換引起的執行結果錯誤”MySql
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 網站部署SSL證書是否會影響網站流量?網站
- sessionInfo()使用技巧--是否事先library()的影響Session
- mysql事務對效率的影響分析總結JILEMySql
- MYSQL 一個特殊需求在不同的MYSQL配置產生不同的結果 與 update 0 是否需要應用程式判斷MySql
- Java非同步判斷執行緒池所有任務是否執行完成的方法Java非同步執行緒
- 淺析CPU結構對程式的影響以及熔斷原理
- 判斷 Eloqument 模型查詢資料結果是否為空模型
- 探索webpack熱更新對程式碼打包結果的影響(二)Web
- 獲取任務的執行結果
- return與finally的執行順序的影響(skycto JEEditor)
- SQL Server資料庫判斷最近一次的備份執行結果SQLServer資料庫
- shell:nohup (在系統後臺不掛起地執行命令,退出終端不會影響程式的執行)
- 第49問:如何快速判斷 IO 延遲對 MySQL 效能的影響MySql
- IO多路複用和多執行緒會影響Redis分散式鎖嗎?執行緒Redis分散式
- Linux判斷上一個語句是否執行成功Linux
- 影響獨立伺服器穩定執行的因素伺服器
- 大量蘋果高階服務中斷,iPhone使用者受到影響蘋果iPhone
- Java獲取多執行緒執行結果方式的歸納與總結Java執行緒
- 蘋果釋出會後的這些更新將影響你的iOS App蘋果iOSAPP
- MySQL判斷表名是否存在MySql
- mysql如何判斷是否為空MySql
- HTTP對網路速度是否有影響?HTTP
- 多執行緒並行執行,然後彙總結果執行緒並行
- 影響mysql效能的因素都有哪些MySql
- 影響MySQL效能的硬體因MySql
- 影響MySQL效能的硬體因素MySql
- 5G網路是否會影響直播帶貨app原始碼的發展APP原始碼
- 實驗總結分析報告 ——從系統的角度分析影響程式執行效能的因素
- 【Spark】 Spark作業執行原理--獲取執行結果Spark
- 在首頁判斷是否登入並執行登陸
- MySQL中UPDATE語句裡SET後使用AND的執行過程和結果分析MySql
- 你知道CPU結構也會影響Redis效能嗎?Redis