mysql之 double write 淺析
http://blog.itpub.net/22664653/viewspace-1140915/
介紹double write之前我們有必要了解partial page write 問題 :
InnoDB 的Page Size一般是16KB,其資料校驗也是針對這16KB來計算的,將資料寫入到磁碟是以Page為單位進行操作的。而計算機硬體和作業系統,在極端情況下(比如斷電)往往並不能保證這一操作的原子性,16K的資料,寫入4K 時,發生了系統斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題。
很多DBA 會想到系統恢復後,MySQL 可以根據redolog 進行恢復,而mysql在恢復的過程中是檢查page的checksum,checksum就是pgae的最後事務號,發生partial page write 問題時,page已經損壞,找不到該page中的事務號,就無法恢復。
一 double write是什麼?
Double write 是InnoDB在 tablespace上的128個頁(2個區)是2MB;
其原理:
為了解決 partial page write 問題 ,當mysql將髒資料flush到data file的時候, 先使用memcopy 將髒資料複製到記憶體中的double write buffer ,之後透過double write buffer再分2次,每次寫入1MB到共享表空間,然後馬上呼叫fsync函式,同步到磁碟上,避免緩衝帶來的問題,在這個過程中,doublewrite是順序寫,開銷並不大,在完成doublewrite寫入後,在將double write buffer寫入各表空間檔案,這時是離散寫入。
如果發生了極端情況(斷電),InnoDB再次啟動後,發現了一個Page資料已經損壞,那麼此時就可以從doublewrite buffer中進行資料恢復了。
二double write的缺點是什麼?
位於共享表空間上的double write buffer實際上也是一個檔案,寫DWB會導致系統有更多的fsync操作, 而硬碟的fsync效能, 所以它會降低mysql的整體效能. 但是並不會降低到原來的50%. 這主要是因為:
1) double write 是一個連線的儲存空間, 所以硬碟在寫資料的時候是順序寫, 而不是隨機寫, 這樣效能更高.
2) 將資料從double write buffer寫到真正的segment中的時候, 系統會自動合併連線空間重新整理的方式, 每次可以重新整理多個pages;
三 double write在恢復的時候是如何工作的?
If there’s a partial page write to the doublewrite buffer itself, the original page will still be on disk in its real location.-
--如果是寫doublewrite buffer本身失敗,那麼這些資料不會被寫到磁碟,InnoDB此時會從磁碟載入原始的資料,然後透過InnoDB的事務日誌來計算出正確的資料,重新 寫入到doublewrite buffer.
When InnoDB recovers, it will use the original page instead of the corrupted copy in the doublewrite buffer. However, if the doublewrite buffer succeeds and the write to the page’s real location fails, InnoDB will use the copy in the doublewrite buffer during recovery.
--如果 doublewrite buffer寫成功的話,但是寫磁碟失敗,InnoDB就不用透過事務日誌來計算了,而是直接用buffer的資料再寫一遍.
InnoDB knows when a page is corrupt because each page has a checksum at the end; the checksum is the last thing to be written, so if the page’s contents don’t match the checksum, the page is corrupt. Upon recovery, therefore, InnoDB just reads each page in the doublewrite buffer and verifies the checksums. If a page’s checksum is incorrect, it reads the page from its original location.
--在恢復的時候,InnoDB直接比較頁面的checksum,如果不對的話,就從硬碟載入原始資料,再由事務日誌 開始推演出正確的資料.所以InnoDB的恢復通常需要較長的時間.
四 我們是否一定需要 double write ?
In some cases, the doublewrite buffer really isn’t necessary—for example, you might want to disable it on slaves. Also, some filesystems (such as ZFS) do the same thing themselves, so it is redundant for InnoDB to do it. You can disable the doublewrite buffer by setting InnoDB_doublewrite to 0.
五 如何使用 double write
InnoDB_doublewrite=1表示啟動double write
show status like 'InnoDB_dblwr%'可以查詢double write的使用情況;
相關引數與狀態
Double write的使用情況:
show status like "%InnoDB_dblwr%";
InnoDB_dblwr_pages_written 從bp flush 到 DBWB的個數
InnoDB_dblwr_writes 寫檔案的次數
每次寫操作合併page的個數= InnoDB_dblwr_pages_written/InnoDB_dblwr_writes
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2140255/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【MySQL】八、double write 淺析.MySql
- MySQL double writeMySql
- MySQL double write存在意義MySql
- mysql innodb double write概念彙總MySql
- MySQL的Double Write並不難理解MySql
- 【MYSQL】innodb兩次寫(double write)實現解析MySql
- MySQL的double write和Oracle對比學習MySqlOracle
- PostgreSQL DBA(20) - WAL full-page-write淺析SQL
- MySQL Replication淺析MySql
- MySql(一) 淺析MySql索引MySql索引
- MySQL 高可用淺析MySql
- 【MySQL】gap lock 淺析MySql
- MySQL高可用淺析MySql
- JavaScript之淺析PromiseJavaScriptPromise
- 淺析MySQL replace into 的用法MySql
- MySQL事務原理淺析MySql
- 【MySQL】replace into 淺析之一MySql
- 【MySQL】replace into 淺析之二MySql
- MySql(四) InnoDB事務淺析MySql
- MySQL5.7GTID淺析MySql
- 淺析Spring之IoCSpring
- 敲黑板:InnoDB的Double Write,你必須知道
- 淺析MySQL 8.0直方圖原理MySql直方圖
- MySQL核心原始碼解讀-SQL解析之解析器淺析MySql原始碼
- 淺析MySQL InnoDB的隔離級別MySql
- 技術分享 | MySQL : SSL 連線淺析MySql
- MySQL binlog相關原始碼淺析MySql原始碼
- 淺析Mysql的my.ini檔案MySql
- Flutter 之 InheritWidget 原始碼淺析Flutter原始碼
- 深入淺出Netty:writeNetty
- MySQL伺服器連線過程淺析MySql伺服器
- 淺析MySQL事務中的redo與undoMySql
- MySQL的共享鎖阻塞會話案例淺析MySql會話
- MySQL效能最佳化淺析及線上案例MySql
- MySQL 非同步驅動淺析 (一):效能分析MySql非同步
- Hadoop叢集之淺析安全模式Hadoop模式
- JAVA併發之阻塞佇列淺析Java佇列
- nginx listen指令淺析之add listenNginx