MySQL的double write和Oracle對比學習
之前有網友希望我對mysql的double write和oracle能夠做一個對比,其實這種對比方式挺好,能夠觸類旁通,舉一反三。不過限於本人水平有限,歡迎拍磚。
關於MySQL的double write是對partilal write的一個補充。比如將資料寫入磁碟的時候,發生了斷電情況,那麼一部分內容寫入一部分就丟失了,這個時候使用redo log來恢復就不可行了,因為從日誌檔案層面資料的變更已經是不完整的了。
double write的大體是這樣的。部分內容參考了連結 http://www.cnblogs.com/benshan/archive/2013/01/14/2859336.html
double write分為兩部分,一部分是doublewrite buffer,大小為2M,另外一部分就是物理磁碟上的共享表空間中連續的128個頁,即兩個區,大小同樣為2M。當緩衝池的脹業重新整理時,並不直接寫硬 盤,而是透過memcpy函式將髒頁先複製到記憶體中的doublewrite buffer,之後透過doublewrite buffer再分兩次寫,每次寫入1M到共享表空間的物理磁碟上,然後馬上呼叫fsync函式,同步磁碟。
這個問題可以簡單的歸結為innodb恢復的原理,從這個層面來說和oracle還是存在著很大的不同。
首先double write是限於Innodb 儲存引擎的,而且是作為一個可選的方案,透過引數InnoDB_doublewrite的值來控制,如果為0表示不啟用,可以透過show status like "%InnoDB_dblwr%"來檢視。
既然作為可選方案,肯定是有一定的原因,就是出於效能的考慮,位於共享表空間的double write buffer其實也是檔案,寫double write buffer本身也會有fsync操作,只是double write寫入的過程是一個順序寫的過程,所以對效能降低不會太低。
oracle的恢復機制相比double wriite更加靈活和全面。
首先oracle中採用了undo+redo機制來作為資料恢復的基石,資料的恢復是透過前後臺結合來實現的,在快取級別,存在dbwr,能夠把修改後的資料塊刷入資料檔案,這是一個非同步的過程,不會因為發生資料變更就馬上寫入資料檔案,同時存在log buffer,能夠透過log buffer生成redo日誌,最後透過lgwr把這部分變更刷到redo 日誌,在這個過程中lgwr負責了保持資料完整性的任務,保證了資料在任何情況下都不會丟失。
上面的操作,寫入資料檔案的過程不是實時的,可以存在一定的延時,所以重點就放在了redo日誌上面,在備份恢復方面還是最重要的。
如果在dbwr把資料變更的資料塊寫入資料檔案的時候,如果發生斷電的情況,當例項重新啟動的時候,oracle會根據redo 日誌構造出變更前的資料塊資訊,從而完成了前滾,把丟失的資料塊找回來。這樣資料庫就恢復為了奔潰前的狀態,如果某些事務沒有提交或者回滾,又會繼續做一個回滾操作。這個過程會透過smon來結合Undo來實現。
從整個過程來說,oracle支援的面很廣,就如Oracle所承諾的那樣,做了commit的資料就能夠恢復。從IO消耗的角度來看,物理IO的消耗就在於重新整理資料到資料檔案,資料變更寫入redo,沒有額外的物理IO。
結合MySQL來看,double write buffer扮演的角色有點類似 log buffer的作用。因為oracle已經開闢了log buffer的快取空間,所以快取級的IO還是很快的,double write buffer就會存在部分的物理IO操作。
不過從技術的架構和角度來看,不能完全說出某一種好還是不好,從目前的分析來看,oracle相比double write還是技高一籌,不過從體系結構上要複雜的多。而且還涉及到更多的細節需要最佳化。
關於MySQL的double write是對partilal write的一個補充。比如將資料寫入磁碟的時候,發生了斷電情況,那麼一部分內容寫入一部分就丟失了,這個時候使用redo log來恢復就不可行了,因為從日誌檔案層面資料的變更已經是不完整的了。
double write的大體是這樣的。部分內容參考了連結 http://www.cnblogs.com/benshan/archive/2013/01/14/2859336.html
double write分為兩部分,一部分是doublewrite buffer,大小為2M,另外一部分就是物理磁碟上的共享表空間中連續的128個頁,即兩個區,大小同樣為2M。當緩衝池的脹業重新整理時,並不直接寫硬 盤,而是透過memcpy函式將髒頁先複製到記憶體中的doublewrite buffer,之後透過doublewrite buffer再分兩次寫,每次寫入1M到共享表空間的物理磁碟上,然後馬上呼叫fsync函式,同步磁碟。
這個問題可以簡單的歸結為innodb恢復的原理,從這個層面來說和oracle還是存在著很大的不同。
首先double write是限於Innodb 儲存引擎的,而且是作為一個可選的方案,透過引數InnoDB_doublewrite的值來控制,如果為0表示不啟用,可以透過show status like "%InnoDB_dblwr%"來檢視。
既然作為可選方案,肯定是有一定的原因,就是出於效能的考慮,位於共享表空間的double write buffer其實也是檔案,寫double write buffer本身也會有fsync操作,只是double write寫入的過程是一個順序寫的過程,所以對效能降低不會太低。
oracle的恢復機制相比double wriite更加靈活和全面。
首先oracle中採用了undo+redo機制來作為資料恢復的基石,資料的恢復是透過前後臺結合來實現的,在快取級別,存在dbwr,能夠把修改後的資料塊刷入資料檔案,這是一個非同步的過程,不會因為發生資料變更就馬上寫入資料檔案,同時存在log buffer,能夠透過log buffer生成redo日誌,最後透過lgwr把這部分變更刷到redo 日誌,在這個過程中lgwr負責了保持資料完整性的任務,保證了資料在任何情況下都不會丟失。
上面的操作,寫入資料檔案的過程不是實時的,可以存在一定的延時,所以重點就放在了redo日誌上面,在備份恢復方面還是最重要的。
如果在dbwr把資料變更的資料塊寫入資料檔案的時候,如果發生斷電的情況,當例項重新啟動的時候,oracle會根據redo 日誌構造出變更前的資料塊資訊,從而完成了前滾,把丟失的資料塊找回來。這樣資料庫就恢復為了奔潰前的狀態,如果某些事務沒有提交或者回滾,又會繼續做一個回滾操作。這個過程會透過smon來結合Undo來實現。
從整個過程來說,oracle支援的面很廣,就如Oracle所承諾的那樣,做了commit的資料就能夠恢復。從IO消耗的角度來看,物理IO的消耗就在於重新整理資料到資料檔案,資料變更寫入redo,沒有額外的物理IO。
結合MySQL來看,double write buffer扮演的角色有點類似 log buffer的作用。因為oracle已經開闢了log buffer的快取空間,所以快取級的IO還是很快的,double write buffer就會存在部分的物理IO操作。
不過從技術的架構和角度來看,不能完全說出某一種好還是不好,從目前的分析來看,oracle相比double write還是技高一籌,不過從體系結構上要複雜的多。而且還涉及到更多的細節需要最佳化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1436965/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL double writeMySql
- MySQL double write存在意義MySql
- 【MySQL】八、double write 淺析.MySql
- MySQL的Double Write並不難理解MySql
- mysql innodb double write概念彙總MySql
- 與MSSQL對比學習MYSQL的心得MySql
- MySQL:MGR 學習(1):寫集合(Write set)MySql
- Oracle和MySQL資料庫CTAS等操作對比OracleMySql資料庫
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- Contrastive Learning 對比學習 | RL 學 representation 時的對比學習AST
- 敲黑板:InnoDB的Double Write,你必須知道
- TIDB和MySQL效能對比TiDBMySql
- MySQL:MGR 學習(2):Write set(寫集合)的寫入過程MySql
- 對比學習Vue和微信小程式Vue微信小程式
- Vue 學習 Ref shallowRef triggerRef customRef (Ref 和 Reactive的對比)VueReact
- Java NIO學習系列四:NIO和IO對比Java
- oracle partition by group by,詳解partition by和group by對比Oracle
- C#和TS/JS的對比學習02:函式與方法C#JS函式
- MYSQL引擎的鎖對比MySql
- 強化學習(十)Double DQN (DDQN)強化學習
- Blazor和Vue對比學習(基礎1.4):事件和子傳父BlazorVue事件
- java double、float型別的比較Java型別
- Oracle、MySQL常見表結構變更語句對比OracleMySql
- 好程式設計師Java學習進階之MySQL資料庫結構和引擎比對程式設計師JavaMySql資料庫
- 對比學習 ——simsiam 程式碼解析。
- python date 和 datetime 的取值範圍(對比 Mysql 的 datetime 和 timestamp)PythonMySql
- PG和MySQL詳細的一些特性對比MySql
- Oracle、NoSQL和NewSQL 資料庫技術對比OracleSQL資料庫
- document.write()和HTML4.01的非成對標籤HTML
- Blazor和Vue對比學習(基礎1.3):屬性和父子傳值BlazorVue
- Blazor和Vue對比學習(基礎1.5):雙向繫結BlazorVue
- TSPython操作MySQL MongoDB Oracle三大資料庫深入對比oeePythonMySqlMongoDBOracle大資料資料庫
- 對比學習:Golang VS Python3GolangPython
- MySQL 資料對比MySql
- Blazor和Vue對比學習(進階2.1.1):生命週期,基本理解和使用BlazorVue
- Blazor和Vue對比學習(基礎1.2):模板語法和Razor語法BlazorVue
- Oracle、NoSQL和NewSQL 資料庫技術對比(一)OracleSQL資料庫
- Oracle和MySQL的區別OracleMySql
- MySQL和Oracle的區別MySqlOracle