亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL回滾日志(undo?log)的作用和使用詳解

 更新時間:2022年04月15日 11:17:20   作者:每天都要進步一點點  
undo?log是innodb引擎的一種日志,在事務(wù)的修改記錄之前,會把該記錄的原值先保存起來再做修改,以便修改過程中出錯能夠恢復(fù)原值或者其他的事務(wù)讀取,這篇文章主要給大家介紹了關(guān)于MySQL回滾日志(undo?log)的作用和使用的相關(guān)資料,需要的朋友可以參考下

一、undo log的概念

undo log是mysql中比較重要的事務(wù)日志之一,顧名思義,undo log是一種用于撤銷回退的日志,在事務(wù)沒提交之前,MySQL會先記錄更新前的數(shù)據(jù)到 undo log日志文件里面,當(dāng)事務(wù)回滾時或者數(shù)據(jù)庫崩潰時,可以利用 undo log來進行回退。

二、undo log的作用

在MySQL中,undo log日志的作用主要有兩個:

1、提供回滾操作【undo log實現(xiàn)事務(wù)的原子性】

我們在進行數(shù)據(jù)更新操作的時候,不僅會記錄redo log,還會記錄undo log,如果因為某些原因?qū)е率聞?wù)回滾,那么這個時候MySQL就要執(zhí)行回滾(rollback)操作,利用undo log將數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。

如我們執(zhí)行下面一條刪除語句:

delete from user where id = 1;

那么此時undo log會記錄一條對應(yīng)的insert 語句【反向操作的語句】,以保證在事務(wù)回滾時,將數(shù)據(jù)還原回去。

再比如我們執(zhí)行一條update語句:

update user set name = "李四" where id = 1; ---修改之前name=張三

此時undo log會記錄一條相反的update語句,如下:

update user set name = "張三" where id = 1;

如果這個修改出現(xiàn)異常,可以使用undo log日志來實現(xiàn)回滾操作,以保證事務(wù)的一致性。

2、提供多版本控制(MVCC)【undo log實現(xiàn)多版本并發(fā)控制(MVCC)】

MVCC,即多版本控制。在MySQL數(shù)據(jù)庫InnoDB存儲引擎中,用undo Log來實現(xiàn)多版本并發(fā)控制(MVCC)。當(dāng)讀取的某一行被其他事務(wù)鎖定時,它可以從undo log中分析出該行記錄以前的數(shù)據(jù)版本是怎樣的,從而讓用戶能夠讀取到當(dāng)前事務(wù)操作之前的數(shù)據(jù)【快照讀】。

下面解釋一下什么是快照讀,與之對應(yīng)的還有一個是---當(dāng)前讀。

快照讀:

SQL讀取的數(shù)據(jù)是快照版本【可見版本】,也就是歷史版本,不用加鎖,普通的SELECT就是快照讀。

當(dāng)前讀:

SQL讀取的數(shù)據(jù)是最新版本。通過鎖機制來保證讀取的數(shù)據(jù)無法通過其他事務(wù)進行修改UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE都是當(dāng)前讀。

三、undo log的存儲機制

undo log的存儲由InnoDB存儲引擎實現(xiàn),數(shù)據(jù)保存在InnoDB的數(shù)據(jù)文件中。在InnoDB存儲引擎中,undo log是采用分段(segment)的方式進行存儲的。rollback segment稱為回滾段,每個回滾段中有1024個undo log segment。在MySQL5.5之前,只支持1個rollback segment,也就是只能記錄1024個undo操作。在MySQL5.5之后,可以支持128個rollback segment,分別從resg slot0 - resg slot127,每一個resg slot,也就是每一個回滾段,內(nèi)部由1024個undo segment 組成,即總共可以記錄128 * 1024個undo操作。

下面以一張圖來說明undo log日志里面到底存了哪些信息?

如上圖,可以看到,undo log日志里面不僅存放著數(shù)據(jù)更新前的記錄,還記錄著RowID、事務(wù)ID、回滾指針。其中事務(wù)ID每次遞增,回滾指針第一次如果是insert語句的話,回滾指針為NULL,第二次update之后的undo log的回滾指針就會指向剛剛那一條undo log日志,依次類推,就會形成一條undo log的回滾鏈,方便找到該條記錄的歷史版本。

四、undo log的工作原理

在更新數(shù)據(jù)之前,MySQL會提前生成undo log日志,當(dāng)事務(wù)提交的時候,并不會立即刪除undo log,因為后面可能需要進行回滾操作,要執(zhí)行回滾(rollback)操作時,從緩存中讀取數(shù)據(jù)。undo log日志的刪除是通過通過后臺purge線程進行回收處理的。

同樣,通過一張圖來理解undo log的工作原理。

如上圖:

1、事務(wù)A執(zhí)行update操作,此時事務(wù)還沒提交,會將數(shù)據(jù)進行備份到對應(yīng)的undo buffer,然后由undo buffer持久化到磁盤中的undo log文件中,此時undo log保存了未提交之前的操作日志,接著將操作的數(shù)據(jù),也就是Teacher表的數(shù)據(jù)持久保存到InnoDB的數(shù)據(jù)文件IBD。

2、此時事務(wù)B進行查詢操作,直接從undo buffer緩存中進行讀取,這時事務(wù)A還沒提交事務(wù),如果要回滾(rollback)事務(wù),是不讀磁盤的,先直接從undo buffer緩存讀取。

用undo log實現(xiàn)原子性和持久化的事務(wù)的簡化過程:

假設(shè)有A、B兩個數(shù)據(jù),值分別為1,2。

  • A. 事務(wù)開始
  • B. 記錄A=1到undo log中
  • C. 修改A=3
  • D. 記錄B=2到undo log中
  • E. 修改B=4
  • F. 將undo log寫到磁盤 -------undo log持久化
  • G. 將數(shù)據(jù)寫到磁盤 -------數(shù)據(jù)持久化
  • H. 事務(wù)提交 -------提交事務(wù)

之所以能同時保證原子性和持久化,是因為以下特點:

  1. 更新數(shù)據(jù)前記錄undo log。
  2. 為了保證持久性,必須將數(shù)據(jù)在事務(wù)提交前寫到磁盤,只要事務(wù)成功提交,數(shù)據(jù)必然已經(jīng)持久化到磁盤。
  3. undo log必須先于數(shù)據(jù)持久化到磁盤。如果在G,H之間發(fā)生系統(tǒng)崩潰,undo log是完整的,可以用來回滾。
  4. 如果在A - F之間發(fā)生系統(tǒng)崩潰,因為數(shù)據(jù)沒有持久化到磁盤,所以磁盤上的數(shù)據(jù)還是保持在事務(wù)開始前的狀態(tài)。

缺陷:每個事務(wù)提交前將數(shù)據(jù)和undo log寫入磁盤,這樣會導(dǎo)致大量的磁盤IO,因此性能較差。 如果能夠?qū)?shù)據(jù)緩存一段時間,就能減少IO提高性能,但是這樣就會失去事務(wù)的持久性。

undo日志屬于邏輯日志,redo是物理日志,所謂邏輯日志是undo log是記錄一個操作過程,不會物理刪除undo log,sql執(zhí)行delete或者update操作都會記錄一條undo日志。

五、undo log的相關(guān)參數(shù)

  • innodb_undo_directory

指定undo log日志的存儲目錄,默認值為./。

  •  innodb_undo_logs 

在MySQL5.6版本之后,可以通過此參數(shù)自定義多少個rollback segment,默認值為128。

  •  innodb_undo_tablespaces 

指定undo log平均分配到多少個表空間文件中,默認值為0,即全部寫入一個文件中。不建議修改為非0值,我們直接使用默認值即可。

在InnoDB存儲引擎中,在啟動日志中也會提示:不建議修改 innodb_undo_tablespaces為非0的值。

附錄:參考資料

http://chabaoo.cn/article/244628.htm

http://chabaoo.cn/article/244643.htm

《MySQL技術(shù)內(nèi)幕(第5版)》

到此這篇關(guān)于MySQL回滾日志(undo log)的文章就介紹到這了,更多相關(guān)MySQL回滾日志undo log內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論