[轉]MySQL日志——Undo | Redo

本文是介紹MySQL數據庫InnoDB存儲引擎重做日志漫游

00 – Undo Log
Undo Log 是為了實現事務的原子性,在MySQL數據庫InnoDB存儲引擎中,還用Undo Log來實現多版本并發控制(簡稱:MVCC)。

- 事務的原子性(Atomicity)
??事務中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在執行的過程中發生
??了錯誤,要回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過。

- 原理
? Undo Log的原理很簡單,為了滿足事務的原子性,在操作任何數據之前,首先將數據備份到一個地方
? (這個存儲數據備份的地方稱為Undo Log)。然后進行數據的修改。如果出現了錯誤或者用戶執行了
? ROLLBACK語句,系統可以利用Undo Log中的備份將數據恢復到事務開始之前的狀態。

除了可以保證事務的原子性,Undo Log也可以用來輔助完成事務的持久化。

- 事務的持久性(Durability)
? 事務一旦完成,該事務對數據庫所做的所有修改都會持久的保存到數據庫中。為了保證持久性,數據庫
? 系統會將修改后的數據完全的記錄到持久的存儲上。

- 用Undo Log實現原子性和持久化的事務的簡化過程
? 假設有A、B兩個數據,值分別為1,2。
? A.事務開始.
? B.記錄A=1到undo log.
? C.修改A=3.
? D.記錄B=2到undo log.
? E.修改B=4.
? F.將undo log寫到磁盤。
? G.將數據寫到磁盤。
? H.事務提交
? 這里有一個隱含的前提條件:‘數據都是先讀到內存中,然后修改內存中的數據,最后將數據寫回磁盤’。

? 之所以能同時保證原子性和持久化,是因為以下特點:
? A. 更新數據前記錄Undo log。
? B. 為了保證持久性,必須將數據在事務提交前寫到磁盤。只要事務成功提交,數據必然已經持久化。
? C. Undo log必須先于數據持久化到磁盤。如果在G,H之間系統崩潰,undo log是完整的,
? ? ?可以用來回滾事務。
? D. 如果在A-F之間系統崩潰,因為數據沒有持久化到磁盤。所以磁盤上的數據還是保持在事務開始前的狀態。

缺陷:每個事務提交前將數據和Undo Log寫入磁盤,這樣會導致大量的磁盤IO,因此性能很低。

如果能夠將數據緩存一段時間,就能減少IO提高性能。但是這樣就會喪失事務的持久性。因此引入了另外一
種機制來實現持久化,即Redo Log.

01 – Redo Log

- 原理
? 和Undo Log相反,Redo Log記錄的是新數據的備份。在事務提交前,只要將Redo Log持久化即可,
? 不需要將數據持久化。當系統崩潰時,雖然數據沒有持久化,但是Redo Log已經持久化。系統可以根據
? Redo Log的內容,將所有數據恢復到最新的狀態。

- Undo + Redo事務的簡化過程
? 假設有A、B兩個數據,值分別為1,2.
? A.事務開始.
? B.記錄A=1到undo log.
? C.修改A=3.
? D.記錄A=3到redo log.
? E.記錄B=2到undo log.
? F.修改B=4.
? G.記錄B=4到redo log.
? H.將redo log寫入磁盤。
? I.事務提交

-?Undo + Redo事務的特點
? A. 為了保證持久性,必須在事務提交前將Redo Log持久化。
? B. 數據不需要在事務提交前寫入磁盤,而是緩存在內存中。
? C. Redo Log 保證事務的持久性。
? D. Undo Log 保證事務的原子性。
? E. 有一個隱含的特點,數據必須要晚于redo log寫入持久存儲。

- IO性能
? Undo + Redo的設計主要考慮的是提升IO性能。雖說通過緩存數據,減少了寫數據的IO.
? 但是卻引入了新的IO,即寫Redo Log的IO。如果Redo Log的IO性能不好,就不能起到提高性能的目的。
? 為了保證Redo Log能夠有比較好的IO性能,InnoDB 的 Redo Log的設計有以下幾個特點:

? A. 盡量保持Redo Log存儲在一段連續的空間上。因此在系統第一次啟動時就會將日志文件的空間完全分配。
? ? ?以順序追加的方式記錄Redo Log,通過順序IO來改善性能。
? B. 批量寫入日志。日志并不是直接寫入文件,而是先寫入redo log buffer.當需要將日志刷新到磁盤時
? ? ?(如事務提交),將許多日志一起寫入磁盤.
? C. 并發的事務共享Redo Log的存儲空間,它們的Redo Log按語句的執行順序,依次交替的記錄在一起,
? ? ?以減少日志占用的空間。例如,Redo Log中的記錄內容可能是這樣的:
? ?? 記錄1: <trx1, insert …>
? ?? 記錄2: <trx2, update …>
? ?? 記錄3: <trx1, delete …>
? ?? 記錄4: <trx3, update …>
? ?? 記錄5: <trx2, insert …>
? D. 因為C的原因,當一個事務將Redo Log寫入磁盤時,也會將其他未提交的事務的日志寫入磁盤。
? E. Redo Log上只進行順序追加的操作,當一個事務需要回滾時,它的Redo Log記錄也不會從
? ?? Redo Log中刪除掉。

02 – 恢復(Recovery)

- 恢復策略
? 前面說到未提交的事務和回滾了的事務也會記錄Redo Log,因此在進行恢復時,這些事務要進行特殊的
? 的處理.有2中不同的恢復策略:

? A. 進行恢復時,只重做已經提交了的事務。
? B. 進行恢復時,重做所有事務包括未提交的事務和回滾了的事務。然后通過Undo Log回滾那些
?? ? 未提交的事務。

- InnoDB存儲引擎的恢復機制
? MySQL數據庫InnoDB存儲引擎使用了B策略, InnoDB存儲引擎中的恢復機制有幾個特點:

? A. 在重做Redo Log時,并不關心事務性。 恢復時,沒有BEGIN,也沒有COMMIT,ROLLBACK的行為。
? ? ?也不關心每個日志是哪個事務的。盡管事務ID等事務相關的內容會記入Redo Log,這些內容只是被當作
? ?? 要操作的數據的一部分。
? B. 使用B策略就必須要將Undo Log持久化,而且必須要在寫Redo Log之前將對應的Undo Log寫入磁盤。
? ?? Undo和Redo Log的這種關聯,使得持久化變得復雜起來。為了降低復雜度,InnoDB將Undo Log看作
? ?? 數據,因此記錄Undo Log的操作也會記錄到redo log中。這樣undo log就可以象數據一樣緩存起來,
? ?? 而不用在redo log之前寫入磁盤了。
? ?? 包含Undo Log操作的Redo Log,看起來是這樣的:
? ?? 記錄1: <trx1,?Undo log insert?<undo_insert …>>
? ?? 記錄2: <trx1, insert …>
? ?? 記錄3: <trx2,?Undo log insert?<undo_update …>>
? ?? 記錄4: <trx2, update …>
? ?? 記錄5: <trx3,?Undo log insert?<undo_delete …>>
? ?? 記錄6: <trx3, delete …>
? C. 到這里,還有一個問題沒有弄清楚。既然Redo沒有事務性,那豈不是會重新執行被回滾了的事務?
? ?? 確實是這樣。同時Innodb也會將事務回滾時的操作也記錄到redo log中。回滾操作本質上也是
? ?? 對數據進行修改,因此回滾時對數據的操作也會記錄到Redo Log中。
? ?? 一個回滾了的事務的Redo Log,看起來是這樣的:
? ?? 記錄1: <trx1, Undo log insert <undo_insert …>>
? ?? 記錄2: <trx1,?insert A…>
? ?? 記錄3: <trx1, Undo log insert <undo_update …>>
? ?? 記錄4: <trx1,?update B…>
? ?? 記錄5: <trx1,?Undo log insert?<undo_delete …>>
? ?? 記錄6: <trx1,?delete C…>
? ?? 記錄7: <trx1,?insert C>
? ?? 記錄8: <trx1,?update B?to old value>
? ?? 記錄9: <trx1,?delete A>
? ?? 一個被回滾了的事務在恢復時的操作就是先redo再undo,因此不會破壞數據的一致性.

- InnoDB存儲引擎中相關的函數
? Redo: recv_recovery_from_checkpoint_start()
? Undo: recv_recovery_rollback_active()
? Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

轉載至:http://www.cnblogs.com/Bozh/archive/2013/03/18/2966494.html

轉載于:https://www.cnblogs.com/liujiacai/p/7595136.html

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

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

相關文章

Vim操作指南

vim具有6種基本模式和5種派生模式。 基本模式 普通模式 插入模式 可視模式 選擇模式 命令行模式 Ex模式 派生模式 操作符等待模式 插入普通模式 插入可視模式 插入選擇模式 替換模式 1.移動光標&#xff08;普通模式下&#xff09; h&#xff1a;左 j&#xff1a;下 …

[DP/單調隊列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 購買飼料

首先我想吐槽的是題目并沒有表明數據范圍。。。 這個題目 DP方程并不難表示。 dp[i][j]表示前i個地點攜帶了j個貨物的最小花費 dp[i][j] dp[i-1][k] (j-k) * cost j*j*(leng[i]-leng[i-1]) 如果你這樣直接提交上去&#xff0c;恭喜你超時&#xff01;&#xff01;&#xff0…

十天沖刺09

今天&#xff0c;和小伙伴在做密保功能的開發&#xff0c;而且通過密保可以找回用戶密碼。轉載于:https://www.cnblogs.com/Excusezuo/p/10923690.html

hdu 6168 Numbers

zk has n numbers a1,a2,...,an. For each (i,j) satisfying 1≤i<j≤n, zk generates a new number (aiaj). These new numbers could make up a new sequence b1&#xff0c;b2,...,bn(n?1)/2 . LsF wants to make some trouble. While zk is sleeping, Lsf mixed up seq…

039_MySQL_多表查詢

#創建部門 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment PRIMARY KEY,dname VARCHAR(50) not null COMMENT 部門名稱 )ENGINEINNODB DEFAULT charset utf8;#添加部門數據 INSERT INTO dept VALUES (1, 教學部); INSERT INTO dept VALUES (2, 銷售部); IN…

sqlserver 創建對某個存儲過程執行情況的跟蹤

有時候需要抓取執行存儲過程時某個參數的值&#xff0c;有時候程序調用存儲過程執行后結果不太對&#xff0c;不確定是程序的問題還是存儲過程的問題&#xff0c;需要單獨執行存儲過程看結果 即可用下面的方法 -- --創建對某個存儲過程的執行情況的跟蹤 --注意修改路徑 和 obje…

5.7 彈性盒子

彈性盒子定義彈性盒子 display&#xff1a;flex定義子元素排列方式 flex-diection定義子元素換行方式 flxe-wrap定義子元素對齊方式橫向對齊 justify-content縱向對齊 align-items 媒體查詢 media screen and (max-width:最大寬度)and &#xff08;min-width&#xff1a;最小…

4.navicat11激活教程,親測可用哦!

原文地址&#xff1a;http://blog.csdn.net/sanbingyutuoniao123/article/details/52589678Navicat是一款數據庫管理工具, 用于簡化, 開發和管理MySQL, SQL Server, SQLite, Oracle 和 PostgreSQL 的數據庫&#xff1b;Navicat數據模型工具以圖形化方式創建關聯式數據庫&#x…

漢諾塔問題深度剖析(python實現)

當我們學習一門編程語言的時候&#xff0c;都會遇到遞歸函數這個問題。而學習遞歸的一個經典案例就是漢諾塔問題。通過這篇文章&#xff0c;觀察移動三個盤子和四個盤子的詳細過程&#xff0c;您不僅可以深刻的了解遞歸&#xff0c;也更加熟悉了漢諾塔的游戲的玩法。 更好的閱讀…

iOS-QQ臨時對話、QQ群申請跳轉

QQ 臨時對話 NSString *qq [NSString stringWithFormat:"mqq://im/chat?chat_typewpa&uin%&&version1&src_typeweb","這是是QQ號碼"];NSURL *urlQQ [NSURL URLWithString:qq];[[UIApplication sharedApplication] openURL:urlQQ]; QQ 申…

[luoguP2331] [SCOI2005]最大子矩陣(DP)

傳送門 orz不會做。。。 一個好理解的做法&#xff08;n^3*k&#xff09;&#xff1a; 分n1和n2兩種情況考慮。 n1時&#xff0c;預處理出前綴和sum[]。 設f[i][j]為到達第i格&#xff0c;已經放了j個子矩陣的最大和&#xff0c; 那么每次先把f[i][j]的值設為f[i-1][j]&#xf…

想要去阿里面試?你必須得跨過 JVM 這道坎!

概述 很多人想要到阿里巴巴、美團、京東等互聯網大公司去面試&#xff0c;但是現在互聯網大廠面試一般都必定會考核JVM相關的知識積累和實踐經驗&#xff0c;畢竟線上系統寫好代碼部署之后&#xff0c;每個工程師都必須關注JVM相關的東西&#xff0c;比如OOM、GC等問題. 所以一…

醫學知識圖譜一

大綱 知識自動提取技術 醫學知識融合 醫學知識推理 轉載于:https://www.cnblogs.com/quietwalk/p/9000950.html

在一個div里,列表樣式圖片進行float,實現水平排序

<div class"xiangce"><ul> <li><a href"#"><img src"images/pic4.gif" alt"">產品名稱</a></li><li><a href"#"><img src"images/pic4.gif" alt"…

團隊開發git使用各種問題

參考:https://www.cnblogs.com/schaepher/p/4933873.html 問題-3:保持github上項目干凈&#xff0c;對于在不同機器上運行會不同的文件不予維護(如.idea/workspace.xml) 建議:對于項目輸出在項目目錄中的文件不予維護 對于IDE自動生成且與項目所在目錄有關的文件不予維護 將這些…

filebeat 亂碼

查看 文件的類型 [rootelk-node-1 rsyslog] # file 192.168.1.16.log 192.168.1.16.log: Non-ISO extended-ASCII text, with very long lines, with LF, NEL line terminators 如果命令返回結果說明改日志為utf-8&#xff0c;則logstash配置文件中charset設置為UTF-8 如果命令…

團隊編程項目代碼設計規范(爬取豆瓣電影top250)

基本格式 縮進 使用4個空格進行縮進 行寬 每行代碼盡量不超過80個字符 理由&#xff1a; 這在查看side-by-side的diff時很有幫助方便在控制臺下查看代碼太長可能是設計有缺陷換行 Python支持括號內的換行。這時有兩種情況。 第二行縮進到括號的起始處foo long_function_name(v…

程序員的浪漫

程序員的浪漫 馬上就到520了&#xff0c;各位小伙伴想好了準備什么禮物送個自己的另一半呢&#xff1f;還沒想好的注意啦&#xff01;&#xff01;現在還有機會&#xff0c;今天給大家分享一些程序員的浪漫創意禮物&#xff0c;希望你可以從中找到一些靈感。 One Link&#xff…

14-1 部署項目

1313轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/9011671.html

The listener supports no services

$ lsnrctl start 報錯提示: The listener supports no services The command completed successfully 如圖所示&#xff1a; 這樣啟動后遠程連接會報錯&#xff1a; oracle ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 問題原…