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機制來加速回滾,
- 在日誌中記錄checkpoint_start (T1,T2…Tn) (Tx代表做checkpoint時,正在進行還未COMMIT的事務)
- 等待所有正在進行的事務(T1~Tn)COMMIT
- 在日誌中記錄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 log與redo log原理分析
資料庫通常藉助日誌來實現事務,常見的有undo log、redo log,undo/redo log都能保證事務特性,這裡主要是原子性和永續性,即事務相關的操作,要麼全做,要麼不做,並且修改的資料能得到持久化。 假設資料庫在操作時,按如下約定記錄日誌: 1. 事務開始時
Mysql-事務與Redo Log、Undo Log
一 Undo Log Undo Log是為了實現事務的原子性,在MySQL資料庫InnoDB儲存引擎中,還用Undo Log來實現多版本併發控制(簡稱:MVCC)。 1 事務的原子性(Atomicity) 事務中的所有操作,要麼全部完成,要麼不做任何操作,不能只做部
Mysql裡的 undo log 和 redo log
轉載自:http://doc.okbase.net/xinysu/archive/259593.html 1 undo 1.1 undo是啥 undo日誌用於存放資料修改被修改前的值,假設修改 tba 表中 id=2的行資料,把Name='B' 修改為Name = 'B2' ,那麼u
bin log、redo log、undo 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 原始碼三:Ribbon與Eureka整合原理分析
前言 前情回顧 上一篇講了Ribbon的初始化過程,從LoadBalancerAutoConfiguration 到RibbonAutoConfiguration 再到RibbonClientConfiguration,我們找到了ILoadBalancer預設初始化的物件等。 本講目錄 這一講我們會進一步往下
詳細分析MySQL事務日誌(redo log和undo log)
innodb事務日誌包括redo log和undo log。redo log是重做日誌,提供前滾操作.undo log是回滾日誌,提供回滾操作。undo log和redo log都算是用來恢復的日誌:1.redo log通常是物理日誌,記錄的是資料頁的物理修改,而不是某一行或
MySQL的日誌(二):事務日誌(redo log和undo 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 log與binlog
日誌系統主要有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 log,undo 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:原子性。事務要麽不執行,要麽完全執行。如果執行到一半,宕