1. 程式人生 > >undo log與redo log原理分析

undo log與redo log原理分析

資料庫通常藉助日誌來實現事務,常見的有undo log、redo log,undo/redo log都能保證事務特性,這裡主要是原子性和永續性,即事務相關的操作,要麼全做,要麼不做,並且修改的資料能得到持久化。

假設資料庫在操作時,按如下約定記錄日誌:

1. 事務開始時,記錄START T
2. 事務修改時,記錄(T,x,v),說明事務T操作物件x,x的值為v 
3. 事務結束時,記錄COMMIT T 

undo log原理

undo log是把所有沒有COMMIT的事務回滾到事務開始前的狀態,系統崩潰時,可能有些事務還沒有COMMIT,在系統恢復時,這些沒有COMMIT的事務就需要藉助undo log來進行回滾。

使用undo log時,要求:

1. 記錄修改日誌時(redo log),(T,x,v)中v為x修改前的值,這樣才能藉助這條日誌來回滾;
2. 事務提交後,必須在事務的所有修改(包括記錄的修改日誌)都持久化後才能寫COMMIT T日誌;這樣才能保證,宕機恢復時,已經COMMIT的事務的所有修改都已經持久化,不需要回滾。 

使用undo log時事務執行順序

1. 記錄START T 
2. 記錄需要修改的記錄的舊值(要求持久化)
3. 根據事務的需要更新資料庫(要求持久化)
4. 記錄COMMIT T 

使用undo log進行宕機回滾

1. 掃描日誌,找出所有已經START,還沒有COMMIT的事務。
2. 針對所有未COMMIT的日誌,根據redo log來進行回滾。 

如果資料庫訪問很多,日誌量也會很大,宕機恢復時,回滾的工作量也就很大,為了加快回滾,可以通過checkpoint機制來加速回滾,

  1. 在日誌中記錄checkpoint_start (T1,T2…Tn) (Tx代表做checkpoint時,正在進行還未COMMIT的事務)
  2. 等待所有正在進行的事務(T1~Tn)COMMIT
  3. 在日誌中記錄checkpoint_end

藉助checkpoint來進行回滾

從後往前,掃描undo log
1,如果先遇到checkpoint_start, 則將checkpoint_start之後的所有未提交的事務進行回滾;
2. 如果先遇到checkpoint_end, 則將前一個checkpoint_start之後所有未提交的事務進行回滾;(在checkpoint的過程中,可能有很多新的事務START或者COMMIT)。 

使用undo log,在寫COMMIT日誌時,要求redo log以及事務的所有修改都必須已經持久化,這種做法通常很影響效能。

redo log原理

redo log是指在回放日誌的時候把已經COMMIT的事務重做一遍,對於沒有commit的事務按照abort處理,不進行任何操作。

使用redo log時,要求:

1. 記錄redo log時,(T,x,v)中的v必須是x修改後的值,否則不能通過redo log來恢復已經COMMIT的事務。
2. 寫COMMIT T日誌之前,事務的修改不能進行持久化,否則恢復時,對於未COMMIT的操作,可能有資料已經修改,但重放redo log不會對該事務做任何處理,從而不能保證事務的原子性。 

使用redo log時事務執行順序

1. 記錄START T
2. 記錄事務需要修改記錄的新值(要求持久化)
3. 記錄COMMIT T(要求持久化)
4. 將事務相關的修改寫入資料庫 

使用redo log重做事務

1. 掃描日誌,找到所有已經COMMIT的事務;
2. 對於已經COMMIT的事務,根據redo log重做事務; 

在日誌中使用checkpoint

1. 在日誌中記錄checkpoint_start (T1,T2...Tn) (Tx代表做checkpoint時,正在進行還未COMMIT的日誌)
2. 將所有已提交的事務的更改進行持久化;
3. 在日誌中記錄checkpoint_end 

根據checkpoint來加速恢復

從後往前,掃描redo log
1,如果先遇到checkpoint_start, 則把T1~Tn以及checkpoint_start之後的所有已經COMMIT的事務進行重做;
2. 如果先遇到checkpoint_end, 則T1~Tn以及前一個checkpoint_start之後所有已經COMMIT的事務進行重做; 

與undo log類似,在使用時對持久化以及事務操作順序的要求都比較高,可以將兩者結合起來使用,在恢復時,對於已經COMMIT的事務使用redo log進行重做,對於沒有COMMIT的事務,使用undo log進行回滾。redo/undo log結合起來使用時,要求同時記錄操作修改前和修改後的值,如(T,x,v,w),v為x修改前的值,w為x修改後的值,具體操作順序為:

1. 記錄START T
2. 記錄修改日誌(T,x,v,w)(要求持久化,其中v用於undo,w用於redo)
3. 更新資料庫
4. 記錄 COMMIT T 

4和3的操作順序沒有嚴格要求,並且都不要求持久化;因為如果宕機時4已經持久化,則恢復時可通過redo log來重做;如果宕機時4未持久化,則恢復時可通過undo log來回滾;在處理checkpoint時,可採用與redo log相同的處理方式。

相關推薦

undo logredo log原理分析

資料庫通常藉助日誌來實現事務,常見的有undo log、redo log,undo/redo log都能保證事務特性,這裡主要是原子性和永續性,即事務相關的操作,要麼全做,要麼不做,並且修改的資料能得到持久化。 假設資料庫在操作時,按如下約定記錄日誌: 1. 事務開始時

Mysql-事務Redo LogUndo Log

一 Undo Log Undo Log是為了實現事務的原子性,在MySQL資料庫InnoDB儲存引擎中,還用Undo Log來實現多版本併發控制(簡稱:MVCC)。 1   事務的原子性(Atomicity) 事務中的所有操作,要麼全部完成,要麼不做任何操作,不能只做部

Mysql裡的 undo logredo log

轉載自:http://doc.okbase.net/xinysu/archive/259593.html 1 undo 1.1 undo是啥 undo日誌用於存放資料修改被修改前的值,假設修改 tba 表中 id=2的行資料,把Name='B' 修改為Name = 'B2' ,那麼u

bin logredo logundo log和MVVC

cond 存在 mvc 一個 -c 能夠 開始 elastic 復制。 logs innodb事務日誌包括redo log和undo log。redo log是重做日誌,提供前滾操作,undo log是回滾日誌,提供回滾操作。 undo log不是redo log的逆向過程

binlog的作用及redo log的區別

區別 二進位制日誌(bin log)會記錄所有與MySQL資料庫有關的日誌記錄,包括InnoDB、MyISAM、Heap等其他儲存引擎的日誌。而InnoDB儲存引擎的重做日誌只記錄有關該儲存引擎本身的事務日誌。 其次,記錄的內容不同,無論使用者將二進位制日誌檔案記錄的格式設為STATEMENT還是RO

TCP快速重傳快速恢復原理分析

轉自 http://blog.csdn.net/zhangskd/article/details/7174682 超時重傳是TCP協議保證資料可靠性的一個重要機制,其原理是在傳送一個數據以後就開啟一個計時器,在一定時間內如果沒有得到傳送資料報的ACK報文,那麼就重新發送資

如何修改TextView連結點選實現(包含連結生成點選原理分析)

*這篇文章的主要目的是想要大家學習如何瞭解實現,修改實現,以達到舉一反三,自行解決問題的目的。 某天遇到這麼一個需求:在TextView中的文字連結要支援跳轉,嗯,這個好辦,TextView本身是支援的,我們只用新增一項屬性就可以搞定: androi

【一起學原始碼-微服務】Ribbon 原始碼三:RibbonEureka整合原理分析

前言 前情回顧 上一篇講了Ribbon的初始化過程,從LoadBalancerAutoConfiguration 到RibbonAutoConfiguration 再到RibbonClientConfiguration,我們找到了ILoadBalancer預設初始化的物件等。 本講目錄 這一講我們會進一步往下

詳細分析MySQL事務日誌(redo logundo log)

innodb事務日誌包括redo log和undo log。redo log是重做日誌,提供前滾操作.undo log是回滾日誌,提供回滾操作。undo log和redo log都算是用來恢復的日誌:1.redo log通常是物理日誌,記錄的是資料頁的物理修改,而不是某一行或

MySQL的日誌(二):事務日誌(redo logundo log)

drive datadir sse 詳細分析 mut 通過 註意 默認 into 本文目錄:1.redo log 1.1 redo log和二進制日誌的區別 1.2 redo log的基本概念 1.3 日誌塊(log block) 1.4 log group和redo lo

Oracle Redo log 狀態及工作原理解析

Oracle重做日誌(redo log)是用來記錄操作條目,用於資料庫資料恢復。為了提高效率,oracle通常建議設定三組redo log。本文將對重做日誌組的狀態以及多種狀態之間切換做解析,力求掌握該知識點。  概述 oracle重做日誌組通常有四種狀態,即unused,inactive,ac

mysql undo redo log在事務中起的作用

轉載自:https://blog.csdn.net/hzllblzjily/article/details/50806047 本文是介紹MySQL資料庫InnoDB儲存引擎重做日誌漫遊 00 – Undo Log Undo Log 是為了實現事務的原子性,在MySQL資料庫InnoDB儲

MySQL日誌系統:redo logbinlog

日誌系統主要有redo log(重做日誌)和binlog(歸檔日誌)。redo log是InnoDB儲存引擎層的日誌,binlog是MySQL Server層記錄的日誌, 兩者都是記錄了某些操作的日誌(不是所有)自然有些重複(但兩者記錄的格式不同)。 圖來自極客時間的mysql實踐,該圖是描述的是MyS

[Mysql] redo log binlog 的區別

redo log(重做日誌)和 binlog(歸檔日誌) MySQL redo log 與 binlog 的區別 什麼是redo log 什麼是binlog redo log與binlog的區別 1. 什麼是redo log

MySQL中的重做日誌(redo log),回滾日誌(undo log),以及二進位制日誌(binlog)的簡單總結

MySQL中有六種日誌檔案, 分別是:重做日誌(redo log)、回滾日誌(undo log)、二進位制日誌(binlog)、錯誤日誌(errorlog)、慢查詢日誌(slow query log)、一般查詢日誌(general log),中繼日誌(relay log)。 其中重做日誌和回滾日誌與

dataguard 下主備 online redo standby redo log resize 重建

環境說明: 本實驗環境是一個節點的rac + 單節點 asm dg     database 與 grid 版本是 11.2.0.4 。 提別提醒 如果是多節點叢集,操作時需要特別注意 thread 。 一. 主庫操作   1.1 檢視redo 資訊 SQL> col

手機主叫的通道流程Modem Log簡單分析

最近組內一起學習分享了關於Modem的一些基礎知識,記下以備將來看看。 一. 相關概念          信令:在網路中傳輸著各種訊號,其中一部分是我們需要的(例如打電話的語音,上網的資料包等等),而另外一部分是我們不需要的(只能說不是直接需要)它用來專門控制電路的,這一型

binlog,redo logundo log區別

1. binlog是MySQL Server層記錄的日誌, redo log是InnoDB儲存引擎層的日誌。 兩者都是記錄了某些操作的日誌(不是所有)自然有些重複(但兩者記錄的格式不同)。 2. 選擇binlog日誌作為replication我想主要原因是MySQL的特點

數據庫原理 - 序列4 - 事務是如何實現的? - Redo Log解析(續)

原子性 列表 存在 截斷 cover 新的 第一次 6.4 遍歷 > 本文節選自《軟件架構設計:大型網站技術架構與業務架構融合之道》第6.4章節。 作者微信公眾號:> 架構之道與術。進入後,可以加入書友群,與作者和其他讀者進行深入討論。也可以在京東、天貓上購買紙

數據庫原理 - 序列3 - 事務是如何實現的? - Redo Log解析

6.5 分析 app statement delete 持久 method append 接下來 6.5 事務實現原理之1:Redo Log 介紹事務怎麽用後,下面探討事務的實現原理。事務有ACID四個核心屬性:A:原子性。事務要麽不執行,要麽完全執行。如果執行到一半,宕