MySQL核心月報2014.11-MySQL· 5.7改進·Recovery改進
背景
InnoDB作為事務性引擎,使用write-ahead logging(WAL)機制保證ACID中的Atomicity和Durability,使用undo機制保證ACID中的Consistency和Isolation。
按照WAL和undo的機制,形成以下兩個原則:
- 1. 資料塊的更改需要先記錄redo日誌。
- 2. 資料塊的更改需要先寫入undo。
根據這兩個原則,InnoDB更新資料的基本流程可以簡單的總結為:
- 1. 記錄需要更改undo record的redo log
- 2. 記錄需要更改data record的redo log
- 3. 寫入redo log
- 4. 寫入undo record
- 5. 更新data record
這5個步驟。
InnoDB Recovery
如果MySQL例項異常crash,那麼重啟過程中首先會進行InnoDB recovery。 即:根據last checkpoint點,順序讀取後面的redo log,按照先前滾,再回滾的原則, 應用所有的redo log。
因為redo record中記錄著資料塊的地址(space_id+page_no),所以recovery的過程首先會執行合併相同資料塊的操作,以加快recovery的過程。
那麼問題來了
- 根據space_id怎麼找到對應IDB資料檔案?
因為在恢復的過程中,InnoDB只load了redo檔案和系統表空間檔案,如何查詢InnoDB的資料檔案呢?
- 1. InnoDB的資料字典dict_table_t結構中也儲存了對應關係,但資料字典受redo保護,recovery的過程中不可用。
- 2. 掃描datadir的所有資料檔案,讀取page中儲存的space_id,建立space_id和資料檔案的對應關係。
MySQL目前採用第二種方式,但帶來了一個問題,當設定了innodb_file_per_table後,每一個表對應一個表空間,那麼需要讀取所有的目錄下的所有Innodb資料檔案,這樣就會嚴重的影響了recovery的時間。
MySQL 5.7改進策略:
MySQL 5.7中,在redo log中增加了一種新的record型別,即MLOG_FILE_NAME,記錄了自last checkpoint以來更改的資料檔案的file name。 這樣在應用的時候,直接根據檔名就可以找到資料檔案。
Oracle的設計機制:
Oracle資料庫recovery的過程中,有沒有這個問題呢? 答案是沒有。
我們來看下Oracle的設計機制:
- oracle同樣在系統表空間中記錄了資料字典,受redo保護,可以通過DBA_開頭的表來查詢。但Oracle還維護了一個control file,控制檔案中記錄了database name,redo file,datafile,backup等資訊,通過v$開頭的表查詢。
- 當Oracle在recovery的過程中,需要資料庫在mount狀態下,即開啟了控制檔案,這時資料字典還不可用(DB沒有open),在應用redo log的時候,根據控制檔案中的v$datafile,檢索file_id和file_name的對應關係。
MySQL是根據datadir,innodb_data_home_dir,innodb_log_group_home_dir等幾個目錄配置,通過檔案系統的查詢,找到相應檔案的,而Oracle維護了一個集中式的control file管理這些初始載入的檔案地址。
相關文章
- MySQL核心月報2015.01-MySQL·優化改進·複製效能改進過程MySql優化
- MySQL核心月報2014.11-MySQL· 5.7特性·高可用支援MySql
- MySQL核心月報2014.11-MySQL· 5.7優化·MetadataLock子系統的優化MySql優化
- MySQL8 的分割槽功能相比 mysql5.7 有什麼改進?MySql
- Innodbreadonly事務、MySQL5.7和Percona的事務改進MySql
- MySQL 5.7 新特性 共享臨時表空間及臨時表改進MySql
- MySQL5.6.12的Innodb效能改進MySql
- 自我反省與改進
- MySQL表的增刪改查(進階)下MySql
- 使用 ProxySQL 改進 MySQL SSL 的連線效能MySql
- MySQL資料清理的需求分析和改進MySql
- 新特性解讀 | MySQL 8.0 對 UNION 的改進MySql
- MySQL資料庫 ---MySQL表的增刪改查(進階)MySql資料庫
- golang 1.8工具鏈改進Golang
- Bootstrap 2.3 有哪些改進?boot
- 新手筆記-持續改進實踐:開發計劃的改進 (轉)筆記
- 需求改進&系統設計
- 改進飛碟(Hit UFO)遊戲遊戲
- 【譯】.NET 6 網路改進
- 機器學習6-迴歸改進機器學習
- Swift 4.1 中的 Codable 改進Swift
- Chrome渲染管道的效能改進Chrome
- 如何改進手上的機器學習模型機器學習模型
- 改進iPad可用性iPad
- windows 7的改進之處Windows
- 改進JAVA字串分解的方法Java字串
- 程式設計太差,有待改進程式設計
- Alpha階段複審改進
- 利用Express+MySQL進行簡單的增刪改查ExpressMySql
- 強烈建議社群文件選單進行改進!
- JavaScript四捨五入的改進JavaScript
- Android AsyncLayoutInflater 限制及改進Android
- 又拍雲 Redis 的改進之路Redis
- 如何改進你的指令碼程式指令碼
- 改進的sql計算n王后SQL
- Hibernate進行增刪查改
- 改進版glide golang版本控制IDEGolang
- ASP.NET Web Forms的改進ASP.NETWebORM