婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解MySQL中事務的持久性實現原理

詳解MySQL中事務的持久性實現原理

熱門標簽:電話外呼系統改號 南昌三維地圖標注 地圖標注費用是多少 曲靖移動外呼系統公司 百應電話機器人優勢 怎樣在地圖標注銷售區域 外呼系統打電話上限是多少 武漢網絡外呼系統服務商 啥是企業400電話辦理

前言

說到數據庫事務,大家腦子里一定很容易蹦出一堆事務的相關知識,如事務的ACID特性,隔離級別,解決的問題(臟讀,不可重復讀,幻讀)等等,但是可能很少有人真正的清楚事務的這些特性又是怎么實現的,為什么要有四個隔離級別。

在之前的文章我們已經了解了MySQL中事務的隔離性的實現原理,今天就繼續來聊一聊MySQL持久性的實現原理。

當然MySQL博大精深,文章疏漏之處在所難免,歡迎批評指正。

說明

MySQL的事務實現邏輯是位于引擎層的,并且不是所有的引擎都支持事務的,下面的說明都是以InnoDB引擎為基準。

InnoDB讀寫數據原理

在往下學習之前,我們需要先來了解下InnoDB是怎么來讀寫數據的。我們知道數據庫的數據都是存放在磁盤中的,然后我們也知道磁盤I/O的成本是很大的,如果每次讀寫數據都要訪問磁盤,數據庫的效率就會非常低。為了解決這個問題,InnoDB提供了 Buffer Pool 作為訪問數據庫數據的緩沖。

Buffer Pool 是位于內存的,包含了磁盤中部分數據頁的映射。當需要讀取數據時,InnoDB會首先嘗試從Buffer Pool中讀取,讀取不到的話就會從磁盤讀取后放入Buffer Pool;當寫入數據時,會先寫入Buffer Pool的頁面,并把這樣的頁面標記為dirty,并放到專門的flush list上,這些修改的數據頁會在后續某個時刻被刷新到磁盤中(這一過程稱為刷臟,由其他后臺線程負責) 。如下圖所示:

這樣設計的好處是可以把大量的磁盤I/O轉成內存讀寫,并且把對一個頁面的多次修改merge成一次I/O操作(刷臟一次刷入整個頁面),避免每次讀寫操作都訪問磁盤,從而大大提升了數據庫的性能。

持久性定義

持久性是指事務一旦提交,它對數據庫的改變就應該是永久性的,接下來的其他操作或故障不應該對本次事務的修改有任何影響。

通過前面的介紹,我們知道InnoDB使用 Buffer Pool  來提高讀寫的性能。但是 Buffer Pool 是在內存的,是易失性的,如果一個事務提交了事務后,MySQL突然宕機,且此時Buffer Pool中修改的數據還沒有刷新到磁盤中的話,就會導致數據的丟失,事務的持久性就無法保證。

為了解決這個問題,InnoDB引入了 redo log來實現數據修改的持久化。當數據修改時,InnoDB除了修改Buffer Pool中的數據,還會在redo log 記錄這次操作,并保證redo log早于對應的頁面落盤(一般在事務提交的時候),也就是常說的WAL。若MySQL突然宕機了且還沒有把數據刷回磁盤,重啟后,MySQL會通過已經寫入磁盤的redo log來恢復沒有被刷新到磁盤的數據頁。

實現原理:redo log

為了提高性能,和數據頁類似,redo log 也包括兩部分:一是內存中的日志緩沖(redo log buffer),該部分日志是易失性的;二是磁盤上的重做日志文件(redo log file),該部分日志是持久的。redo log是物理日志,記錄的是數據庫中物理頁的情況 。

當數據發生修改時,InnoDB不僅會修改Buffer Pool中的數據,也會在redo log buffer記錄這次操作;當事務提交時,會對redo log buffer進行刷盤,記錄到redo log file中。如果MySQL宕機,重啟時可以讀取redo log file中的數據,對數據庫進行恢復。這樣就不需要每次提交事務都實時進行刷臟了。

寫入過程

注意點:

  • 先修改Buffer Pool,后寫 redo log buffer。
  • redo日志比數據頁先寫回磁盤:事務提交的時候,會把redo log buffer寫入redo log file,寫入成功才算提交成功(也有其他場景觸發寫入,這里就不展開了),而Buffer Pool的數據由后臺線程在后續某個時刻寫入磁盤。
  • 刷臟的時候一定會保證對應的redo log已經落盤了,也即是所謂的WAL(預寫式日志),否則會有數據丟失的可能性。

好處

事務提交的時候,寫入redo log 相比于直接刷臟的好處主要有三點:

刷臟是隨機I/O,但寫redo log 是順序I/O,順序I/O可比隨機I/O快多了,不需要。
刷臟是以數據頁(Page)為單位的,即使一個Page只有一點點修改也要整頁寫入;而redo log中只包含真正被修改的部分,數據量非常小,無效IO大大減少。
刷臟的時候可能要刷很多頁的數據,無法保證原子性(例如只寫了一部分數據就失敗了),而redo log buffer 向 redo log file 寫log block,是按512個字節,也就是一個扇區的大小進行寫入,扇區是寫入的最小單位,因此可以保證寫入是必定成功的。

先寫redo log還是先修改數據

一次DML可能涉及到數據的修改和redo log的記錄,那它們的執行順序是怎么樣的呢?網上的文章有的說先修改數據,后記錄redo log,有的說先記錄redo log,后改數據,那真實的情況是如何呢?

首先通過上面的說明我們知道,redo log buffer在事務提交的時候就會寫入redo log file的,而刷臟則是在后續的某個時刻,所以可以確定的是先記錄redo log,后修改data page(WAL當然是日志先寫啦)。

那接下來的問題就是先寫redo log buffer還是先修改Buffer Pool了。要了解這個問題,我們先要了解InnoDB中,一次DML的執行過程是怎么樣的。一次DML的執行過程涉及了數據的修改,加鎖,解鎖,redo log的記錄和undo log的記錄等,也是需要保證原子性的,而InnoDB通過MTR(Mini-transactions)來保證一次DML操作的原子性。

首先來看MTR的定義:

 An internal phase of InnoDB processing, when making changes at the physical level to internal data structures during DML operations. A Mini-transactions (mtr) has no notion of rollback; multiple Mini-transactionss can occur within a single transaction. Mini-transactionss write information to the redo log that is used during crash recovery. A Mini-transactions can also happen outside the context of a regular transaction, for example during purge processing by background threads. 見 https://dev.mysql.com/doc/refman/8.0/en/glossary.html

MTR 是一個短原子操作,不能回滾,因為它本身就是原子的。數據頁的變更必須通過MTR,MTR 會把DML操作對數據頁的修改記錄到 redo log里。

下面來簡單看下MTR的過程:

  • MTR初始化的時候會初始化一份 mtr_buf
  • 當修改數據時,在對內存Buffer Pool中的頁面進行修改的同時,還會生成redo log record,保存在mtr_buf中。
  • 在執行mtr_commit函數提交本MTR的時候,會將mtr_buf中的redo log record更新到redo log buffer中,同時將臟頁添加到flush list,供后續刷臟使用。在log buffer中,每接收到496字節的log record,就將這組log record包裝一個12字節的block header和一個4字節的block tailer,成為一個512字節的log block,方便刷盤的時候對齊512字節刷盤。

由此可見,InnoDB是先修改Buffer Pool,后寫redo log buffer的。

恢復數據的過程

在任何情況下,InnoDB啟動時都會嘗試執行recovery操作。在恢復過程中,需要redo log參與,而如果還開啟了binlog,那就還需要binlog、undo log的參與。因為有可能數據已經寫入binlog了,但是redo log還沒有刷盤的時候數據庫就奔潰了(事務是InnoDB引擎的特性,修改了數據不一定提交了,而binlog是MySQL服務層的特性,修改數據就會記錄了),這時候就需要redo log,binlog和undo log三者的參與來判斷是否有還沒提交的事務,未提交的事務進行回滾或者提交操作。

下面來簡單說下僅利用redo log恢復數據的過程:

  • 啟動InnoDB時,找到最近一次Checkpoint的位置,利用Checkpoint LSN去找大于該LSN的redo log進行日志恢復。
  • 如果中間恢復失敗了也沒影響,再次恢復的時候還是從上次保存成功的Checkpoint的位置繼續恢復。

Recover過程:故障恢復包含三個階段:Analysis,Redo和Undo。Analysis階段的任務主要是利用Checkpoint及Log中的信息確認后續Redo和Undo階段的操作范圍,通過Log修正Checkpoint中記錄的Dirty Page集合信息,并用其中涉及最小的LSN位置作為下一步Redo的開始位置RedoLSN。同時修正Checkpoint中記錄的活躍事務集合(未提交事務),作為Undo過程的回滾對象;Redo階段從Analysis獲得的RedoLSN出發,重放所有的Log中的Redo內容,注意這里也包含了未Commit事務;最后Undo階段對所有未提交事務利用Undo信息進行回滾,通過Log的PrevLSN可以順序找到事務所有需要回滾的修改。具體見 http://catkang.github.io/2019/01/16/crash-recovery.html

什么是LSN?

LSN也就是log sequence number,也日志的序列號,是一個單調遞增的64位無符號整數。redo log和數據頁都保存著LSN,可以用作數據恢復的依據。LSN更大的表示所引用的日志記錄所描述的變化發生在更后面。

什么是Checkpoint?

Checkpoint表示一個保存點,在這個點之前的數據頁的修改(log LSNCheckpoint LSN)都已經寫入磁盤文件了。InnoDB每次刷盤之后都會記錄Checkpoint,把最新的redo log LSN 記錄到Checkpoint LSN 里,方便恢復數據的時候作為起始點的判斷。

以上就是詳解MySQL中事務的持久性實現原理的詳細內容,更多關于MySQL 事務的持久性的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 詳解MySQL中事務隔離級別的實現原理
  • MySQL執行事務的語法與流程詳解
  • mysql、oracle默認事務隔離級別的說明
  • MySQL 事務autocommit自動提交操作
  • MySQL 查看事務和鎖情況的常用語句分享
  • MySQL 主從同步,事務回滾的實現原理
  • MySQL數據庫事務與鎖深入分析
  • Mysql事務中Update是否會鎖表?
  • 深入理解PHP+Mysql分布式事務與解決方案
  • MySQL如何實現事務的ACID
  • MySQL為什么要避免大事務以及大事務解決的方法

標簽:荊州 甘南 黑河 錦州 滄州 吉林 資陽 隨州

巨人網絡通訊聲明:本文標題《詳解MySQL中事務的持久性實現原理》,本文關鍵詞  詳解,MySQL,中,事務,的,持久性,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解MySQL中事務的持久性實現原理》相關的同類信息!
  • 本頁收集關于詳解MySQL中事務的持久性實現原理的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩欧美国产麻豆| 国产精品嫩草影院com| 久久99精品国产.久久久久久| 一区二区三区鲁丝不卡| 国产精品福利电影一区二区三区四区| 久久久av毛片精品| 欧美韩国日本一区| 亚洲人成在线播放网站岛国| 一色桃子久久精品亚洲| 成人免费一区二区三区视频 | 亚洲国产cao| 欧美一级二级在线观看| 欧美伦理视频网站| 91精品国产91久久综合桃花| 在线不卡免费av| 日韩午夜在线观看| 久久精品视频一区| 国产精品丝袜91| 一区二区视频在线| 亚洲第一精品在线| 激情综合色播激情啊| 国产高清精品网站| 99综合影院在线| 一本高清dvd不卡在线观看 | 亚洲成av人片在线| 美女高潮久久久| 欧美国产日韩一二三区| 久久久久久久国产精品影院| xf在线a精品一区二区视频网站| 久久免费午夜影院| 成人欧美一区二区三区1314| 亚洲一二三四在线观看| 日本一区中文字幕| 成人午夜视频在线观看| 日本精品一级二级| 日韩精品一区二区在线| 中文字幕一区二区三区不卡在线| 亚洲高清一区二区三区| 国产一区二区三区四| 欧美专区日韩专区| 国产偷国产偷精品高清尤物| 天天综合天天做天天综合| 国产成人av自拍| 91精品国产欧美日韩| 一区二区中文字幕在线| 成人免费精品视频| 成人自拍视频在线观看| 欧美精品在线一区二区| 中文字幕亚洲精品在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 精品国产三级a在线观看| 亚洲观看高清完整版在线观看| 欧美亚洲综合在线| 亚洲综合999| 欧美日韩一区小说| 日本欧美在线看| 精品蜜桃在线看| 裸体一区二区三区| 国产精品国产三级国产普通话99| 韩国女主播一区| 免费不卡在线视频| 欧美三级乱人伦电影| 久久久久久久一区| 韩国一区二区在线观看| 欧美日本一区二区| 亚洲高清免费视频| 91久久精品一区二区三| 亚洲日本青草视频在线怡红院| 91精品国产欧美一区二区| 在线观看亚洲精品视频| 久久看人人爽人人| 另类小说综合欧美亚洲| 日韩欧美精品三级| 免费av成人在线| 538在线一区二区精品国产| 亚洲国产日日夜夜| 欧美剧在线免费观看网站| 石原莉奈在线亚洲二区| 欧美一区二区久久| 首页国产欧美日韩丝袜| 欧美一区二区免费视频| 激情欧美一区二区| 国产蜜臀97一区二区三区 | 国产精品1024| 韩国视频一区二区| 911精品国产一区二区在线| 婷婷久久综合九色综合绿巨人| 在线成人免费观看| 久久aⅴ国产欧美74aaa| 久久在线免费观看| 成人中文字幕电影| 亚洲男人的天堂在线观看| 色噜噜狠狠色综合中国| 肉肉av福利一精品导航| 欧美www视频| 国产成人超碰人人澡人人澡| 中文字幕亚洲精品在线观看| 欧美日韩亚洲另类| 美女视频黄 久久| 日本一区二区高清| 欧美日韩精品一区视频| 蜜臀91精品一区二区三区| 精品久久免费看| 99久久免费精品| 日韩精品一级二级| 国产精品麻豆久久久| 欧美日韩卡一卡二| 成人激情小说网站| 青娱乐精品视频| 最新久久zyz资源站| 在线国产亚洲欧美| 国产精品99久久久久久似苏梦涵| 亚洲男帅同性gay1069| 日韩精品一区二区三区在线播放 | 91国偷自产一区二区三区观看 | 中文字幕乱码日本亚洲一区二区| 色天天综合久久久久综合片| 国产成人精品免费一区二区| 亚洲精品一区二区三区精华液| 国产精品一区一区三区| 亚洲日本在线观看| 精品国产一区二区三区忘忧草| 91丨porny丨蝌蚪视频| 精品一区二区三区久久| 亚洲综合在线视频| 亚洲国产成人午夜在线一区| 91精品欧美一区二区三区综合在 | 一区二区三区免费看视频| 日韩欧美你懂的| 欧美美女直播网站| 91免费看片在线观看| 韩国精品主播一区二区在线观看 | 欧美丰满美乳xxx高潮www| 91色porny蝌蚪| 国产精品国产馆在线真实露脸 | 青青草成人在线观看| 中文字幕一区二区视频| 欧美国产丝袜视频| 久久久久久久综合日本| 精品国精品国产尤物美女| 日韩一区二区三区在线| 欧美精品日日鲁夜夜添| 欧美视频日韩视频在线观看| 色婷婷久久久综合中文字幕| 91视频观看视频| 91福利小视频| 色94色欧美sute亚洲线路二 | 精品综合免费视频观看| 无码av免费一区二区三区试看| 一区视频在线播放| 国产精品电影一区二区三区| 成人欧美一区二区三区黑人麻豆| 国产婷婷色一区二区三区在线| 久久久久青草大香线综合精品| 久久久久久久久一| 久久蜜桃av一区二区天堂| 国产成人超碰人人澡人人澡| 中文字幕欧美区| 国产精品久久久久影院| 国产精品人成在线观看免费| 国产嫩草影院久久久久| 18涩涩午夜精品.www| 亚洲婷婷综合久久一本伊一区| 亚洲靠逼com| 亚洲午夜精品17c| 日韩电影网1区2区| 国产精品123| 91在线观看视频| 69堂成人精品免费视频| 精品国产凹凸成av人网站| 精品乱码亚洲一区二区不卡| 国产精品视频免费| 一区二区三区在线观看国产| 无码av中文一区二区三区桃花岛| 久久国产乱子精品免费女| 国产精品69久久久久水密桃| av高清不卡在线| 欧美色图在线观看| 久久综合一区二区| 亚洲丝袜精品丝袜在线| 免费在线观看一区| 国产福利一区二区三区| 一区二区三区av电影| 亚洲大尺度视频在线观看| 日本欧美一区二区在线观看| 国产成人综合视频| 欧美色网一区二区| 精品国产1区2区3区| 一区二区三区四区在线播放| 国产在线精品一区二区三区不卡 | 日本一区二区三区四区| 亚洲精品高清在线| 国产一区二区三区免费播放| 色先锋久久av资源部| 久久久久久久久久看片| 香蕉影视欧美成人| 成+人+亚洲+综合天堂| 欧美videos中文字幕| 亚洲精品亚洲人成人网在线播放| 加勒比av一区二区|