最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQ回滾日志Undo Log實踐記錄

 更新時間:2025年09月03日 11:34:35   作者:M_Reus_11  
Undo Log是一種用于撤銷操作的日志,它記錄了事務(wù)發(fā)生之前的數(shù)據(jù)狀態(tài)(主要是修改前的舊版本數(shù)據(jù)),本文給大家介紹MySQ回滾日志Undo Log實踐記錄,感興趣的朋友一起看看吧

Undo Log 是 InnoDB 存儲引擎中實現(xiàn)事務(wù)關(guān)鍵組件之一。它與 Redo Log 共同協(xié)作,確保了事務(wù)的原子性(Atomicity)和一致性(Consistency),同時也是 MySQL 實現(xiàn)多版本并發(fā)控制(MVCC) 的基礎(chǔ)。

一、什么是 Undo Log?

Undo Log,顧名思義,是一種用于撤銷操作的日志。它記錄了事務(wù)發(fā)生之前的數(shù)據(jù)狀態(tài)(主要是修改前的舊版本數(shù)據(jù))。

當(dāng)執(zhí)行一個 DELETE、UPDATE 或 INSERT 操作時,InnoDB 不僅會生成 Redo Log 用于重做,還會生成相應(yīng)的 Undo Log。如果事務(wù)需要回滾(ROLLBACK)或者系統(tǒng)崩潰后進行恢復(fù),InnoDB 就可以利用 Undo Log 中的信息,將數(shù)據(jù)還原到修改前的狀態(tài)。

核心思想: 在修改任何數(shù)據(jù)之前,先“留底”,把舊數(shù)據(jù)拷貝一份到 Undo Log 中。

二、Undo Log 的主要作用

  • 實現(xiàn)事務(wù)回滾(原子性)
  • 這是 Undo Log 最直接的作用。當(dāng)一個事務(wù)執(zhí)行失敗或用戶顯式執(zhí)行 ROLLBACK 時,InnoDB 會讀取對應(yīng)事務(wù)的 Undo Log,執(zhí)行相反的逆操作來撤銷更改:
    • 對于 INSERT,逆操作是 DELETE。
    • 對于 DELETE,逆操作是 INSERT。
    • 對于 UPDATE,逆操作是用舊值再 UPDATE 回去。
  • 實現(xiàn)多版本并發(fā)控制(MVCC)- 一致性讀
  • 這是 Undo Log 在現(xiàn)代數(shù)據(jù)庫中最重要、最高頻的作用。MVCC 使得讀操作(SELECT)不會阻塞寫操作(UPDATE/DELETE),寫操作也不會阻塞讀操作。
    • 當(dāng)某個事務(wù)需要讀取一行數(shù)據(jù)時,InnoDB 會找到該行數(shù)據(jù)的一個“可見”版本。
    • 如果該行數(shù)據(jù)的最新版本(由某個活躍事務(wù)修改)對當(dāng)前讀事務(wù)不可見,InnoDB 就會沿著該行記錄的 DB_ROLL_PTR(回滾指針),在 Undo Log 中尋找更早的、符合當(dāng)前事務(wù)隔離級別要求的舊版本數(shù)據(jù)。
    • 這些舊版本數(shù)據(jù)鏈(版本鏈)就存儲在 Undo Log 中。因此,一個讀請求可能會訪問到很久之前的數(shù)據(jù)快照,這些快照就是通過 Undo Log 構(gòu)建出來的。

三、Undo Log 的存儲與結(jié)構(gòu)

1. 物理存儲

  • 存儲位置: Undo Log 存儲在表空間中。從 MySQL 5.6 開始,可以配置為使用獨立的 Undo 表空間 (.ibu 文件),與系統(tǒng)表空間 (ibdata1) 分離,方便管理和擴展。
  • 回滾段 (Rollback Segments): InnoDB 有 128 個回滾段(Rollback Segments),其中:
    • 第 0 號、第 1 號、第 33-127 號回滾段存在于臨時表空間。
    • 第 1-32 號回滾段存在于普通表空間(系統(tǒng)表空間或獨立 Undo 表空間)。
    • 每個回滾段管理著多個 Undo Slot,每個 Slot 對應(yīng)一個 Undo Log Segment。
  • Purge 機制: Undo Log 不會永遠保留。當(dāng)沒有任何事務(wù)或快照讀需要用到某個舊版本數(shù)據(jù)時(即該 Undo Log 不再被 MVCC 所需),這個 Undo Log 所占用的空間就可以被回收重用。這個刪除過期 Undo Log 的過程由后臺的 Purge 線程負責(zé)。

2. 邏輯結(jié)構(gòu) - 版本鏈

每一行記錄(聚簇索引)在 InnoDB 中都包含兩個隱藏字段:

  • DB_TRX_ID(6字節(jié)): 最近一次修改該行數(shù)據(jù)的事務(wù) ID。
  • DB_ROLL_PTR(7字節(jié)): 回滾指針,指向該行數(shù)據(jù)的上一個舊版本在 Undo Log 中的位置。

UPDATE 操作會形成一個版本鏈:

  • 事務(wù) A (Trx-id=100) 修改了某行數(shù)據(jù)。
  • 修改前,該行的舊數(shù)據(jù)(包括 DB_TRX_ID 和所有字段值)被拷貝到 Undo Log 中。
  • 修改后,新行的 DB_TRX_ID 被設(shè)置為 100,DB_ROLL_PTR 指向剛剛創(chuàng)建的 Undo Log 記錄。
  • 當(dāng)事務(wù) B (Trx-id=200) 再次修改這行數(shù)據(jù)時,過程重復(fù):拷貝當(dāng)前狀態(tài)到新的 Undo Log 記錄,然后更新數(shù)據(jù)行,并將新的 DB_ROLL_PTR 指向事務(wù) B 創(chuàng)建的 Undo Log 記錄。

這樣,通過 DB_ROLL_PTR,所有歷史版本的數(shù)據(jù)就像一條鏈表一樣被串聯(lián)起來,這就是版本鏈。

示例:
假設(shè)一行數(shù)據(jù)初始值為 Name=‘Alice’。

  • 事務(wù) 100 將其改為 Name=‘Bob’。
  • 事務(wù) 200 又將其改為 Name=‘Charlie’。

這行記錄及其版本鏈的結(jié)構(gòu)如下:

當(dāng)前行 (In Table)   : [Name='Charlie', DB_TRX_ID=200, DB_ROLL_PTR --> Undo Record 200]
                      ^
                      |
Undo Record 200      : [Name='Bob',    DB_TRX_ID=100, DB_ROLL_PTR --> Undo Record 100]
                      ^
                      |
Undo Record 100      : [Name='Alice',  DB_TRX_ID=?,   DB_ROLL_PTR -> NULL]

當(dāng)有一個 Read View 需要查詢這行數(shù)據(jù)時,它會從最新的記錄開始,順著 DB_ROLL_PTR 依次判斷哪個版本對它可見。

四、Undo Log 與 Redo Log 的區(qū)別

這是一個非常重要的概念,兩者的區(qū)別和聯(lián)系如下表所示:

特性Redo LogUndo Log
目的重做日志,確保事務(wù)的持久性回滾日志,確保事務(wù)的原子性一致性讀(MVCC)
內(nèi)容記錄的是數(shù)據(jù)頁的物理變化(在某個頁上做了什么修改)記錄的是數(shù)據(jù)修改前的邏輯狀態(tài)(行的舊值)
生成時機在事務(wù)執(zhí)行過程中不斷寫入在數(shù)據(jù)修改生成
作用時機數(shù)據(jù)庫崩潰恢復(fù)時,重放已提交的事務(wù)事務(wù)回滾時和一致性讀(MVCC) 時
生命周期事務(wù)提交后,對應(yīng)的 Redo Log 可能很快被覆蓋(循環(huán)寫)事務(wù)提交后,Undo Log 可能仍被 MVCC 使用,不能立即刪除
磁盤存儲順序?qū)懭耄?code>ib_logfile0/1)隨機寫入(存在于表空間)
日志類型物理邏輯日志(物理到頁,邏輯到行)邏輯日志

關(guān)鍵聯(lián)系: Undo Log 本身的操作(寫入、修改)也會產(chǎn)生 Redo Log。因為 Undo Log 也需要持久化,防止在寫入 Undo Log 過程中發(fā)生崩潰導(dǎo)致數(shù)據(jù)不一致。這被稱為 “Redo Log for Undo Log”

五、相關(guān)參數(shù)與最佳實踐

  • innodb_undo_tablespaces: 設(shè)置獨立 Undo 表空間的個數(shù)。通常建議設(shè)置為 2 或更多,便于管理和空間回收。
  • innodb_max_undo_log_size: 指定每個 Undo 表空間文件的最大大?。J(rèn)為 1GB)。超過此值,表空間會被標(biāo)記為可截斷。
  • innodb_undo_log_truncate: 是否啟用自動截斷(收縮)Undo 表空間的功能。強烈建議開啟(=ON),否則 Undo 表空間會無限增長。
  • innodb_purge_threads: Purge 線程的數(shù)量。在高并發(fā)寫場景下,可以適當(dāng)增加此值(如設(shè)置為 4)以加快過期 Undo Log 的清理速度。

最佳實踐

  • 啟用獨立 Undo 表空間和自動截斷,避免 ibdata1 文件無限膨脹。
  • 對于有大事務(wù)長事務(wù)的系統(tǒng),需要特別關(guān)注 Undo Log 的增長。因為一個長時間未提交的事務(wù)會阻止 Purge 線程清理它之后產(chǎn)生的所有 Undo Log,可能導(dǎo)致 Undo 表空間急劇增長。
  • 監(jiān)控 SHOW ENGINE INNODB STATUS\G 輸出中的 TRANSACTIONS 部分,關(guān)注歷史鏈表長度(History list length),它代表了未 Purge 的 Undo Log 頁的數(shù)量。

總結(jié)

Undo Log 是 InnoDB 引擎的基石之一,它遠不止是“回滾”那么簡單。它的核心價值在于:

  • 保障原子性:為事務(wù)回滾提供基礎(chǔ)。
  • 實現(xiàn) MVCC:構(gòu)建數(shù)據(jù)行的多版本,是實現(xiàn)非鎖定讀(快照讀)、提升數(shù)據(jù)庫并發(fā)性能的關(guān)鍵。

理解 Undo Log 的工作原理,對于深入掌握 MySQL 的事務(wù)機制、MVCC 以及進行性能調(diào)優(yōu)和故障排查都至關(guān)重要。

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

相關(guān)文章

  • mysql執(zhí)行腳本導(dǎo)入表和數(shù)據(jù)后中文注釋亂碼的問題解決

    mysql執(zhí)行腳本導(dǎo)入表和數(shù)據(jù)后中文注釋亂碼的問題解決

    本人在使用不同版本下進行操作時,就會出現(xiàn)中文亂碼的問題,,例如我本地安裝mysql8,服務(wù)器安裝的是mysql5,然后本地連接服務(wù)器的mysql后,執(zhí)行SQL腳本之后發(fā)現(xiàn)中文全部亂碼,所以本文介紹了mysql執(zhí)行腳本導(dǎo)入表和數(shù)據(jù)后中文注釋亂碼的問題解決,需要的朋友可以參考下
    2024-04-04
  • 從索引到架構(gòu)的MySQL大表查詢優(yōu)化實戰(zhàn)指南

    從索引到架構(gòu)的MySQL大表查詢優(yōu)化實戰(zhàn)指南

    在MySQL實際開發(fā)中,大表查詢慢是最常見、最頭疼的性能問題,本文將從索引優(yōu)化、SQL優(yōu)化、架構(gòu)優(yōu)化、配置優(yōu)化四個維度出發(fā),結(jié)合可復(fù)現(xiàn)的實戰(zhàn)SQL、原理分析、避坑指南,給出一套全鏈路的大表查詢優(yōu)化方案,幫你把性能提升100倍以上
    2026-03-03
  • Mysql將字符串按照指定字符分割的正確方法

    Mysql將字符串按照指定字符分割的正確方法

    字符串分割是我們開發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關(guān)于Mysql將字符串按照指定字符分割的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • Docker搭建Mysql8的主從復(fù)制實例代碼

    Docker搭建Mysql8的主從復(fù)制實例代碼

    Docker是一種流行的容器化平臺,可以用來輕松部署、擴展和管理各種應(yīng)用程序,使用?Docker?部署?MySQL?8?的主從復(fù)制可以讓你實現(xiàn)數(shù)據(jù)的備份和讀寫分離,提高數(shù)據(jù)庫的可用性和性能,這篇文章主要介紹了Docker搭建Mysql8的主從復(fù)制,需要的朋友可以參考下
    2026-05-05
  • mysql實現(xiàn)將data文件直接導(dǎo)入數(shù)據(jù)庫文件

    mysql實現(xiàn)將data文件直接導(dǎo)入數(shù)據(jù)庫文件

    這篇文章主要介紹了mysql實現(xiàn)將data文件直接導(dǎo)入數(shù)據(jù)庫文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 一條SQL更新語句的執(zhí)行過程解析

    一條SQL更新語句的執(zhí)行過程解析

    這篇文章主要介紹了一條SQL更新語句的執(zhí)行過程解析,所以一條更新語句的執(zhí)行流程又是怎樣的呢?下面我們一起進入文章了解更多具體內(nèi)容吧
    2022-05-05
  • 連接mysql報錯——沒有設(shè)置“usessl=false”的問題

    連接mysql報錯——沒有設(shè)置“usessl=false”的問題

    這篇文章主要介紹了連接mysql報錯——沒有設(shè)置“usessl=false”的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL創(chuàng)建、刪除索引的操作代碼

    MySQL創(chuàng)建、刪除索引的操作代碼

    本文給大家介紹MySQL創(chuàng)建、刪除索引的操作代碼,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • mysql8.0.2離線安裝配置方法圖文教程

    mysql8.0.2離線安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql8.0.2離線安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • mysql報錯1267?-?Illegal?mix?of?collations問題的解決方法

    mysql報錯1267?-?Illegal?mix?of?collations問題的解決方法

    這篇文章主要介紹了mysql報錯1267?-?Illegal?mix?of?collations問題的解決方法,解決這個問題的方法是將兩個字符集統(tǒng)一起來,文中介紹了好幾種解決的辦法,需要的朋友可以參考下
    2025-01-01

最新評論

淄博市| 睢宁县| 陇西县| 普定县| 当涂县| 鹤峰县| 陇南市| 墨玉县| 闽侯县| 正定县| 霍邱县| 普陀区| 正镶白旗| 吴桥县| 平和县| 马龙县| 鄂托克前旗| 绥滨县| 河东区| 兴化市| 鹤壁市| 托里县| 和林格尔县| 固阳县| 吉林省| 林州市| 喀什市| 宁都县| 洛川县| 彰武县| 中江县| 宜章县| 武城县| 通州市| 梅州市| 海安县| 阳城县| 高州市| 治县。| 十堰市| 虎林市|