成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

突然掉電,為啥MySQL也不會丟失數據?

精選
數據庫 MySQL
MySQL采用buffer機制,避免每次讀寫進行磁盤IO,提升效率,那么,問題來了,這個操作并非原子,如果執行到一半斷電,會不會出現問題呢?

MySQL采用buffer機制,避免每次讀寫進行磁盤IO,提升效率:

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里的數據,是需要落地的。

如上圖所示,當有頁數據要刷盤時:

  • 第一步:頁數據先memcopy到DWB的內存里;
  • 第二步:DWB的內存里,會先刷到DWB的磁盤上;
  • 第三步:DWB的內存里,再刷到數據磁盤存儲上;

畫外音:DWB由128個頁構成,容量只有2M。

步驟2和步驟3要寫2次磁盤,這就是“Double Write”的由來。

DWB為什么能解決“頁數據損壞”問題呢?

假設步驟2掉電,磁盤里依然是1+2+3+4的完整數據。

畫外音:只要有頁數據完整,就能通過redo還原數據。

假如步驟3掉電,DWB里存儲著完整的數據。

所以,一定不會出現“頁數據損壞”問題。

畫外音:寫了2次,總有一個地方的數據是OK的。

自己實驗了幾十次,仍沒能復現“頁數據損壞”,在網上找了一個“頁數據損壞”時,MySQL重啟過程利用DWB修復頁數據的圖。

可以看到,啟動過程中:

  • InnoDB檢測到上一次為異常關閉;
  • 嘗試恢復ibd數據,失敗;
  • 從DWB中恢復寫了一半的頁;

能夠通過DWB保證頁數據的完整性,但畢竟DWB要寫兩次磁盤,會不會導致數據庫性能急劇降低呢?

分析DWB執行的三個步驟:

  • 第一步,頁數據memcopy到DWB的內存,速度很快;
  • 第二步,DWB的內存fsync刷到DWB的磁盤,屬于順序追加寫,速度也很快;
  • 第三步,刷磁盤,隨機寫,本來就需要進行,不屬于額外操作;

另外,128頁(每頁16K)2M的DWB,會分兩次刷入磁盤,每次最多64頁,即1M的數據,執行也是非常之快的。

綜上,性能會有所影響,但影響并不大。

畫外音:

  • write--ahead-log之所以性能高,就是因為順序追加寫;
  • 有第三方測評,評估約10%性能損失;

更具體的,InnoDB里有兩個變量可以查看double write buffer相關的情況:

  • Innodb_dblwr_pages_written:記錄寫入DWB中頁的數量。
  • Innodb_dblwr_writes:記錄DWB寫操作的次數。

可以通過:

show global status like "%dblwr%"

來進行查詢。

結尾

MySQL有很強的數據安全性機制:

  • 在異常崩潰時,如果不出現“頁數據損壞”,能夠通過redo恢復數據;
  • 在出現“頁數據損壞”時,能夠通過double write buffer恢復頁數據;

double write buffer:

  • 不是一個內存buffer,是一個內存/磁盤兩層的結構,是InnoDB里On-Disk架構里很重要的一部分;
  • 是一個通過寫兩次,保證頁完整性的機制;

知其然,知其所以然。

思路比結論重要,希望大家有收獲。

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2021-01-08 05:29:40

MySQL日志數據

2023-06-12 09:08:47

CSS語法雙斜杠

2022-09-16 17:25:26

加密貨幣存儲以太坊

2022-07-27 18:34:32

RabbitMQ宕機服務器

2022-10-19 09:05:45

編譯程序員后端

2017-02-08 19:42:10

數據中心掉電電源

2018-09-06 14:18:05

硬盤數據恢復

2017-12-01 06:02:14

耦合數據庫CA

2017-02-07 18:00:44

數據電源ORACLE

2021-06-04 12:05:03

Redis Bitmap 數據庫

2021-06-23 09:52:22

Web開發數據

2024-08-07 08:02:08

2022-07-31 22:07:03

宕機業務場景

2015-01-14 10:32:45

物聯網智能手機

2009-11-06 13:40:07

2009-02-03 13:11:09

冰島綠色IT數據中心

2021-08-02 09:01:29

PythonMySQL 數據庫

2010-05-25 09:29:04

MySQL數據庫

2017-12-13 09:21:29

內存數據庫Redis

2022-12-16 17:15:33

MQRabbitMQ
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲色图综合 | 最近中文字幕在线视频1 | 亚洲视频一区二区三区 | 国产女人与拘做受视频 | 欧美激情精品久久久久久变态 | 国产精品视频久久 | 色888www视频在线观看 | 亚洲视频欧美视频 | 影音先锋成人资源 | 日韩视频区 | 午夜日韩 | 北条麻妃视频在线观看 | 日韩精品免费在线观看 | japan25hdxxxx日本 做a的各种视频 | 99精品久久 | 国产精品久久久久久久久久久久 | 久久av一区二区三区 | 成人网av | 国产精品一区二区在线免费观看 | 午夜欧美 | 国产精品毛片一区二区在线看 | 亚洲一区成人 | 中文字幕高清一区 | 免费久久精品视频 | 久久成人精品 | 亚洲午夜精品一区二区三区他趣 | 国产小u女发育末成年 | 人人干人人草 | 超碰美女在线 | 9999视频 | 黄片毛片| 九一国产精品 | 欧美一级久久 | 国产视频91在线 | 国产日韩精品久久 | 欧美aⅴ片 | 狠狠综合网| 亚洲成av人影片在线观看 | 精品国产一级 | 成人二区 | 天天曰天天曰 |