MySQL的事務日志:

目錄

redo(重做日志):

特點:

組成:

整體流程:

redo log buffer與redo log file之間的刷盤策略:

異步刷盤:

同步刷盤:

拆中策略:

undo(回滾日志):

存儲結構:

undo頁的重用:

回滾段與事務:

回滾段中的數據分類:

未提交的回滾數據:

已經提交但未過期的回滾數據:

事務已經提交并過期的數據:

生成過程:

類型分類:

insert undo log:

update undo log:

undo刪除:

insert undo log:

update undo log:

總結:


事務的隔離由鎖機制實現,而事務的原子性、一致性和持久性是由事務的redo日志和undo日志來保證。其中redo是指重做日志,是存儲引擎生成的日志,記錄的是“物理級別”上的頁修改操作,提供再寫入操作,回復提交事務修改的頁操作,用于保證事務的持久性。undo日志是指回滾日志,是存儲引擎層生成的日志,記錄的是邏輯操作日志,回滾行記錄到某個特定的版本,用于保證事務的原子性、一致性。

redo(重做日志):

InnoDB存儲引擎是以頁為單位來管理存儲空間的,在訪問頁面之前,需要把磁盤上的頁緩存到內存中的緩沖池里面才可以訪問。所有的變更都必須先更新緩沖池中的數據,然后緩沖池中的臟頁(內存中修改了而磁盤中還未修改的數據頁)會一定的頻率被刷入磁盤,通過緩沖池來優化CPU和磁盤之間的交互。

InnoDB存儲引擎的事務采用了WAL技術,WAL技術的思想是先寫日志,再寫磁盤,只有當日志寫入成功,才算事務提交成功,而這里的日志指的是redo日志。當事務提交成功之后,還沒有進行刷盤時,發生了宕機,就可以通過redo日志來進行恢復數據。

優點是:降低了刷盤的頻率(不用去維持實時刷新磁盤),占用的空間非常小(存儲表空間id,頁號,偏移量以及需要更新的值,所以存儲空間很小,而且刷盤速度快)。

特點:

redo日志是順序寫入磁盤的,在執行事務的過程中,每執行一條語句,就可能產生若干條redo日志,這些日志是按照產生的順序寫入磁盤的,使用順序IO,效率比隨機IO快。

事務執行過程中,redo不斷記錄,在事務執行過程中,是一直不斷地往redo順序記錄,直到事務提交。

組成:

重做日志的緩沖(redo log buffer),保存在內存中,是易丟失。服務器啟動時就向操作系統申請了一大片重做日志的緩沖的連續內存空間,也就是redo日志緩沖區,這片內存空間被分成很多連續的redo log block,一個占用512字節。

重做日志文件(redo log file),保存在硬盤中,是持久的。

整體流程:

先將原數據從磁盤中讀入內存中,修改數據的內存拷貝。

生成一條重做日志并寫入redo log buffer,記錄的是數據被修改后的值。

當事務提交時,將redo log buffer中的內存刷新到redo log file,對redo log file采用追加寫的方式。

定期將內存中修改的數據刷新到磁盤中。

redo log buffer與redo log file之間的刷盤策略:

重做日志緩沖刷盤到重做日志文件不是真正的刷到磁盤中去,只是刷入到文件系統緩存中,真正的寫入由系統決定。而此時InnoDB就存在一個問題,如果系統宕機了,那么數據也會丟失。

所以針對這種情況,給出了一個innodb_flush_log_at_trx_commit參數來控制commit提交事務時,如何將重做日志緩沖中的日志刷新到重做日志文件中。

異步刷盤:

1.當innodb_flush_log_at_trx_commit=0時,表示每次事務提交時不進行刷盤操作。

InnoDB中有一個后臺線程,每隔1秒,會把重做日志緩沖中的內容寫道文件系統緩存中,然后調用刷盤操作。如果崩潰的話,可能會丟失1秒內的已提交事務數據。事務提交之后,不需要等待刷盤。

當一個沒有提交事務的重做日志記錄,也可能會刷盤。因為在事務執行過程中重做日志記錄會寫入到重做日志緩沖中,而這些記錄會被后臺線程刷盤。

當重做日志緩沖占用的空間即將達到innodb_log_buffer_size的一半時,后臺線程會主動刷盤。

如果事務最終未提交或者崩潰恢復時,會通過undo日志回滾已刷盤的的未提交數據,保證數據的原子性。

同步刷盤:

2.當innodb_flush_log_at_trx_commit=1時,表示每次事務提交時都將進行同步刷盤操作。(默認值)

只要事務提交成功,重做日志記錄一定在硬盤中,不會有任何數據丟失。如果事務執行期間宕機,相對應的部分日志丟失,但是事務并沒有提交,所以日志丟失也不會造成損失,可以保證持久性,數據不會丟失,但是效率最差,因為事務提交之后需要等待重做日志緩沖中的內容寫入到文件系統緩存中同時還要進行刷盤。

拆中策略:

3.當innodb_flush_log_at_trx_commit=2時,表示每次事務提交時都只把重做日志緩沖內容寫入到文件系統緩存中,不進行同步。由操作系統決定同步到磁盤文件中的時間。后臺線程以一定的時間間隔進行一次將文件系統緩存中的內容寫入到磁盤中。事務提交之后,需要將重做日志緩存中的內容寫入到文件系統緩存中,不需要等待刷盤。性能介于異步刷盤和同步刷盤之間。

如果操作系統宕機,文件系統緩存可能會有數據丟失,就無法滿足持久性。

undo(回滾日志):

在事務更新數據的前置操作要先寫入一個回滾日志。

undo是邏輯日志,只是將數據庫邏輯地恢復到原來的樣子,但是數據結構和頁本身在回滾之后可能不相同。

回滾日志也會產生重做日志,因為回滾日志也需要持久性的保護。

存儲結構:

InnoDB對undo的管理采用段的方式,也就是回滾段,每個回滾段記錄1024個undo log segment,在每個undo log segment段中進行undo頁的申請。

undo頁的重用:

當開啟一個事務需要寫undo日志時,就得去undo log segment中找空閑的位置,當有空閑位置時,就去申請undo頁,這樣的話,每開啟一個事務就申請一個頁,很浪費存儲空間。所以可以對undo頁進行判斷是否可以重用。

當事務提交時,并不會立刻刪除undo頁,因為undo頁的重用一個undo頁可能混雜著其他事務的undo log。undo log在事務提交后,會被放到一個鏈表中,然后判斷undo頁的使用空間是否小于3/4,如果小于,則表示當前的undo頁可以被重用,就不會被回收,其他事務的undo log可以記錄在當前的undo頁后面,由于undo頁是離散的,所以清理對應的磁盤空間時,效率不高。

回滾段與事務:

每個事務只會使用一個回滾段,一個回滾段在同一時刻可能會服務多個事務。

當一個事務開始時,會制定一個回滾段,在事務進行的過程中,數據被修改時,原始的數據會被覆蓋到回滾段中。

在回滾段中,事務會不斷填充盤區,直到事務結束或者空間被用完。如果當前盤區不夠用,那么事務會在段中請求擴展到下一個盤區,如果已分配的盤區都用完,事務會覆蓋最初的盤區或者在回滾段允許的情況下擴展新的盤區來使用。

回滾段存在于undo表空間中,在數據庫中可以存在多個undo表空間,但同一時刻只能使用一個undo表空間。

當事務提交時,InnoDB存儲引擎會將undo log放到列表中,以方便之后的清除操作,還會判斷undo log所在的頁是否可以重用,若可以則分配給下一個事務使用。

回滾段中的數據分類:

未提交的回滾數據:

該數據所關聯的事務未提交,用于實現讀一致性,所以該數據不能被其他事務的數據覆蓋。對應事務的活動狀態或者部分提交狀態。

已經提交但未過期的回滾數據:

該數據關聯的事務已經提交,但是仍受到undo retention參數的保持時間的影響。也就是事務提交之后,undo日志未被清理線程清理,主要針對的是update undo log。

事務已經提交并過期的數據:

該數據關聯的事務已經提交,而且數據保存時間已經超過undo retention參數指定的時間,屬于已經過期的數據。也就是事務提交之后,undo日志不再被MVCC依賴,清理線程通過掃描鏈表清理了過期條目。當回滾段滿了之后,會優先覆蓋“事務已經提交并過期的數據”。

事務提交之后不能馬上刪除undo log以及undo log所在的頁,因為可能還有在其他事務需要通過undo log來得到行之前的版本,事務提交時,會將undo log放入一個鏈表中。

生成過程:

InnoDB存儲引擎中有幾個隱藏的列:

DB_ROW_ID:如果沒有主鍵且沒有唯一索引,那么會自動添加一個隱藏列作為主鍵。

DB_TRX_ID:每個事務都會分配一個事務ID,當對某條記錄進行變更時,就會將這個事務ID寫入trx_id中。

DB_ROLL_PTR:回滾指針,指向undo log的指針。

當插入一條數據時,會生成一條undo log,記錄著undo log的序號、插入主鍵的列和值等信息,在進行回滾時,直接通過主鍵把對應的數據刪除即可。

更新操作會分更新主鍵和不更新主鍵的情況,

如果是不更新主鍵,就把此次更新之前的數據寫入到新的undo log中,讓回滾指針指向新的undo log,讓新的undo log指向舊的undo log,可以參考鏈表的頭插法。

如果是更新主鍵的操作,那么會把邏輯刪除的標識從0置為1,這個改變也需要通過一個undo log進行記錄頭插到該記錄的回滾指針后面,然后在此條記錄后面插入一條新的記錄且新的記錄的回滾指針指向的是主鍵更新前的記錄,新的記錄會產生undo log且undo log序號會遞增。

類型分類:

insert undo log:

僅處理insert操作新增的數據,用于事務回滾時刪除新插入的數據。回滾時根據主鍵直接刪除對應行。

update undo log:

記錄update和delete操作修改前的數據狀態,支持回滾與快照讀。update:保存被修改字段的舊值,delete:存儲整行數據的原始內容。

undo刪除:

insert undo log:

因為insert操作記錄,只對本事務可見,所以可以在事務提交后進行刪除。

update undo log:

該undo log可能需要提供MVCC機制,因此不能在事務提交時,就進行刪除,需要放到鏈表當中,等待清理線程進行最后的刪除。

總結:

目標數據如果不在緩存池中,將磁盤中的數據頁寫入到內存緩沖池中,將原數據寫入到undo日志中便于回滾,進行數據的更新操作,會將對應的數據寫入到redo日志緩存當中,當提交事務時,根據設定的刷盤策略來進行刷盤,將內存中的臟頁刷到磁盤當中。如果未提交或者事務崩潰,那么則根據undo日志進行一個數據回滾,恢復至原數據,保證數據的可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93804.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93804.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript 中 throw error 與 throw new Error(error) 的用法及區別,分別適合什么場景使用?

JavaScript 中 throw error 與 throw new Error(error) 的用法及區別 在 JavaScript 中,throw 關鍵字用于拋出異常。當代碼遇到某些錯誤或異常情況時,可以通過拋出錯誤來通知程序,方便后續的錯誤處理。盡管 throw 的使用看似簡單&#xff0c…

鴻蒙自帶組件效果大全

圖形變換-視效與模糊-通用屬性-ArkTS組件-ArkUI(方舟UI框架)-應用框架 - 華為HarmonyOS開發者 注意:找到需求效果之后先對一下版本 視距 圖像效果 圖片裁剪 顏色漸變 前景屬性設置 外描邊設置: 視效設置: 組件內容模糊 運動模糊 點擊回彈效果…

ISP算法如何優化提升成像質量

ISP算法通過多維度技術協同優化成像質量,核心優化路徑如下:一、降噪與細節增強?AI驅動降噪?深度學習模型實時識別噪點模式,暗光場景信噪比提升5倍以上,同時保留紋理細節。時空域聯合降噪技術抑制運動模糊,鬼影消除率…

單例模式及優化

單例模式是一種創建型設計模式,其核心是確保一個類在程序中只能存在唯一實例,并提供一個全局訪問點。這種模式適用于需要集中管理資源(如日志、配置、連接池)的場景,避免資源沖突和重復創建的開銷。 一、介紹 類型 單例…

Dockerfile優化指南:利用多階段構建將Docker鏡像體積減小90%

更多如果你已經跟隨我們之前的教程,親手將自己的應用裝進了Docker這個“魔法盒子”,那你可能很快就會遇到一個幸福但又尷尬的煩惱:你親手構建的Docker鏡像,竟然像一個塞滿了石頭和棉被的行李箱,臃腫不堪,笨…

英文PDF翻譯成中文怎么做?試試PDF翻譯工具

在全球化快速發展的時代,跨語言交流變得愈發頻繁,無論是學術研究、商務合作還是日常學習,都離不開一個高效、準確的翻譯工具。尤其是對于PDF文件的翻譯需求,更是日益增長。今天,就讓我們一起深入了解幾款在PDF翻譯領域…

macOS使用brew切換Python版本【超詳細圖解】

目錄 一、更新Homebrew倉庫 二、安裝pyenv 三、將pyenv添加到bash_profile文件中 四、使.bash_profile文件的更改生效 五、安裝需要的Python版本 六、設置全局使用的Python版本 七、檢查Python版本是否切換成功 pyenv常用命令 一、更新Homebrew倉庫 brew update 這個…

[矩陣置零]

初始思路分析 這段代碼實現了將矩陣中元素為0的行和列全部置零的功能。主要思路是使用標記數組記錄需要置零的行和列。以下是詳細分析&#xff1a; 1. 初始化階段 int m matrix.size(); int n matrix[0].size(); vector<bool> row(m), col(n);獲取矩陣的行數m和列數n創…

redis-集成prometheus監控(k8s)

一. 簡介&#xff1a; 關于redis的簡介和部署&#xff0c;可以參考單獨的文章redis-sentinel基礎概念及部署-CSDN博客&#xff0c;這里就不細說了。這里只講講如何在k8s中部署export并基于prometheus做redis的指標采集。 二. 實現方式&#xff1a; 首先我們需要先部署exporter…

OVS:ovn為什么默認選擇Geneve作為二層隧道網絡協議?

首先確認 Geneve 是一種封裝協議,可能提供比 VLAN 或 VXLAN 更靈活的擴展能力,這對 OVN 的多租戶場景很重要。可能需要支持更多元數據字段,比如攜帶網絡策略信息,這符合 SDN 集中控制的需求。 性能方面需要考慮封裝效率和硬件支持情況,雖然 Geneve 頭部稍大,但現代網卡的…

grep命令要點、詳解和示例

grep技術要點 1) 工作模型&#xff08;3 件事&#xff09; 輸入&#xff1a;從文件或標準輸入&#xff08;-&#xff09;讀入&#xff0c;一次按“行”處理&#xff08;除非用 -z 改成以 NUL 作為“行”分隔&#xff09;。匹配&#xff1a;把每一行拿去和模式&#xff08;patte…

nVidia Tesla P40使用anaconda本地重編譯pytorch3d成功加載ComfyUI-3D-Pack

背景 自己用的是nVidia Tesla P40&#xff0c;垃圾佬專屬卡 使用下面的由YanWenKun提供的ComfyUI-3D-Pack預安裝環境&#xff0c;但在本地編譯pytorch3d這一步出錯&#xff0c;后面有出錯信息&#xff0c;如果有和我一樣的卡一樣的問題&#xff0c;參看此文的解決方法 老版本…

網絡基礎——協議認識

文章目錄網絡基礎網絡的發展——引出一些概念協議認識初識協議協議分層協議分層的模型再談協議為什么要有TCP/IP協議TCP/IP協議的宏觀認識宏觀理解TCP/IP協議和操作系統的關系協議的真正本質網絡基礎 本篇文章&#xff0c;我們將正式進入網絡部分的學習。這是網絡部分的第一篇…

云原生俱樂部-RH134知識點總結(2)

這一章的內容也會比較多&#xff0c;因為預期三篇文章更完RH134系列&#xff0c;所以每章安排的內容都比較多&#xff0c;并且RH134上面的都是重點&#xff0c;一點也不好寫。昨天一天將RH124系列寫完了&#xff0c;今天爭取將RH134系列寫完。至于我為什么要著急將這些寫完&…

深度學習-計算機視覺-微調 Fine-tune

1. 遷移學習遷移學習&#xff08;transfer learning&#xff09;是一種機器學習方法&#xff0c;通過將源數據集&#xff08;如ImageNet&#xff09;上訓練得到的模型知識遷移到目標數據集&#xff08;如特定場景的椅子識別任務&#xff09;。這種方法的核心在于利用預訓練模型…

STL庫——string(類函數學習)

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;C語言&#xff1b; 文章目錄 前言 一、STL簡介 二、string類的優點 三、標準庫中的string類 四、string的成員函數 4.1、構造…

登上Nature!清華大學光學神經網絡研究突破

2025深度學習發論文&模型漲點之——光學神經網絡光學神經網絡的基本原理是利用光的傳播、干涉、衍射等特性來實現神經網絡中的信息處理和計算。在傳統神經網絡中&#xff0c;信息以電信號的形式在電子元件之間傳輸和處理&#xff0c;而在光學神經網絡中&#xff0c;信息則以…

【java】對word文件設置只讀權限

文件流輸出時 template.getXWPFDocument().enforceCommentsProtection(); 文件輸出時 //打開己創建的word文檔 XWPFDocument document new XWPFDocument(new FileInputStream("output.docx")); //設置文檔為只讀 document.enforceReadonlyProtection(); //保存文…

Zookeeper 在 Kafka 中扮演了什么角色?

在 Apache Kafka 的早期架構中&#xff0c;ZooKeeper 扮演了分布式協調服務角色&#xff0c;負責管理和協調整個 Kafka 集群。 盡管新版本的 Kafka 正在逐步移除對 ZooKeeper 的依賴&#xff0c;但在許多現有和較早的系統中&#xff0c;了解 ZooKeeper 的作用仍然非常重要。 Zo…

什么叫做 “可迭代的產品矩陣”?如何落地??

“可迭代的產品矩陣” 不是靜態的產品組合&#xff0c;而是圍繞用戶需求與商業目標構建的動態生態。它以核心產品為根基&#xff0c;通過多維度延伸形成產品網絡&#xff0c;同時具備根據市場反饋持續優化的彈性&#xff0c;讓產品體系既能覆蓋用戶全生命周期需求&#xff0c;又…