最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

Innodb三大特性之doublewrite_MySQL

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-09 20:07:35
文檔

Innodb三大特性之doublewrite_MySQL

Innodb三大特性之doublewrite_MySQL:1、doublewrite buffer(mysql官方的介紹) InnoDB uses a novel file flush technique called doublewrite. Before writing pages to the data files, InnoDB first writes them to a contiguous
推薦度:
導(dǎo)讀Innodb三大特性之doublewrite_MySQL:1、doublewrite buffer(mysql官方的介紹) InnoDB uses a novel file flush technique called doublewrite. Before writing pages to the data files, InnoDB first writes them to a contiguous

1、doublewrite buffer(mysql官方的介紹)

InnoDB uses a novel file flush technique called doublewrite. Before writing pages to the data files, InnoDB first writes them to a contiguous area called the doublewrite buffer. Only after the write and the flush to the doublewrite buffer have completed, does InnoDB write the pages to their proper positions in the data file. If there is an operating system, storage subsystem, or mysqld process crash in the middle of a page write, InnoDB can later find a good copy of the page from the doublewrite buffer during crash recovery.

Although data is always written twice, the doublewrite buffer does not require twice as much I/O overhead or twice as many I/O operations. Data is written to the buffer itself as a large sequential chunk, with a single fsync() call to the operating system.

To turn off the doublewrite buffer, specify the option innodb_doublewrite=0.

2、partial page write

InnoDB 的Page Size一般是16KB,其數(shù)據(jù)校驗也是針對這16KB來計算的,將數(shù)據(jù)寫入到磁盤是以Page為單位進行操作的。而計算機硬件和操作系統(tǒng),在極端情況下 (比如斷電)往往并不能保證這一操作的原子性,16K的數(shù)據(jù),寫入4K 時,發(fā)生了系統(tǒng)斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題。

很多DBA 會想到系統(tǒng)恢復(fù)后,MySQL 可以根據(jù)redo log 進行恢復(fù),而mysql在恢復(fù)的過程中是檢查page的checksum,checksum就是pgae的最后事務(wù)號,發(fā)生partial page write 問題時,page已經(jīng)損壞,找不到該page中的事務(wù)號,就無法恢復(fù)

所以說,當(dāng)page 損壞之后,其實應(yīng)用redo是沒有意義的,這時候無法使用redo來恢復(fù),因為原始頁已經(jīng)損壞了,會發(fā)生數(shù)據(jù)丟失。

3、doublewrite

在InnoDB將BP中的Dirty Page刷(flush)到磁盤上時,首先會將(memcpy函數(shù))Page刷到InnoDB tablespace的一個區(qū)域中,我們稱該區(qū)域為Double write Buffer(大小為2MB,每次寫入1MB)。在向Double write Buffer寫入成功后,第二步、再將數(shù)據(jù)拷貝到數(shù)據(jù)文件對應(yīng)的位置。

當(dāng)?shù)诙竭^程中發(fā)生故障,也就是發(fā)生partial page write的問題?;謴?fù)的時候先檢查頁內(nèi)的checksum是否相同,不一致,則直接從doublewrite中恢復(fù)。

1)如果寫dw buffer失敗。那么這些數(shù)據(jù)不會寫到磁盤,innodb會載入磁盤原始數(shù)據(jù)和redo日志比較,并重新刷到dw buffer。

2)如果寫dw buffer成功,但是刷新到磁盤失敗,那么innodb就不會通過事務(wù)日志來恢復(fù)了,而是直接刷新dw buffer中的數(shù)據(jù)。

4、對性能的影響

系統(tǒng)需要將數(shù)據(jù)寫兩份,一般認(rèn)為,Double Write是會降低系統(tǒng)性能的。peter猜測可能會有5-10%的性能損失,但是因為實現(xiàn)了數(shù)據(jù)的一致,是值得的。Mark Callaghan認(rèn)為這應(yīng)該是存儲層面應(yīng)該解決的問題,放在數(shù)據(jù)庫層面無疑是犧牲了很多性能的。

事實上,Double Write對性能影響并沒有你想象(寫兩遍性能應(yīng)該降低了50%吧?)的那么大。在BP中一次性往往會有很多的Dirty Page同時被flush,Double Write則把這些寫操作,由隨機寫轉(zhuǎn)化為了順序?qū)?。而在Double Write的第二個階段,因為Double Write Buffer中積累了很多Dirty Page,所以向真正的數(shù)據(jù)文件中寫數(shù)據(jù)的時候,可能有很多寫操作可以合并,這樣有可能會降低Fsync的調(diào)用次數(shù)。

基于上面的原因,Double Write并沒有想象的那么糟。另外,Dimitri在測試后,發(fā)現(xiàn)打開和關(guān)閉Double Write對效率的影響并不大。

5、doublewrite參數(shù)

mysql> show variables like "%double%";
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| innodb_doublewrite | ON |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW STATUS LIKE "%innodb_dblwr%";
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Innodb_dblwr_pages_written | 447 |
| Innodb_dblwr_writes | 38 |
+----------------------------+-------+
2 rows in set (0.00 sec)

從上面可以看出, Flush了447次到doublewrite buffer中,寫文件共38次,則每次write合并了447/38次flush

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Innodb三大特性之doublewrite_MySQL

Innodb三大特性之doublewrite_MySQL:1、doublewrite buffer(mysql官方的介紹) InnoDB uses a novel file flush technique called doublewrite. Before writing pages to the data files, InnoDB first writes them to a contiguous
推薦度:
標(biāo)簽: 三大 my mysql
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top