突然斷電,是否會影響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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CSS3實現動畫不會影響主執行緒,JS實現動畫會影響主執行緒CSSS3動畫執行緒JS
- 執行結果
- 詳解表連線順序和連線方式是否影響查詢結果
- DDL,DML操作對結果快取的影響快取
- 執行緒安全的單態類會影響效能麼?執行緒
- 判斷ssh遠端命令是否執行結束
- 堪薩斯大學:研究發現盜版電影不會給電影行業帶來太大影響行業
- MySQL執行計劃explain輸出列結果解析MySqlAI
- 熔斷器 Hystrix 原始碼解析 —— 執行結果快取原始碼快取
- “JIT”供應鏈政策是否會對電子零部件行業產生不利影響?行業
- SQL查詢結果集對注入的影響及利用SQL
- 評“MySQL 隱式轉換引起的執行結果錯誤”MySql
- 探索webpack熱更新對程式碼打包結果的影響(二)Web
- 探索webpack熱更新對程式碼打包結果的影響(一)Web
- 小議分析函式中排序對結果的影響(二)函式排序
- 小議分析函式中排序對結果的影響(一)函式排序
- DBA手記 - optimizer_mode影響一個SQL語句是否可以執行SQL
- cluster factor對執行計劃的影響
- 淺析影響專案執行的因素
- 判斷 Eloqument 模型查詢資料結果是否為空模型
- 獲取任務的執行結果
- 解析Oracle執行計劃的結果Oracle
- 網站部署SSL證書是否會影響網站流量?網站
- 判斷當前程式是否正在執行
- 判斷某過程是否在執行的方法
- 淺析影響專案執行的因素(續)
- 索引及排序對執行計劃的影響索引排序
- try catch 對程式碼執行的效能影響
- MYSQL 一個特殊需求在不同的MYSQL配置產生不同的結果 與 update 0 是否需要應用程式判斷MySql
- SQL Server資料庫判斷最近一次的備份執行結果SQLServer資料庫
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 關於多個執行緒同時呼叫單例模式的物件,該物件中方法的區域性變數是否會受多個執行緒的影響執行緒單例模式物件變數
- Hint 組合執行步驟 - 分開執行, 互不影響
- Android判斷服務是否在執行Android
- 淺析CPU結構對程式的影響以及熔斷原理
- mysql事務對效率的影響分析總結JILEMySql
- CLUSTERING_FACTOR影響執行計劃
- 執行緒數目對資料庫的影響執行緒資料庫