91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql中undo log 及 redo log是什么

發布時間:2021-11-08 09:21:50 來源:億速云 閱讀:229 作者:小新 欄目:MySQL數據庫

這篇文章將為大家詳細講解有關mysql中undo log 及 redo log是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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()

關于“mysql中undo log 及 redo log是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

晴隆县| 塔河县| 和田县| 礼泉县| 若尔盖县| 全南县| 砚山县| 三江| 米脂县| 军事| 浦江县| 嫩江县| 大丰市| 德州市| 隆尧县| 濮阳市| 五台县| 西平县| 西充县| 玉树县| 河西区| 福安市| 冷水江市| 神木县| 榆林市| 浮山县| 陵川县| 泰兴市| 石景山区| 临江市| 五寨县| 类乌齐县| 紫云| 上林县| 招远市| 赣榆县| 青龙| 泌阳县| 桃园市| 新化县| 大同县|