oracle的redo和undo

来源:https://www.cnblogs.com/study9196/p/18286381
-Advertisement-
Play Games

redis筆記 1. Redis是什麼? Redis( Remote Dictionary Server )是一個使用 C 語言編寫的,高性能非關係型的鍵值對資料庫。 與傳統資料庫不同的是,Redis 的數據是存在記憶體中的,所以讀寫速度非常快,被廣泛應用於緩存方 向。Redis可以將數據寫入磁碟中, ...


1 redo

1.1 redo是什麼

oracle資料庫幾乎所有的操作都會產生redo日誌。redo日誌可以分為線上redo日誌和歸檔redo日誌。當資料庫實例失敗時,資料庫會使用redo日誌恢複數據。

1.2 線上重做日誌和歸檔重做日誌

1.2.1 線上重做日誌

資料庫的操作產生的redo日誌會先存放在線上重做日誌中。線上重做日誌在oracle中至少有兩組重做日誌,每組重做日誌包含一個或者多個線上重做日誌文件,同一組內的線上重做日誌內容完全一樣。日誌切換是指當一組線上重做日誌寫滿時,oracle清空下一組線上重做日誌併在下一組寫入重做日誌。所以,線上重做日誌是迴圈使用的。

1.2.2 歸檔重做日誌

如果資料庫開啟了日誌歸檔,當一組線上重做日誌填滿時,就會將這組線上重做日誌進行歸檔,這些歸檔的日誌就是歸檔重做日誌。

1.3 實例恢復和介質恢復

實例恢復一般是指資料庫實例發生故障,例如系統突然崩潰,使用shutdown abort關閉數據資料庫。資料庫重啟時就會自動進行實例恢復。實例恢復主要使用線上重做日誌進行恢復。
介質恢復是指運行資料庫的磁碟發生損壞,需要使用物理備份進行恢復。物理備份包括資料庫某個時間的快照以及歸檔重做日誌,線上重做日誌。

2 undo

2.1 undo是什麼

當我們對數據進行修改時,就會產生undo,undo存儲在undo段中。我們就是使用undo對修改但未提交的數據進行恢復的。

2.2 undo的作用

  1. 使用rollback時,利用undo將數據恢復到事務之前的樣子
  2. 為oracle的讀一致性提供數據保障
  3. flashback table使用undo將表數據恢復到之前某個時間點

3 提交(commit)和回滾(rollback)處理

3.1 提交(commit)

3.1.1 提交前的工作

通常commit是一個快速的操作,其處理時間和事務大小無關。因此,我們應該儘量避免將一個事務拆分進行多次提交。commit是一個快速的操作,這是因為大部分事務的工作在commit之前已經完成

  • 在SGA中生成已修改的數據塊
  • 在SGA中生成undo塊
  • 在SGA中生成前兩項的redo緩存
  • 如果前面執行的比較久,可能SGA中一些緩存數據已經寫入磁碟
  • 獲取所需要的鎖

3.1.2 當進行commit時,只需要完成剩下的工作

  • 為事務生成一個SCN。SCN是oracle的一個序列機制,用來保證事務的順序,並用來支持實例恢復。此外,它還用於oracle的讀一致性和檢查點。每commit一次,SCN就會增加
  • LWGR將還在redo緩存中的redo寫入線上重做日誌。並將SCN記錄在線上重做日誌中。這一步才是資料庫真正的commit。此時事務條目會從V$TRANSACTION中被“刪除”
  • 釋放V$lock中記錄該事務的會話中的鎖,從而讓等待鎖的其他事務繼續進行。
  • 如果被修改的塊還在資料庫高速緩存中,oracle會進行塊清除。塊清除是指清除資料庫塊首部的一些鎖信息。
    從以上可以看出,commit需要做的工作中,耗時最長的是將redo緩存中的redo寫入線上重做日誌。如果,commit進行多次,則需要進行多次等待。需要註意的是,PL/SQL對commit是特殊處理的。如果一個PL/SQL中有多個commit,資料庫不會在PL/SQL進行commit時等待redo緩存中的redo寫入線上重做日誌,而是立刻返回。但是,當PL/SQL執行完,將控制權返回客戶端前,會等待LGWR將對應的所有redo緩存寫入磁碟。雖然如此,也不建議在PL/SQL中使用多次commit。

3.2 回滾(rollback)

當我們進行rollback操作時,會做如下工作

  • 撤銷所有修改。oracle使用undo數據撤銷所做的修改。並將對應undo數據標記為已應用。例如之前插入了一條數據,ROLLBACK會將其刪除。

  • 釋放V$lock中記錄該事務的會話中的鎖,從而讓等待鎖的其他事務繼續進行。

    從以上工作可以看出,rollback的操作的工作量會比commit大很多。commit最大的工作量僅僅是將redo緩存寫入磁碟。

4 臨時表的redo和undo

臨時表(GLOBAL TEMPORARY TABLE)中的事務操作不會產生事務本身的redo,但是會產生undo。undo也會有對應redo,因此臨時表也會redo。但是可以通過設置參數TEMP_UNDO_ENABLED來將臨時表的undo放在臨時表空間中,由於臨時表空間的任何數據變更都不會產生redo,所以當這個參數設置為TRUE時,任何臨時表上的DML都會產生很少甚至不產生redo。
我們可以在會話和系統級別設置參數TEMP_UNDO_ENABLED,下麵我們將這個參數在會話級別設置為 TRUE。
alter session set temp_undo_enabled=true;

5 資料庫如何利用redo進行實例恢復

一個事務commit成功是指該事務對應的redo日誌已經從redo緩存中寫入線上重做日誌。資料庫進行實例恢復時,會讀取線上重做日誌的數據。
第一步是cache recovery,SMON根據最後一次檢查點後的線上重做日誌執行日誌內容,往前滾。這一步完成後,恢復所有commit的數據。線上重做日誌中可能有一些沒有commit的redo日誌,因此這一步完成後,資料庫高速緩存中也會有一些未提交的資料庫。
第二步是Transaction Recovery,根據線上重做日誌的undo回滾未提交的數據。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第八章 CanMV IDE初體驗 1)實驗平臺:正點原子DNK210開發板 2) 章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0 3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套實驗源碼+手冊+視頻下載 ...
  • 最近有個項目需要遠距離讀uart 串口列印出來的數據, 但是淘寶的調試助手太貴了, 開源平臺找了圈也許是因為功能太簡單, 好像沒怎麼找到或者說連接配置的方式很麻煩, 所以我花了半天時間寫了一個.如果有同樣需求的小白可以直接用這個程式跑 本方案主要是 把esp32配置成AP模式. 並且通過TCP/UD ...
  • vim的三種模式 一般模式 以vim打開一個文件就直接進入一般模式了。在這個模式中,你可以使用h,j,k,l按鍵移動游標,也可以使用刪除字元或刪除整行來處理文件內容,也可以使用複製粘貼處理文件內容。 編輯模式 在一般模式中按下A,a,I,i,O,o,R,r任何一個按鍵,就可以進入編輯模式,在界面左下 ...
  • 導航 0 前言 1 許可權匹配流程 2 五種身份變化 3 有效用戶/組 4 特權對 Shell 腳本無效 5 Sudo 與 SUID/SGID 的優先順序 6 SUID、SGID、Sticky 各自的功能 0、前言 Linux最優秀的地方之一,就在於他的多人多工環境。而為了讓各個使用者具有較保密的檔案資 ...
  • IP重組 ip重組這部分 4.19內核與3.10內核有些差別,4.9.134以後內核中不使用低水位和工作隊列了,同時使用了rhashtable 替代了 hash bucket的概念,在3.10內核中使用1024個hash bucket, 每個bucket中最多存放128個分片隊列,在4.19內核中所 ...
  • 本文介紹瞭如何使用GDB調試工具、如何將GDB移植到linu開發板上、如何在交叉編譯時使用GDB,,如何設置LVGL FreeType中文字型檔. ...
  • 今天發現/usr目錄空間不夠。需要擴展。之前沒有處理過。今天試了一下調整。並且記錄下來整個過程。 1 使用fdisk -l 查看磁碟信息 2、使用fdisk /dev/sda 對磁碟進行分區 操作完後,多了一個/dev/sda3 4 使用 pvcreate /dev/sda3創建物理捲 5、使用vg ...
  • 測試環境中,新搭建的Oracle 19c DG,在主備切換後,新的主庫的告警日誌中一直出現類似下麵這樣的錯誤: .........................................2024-07-08T13:40:55.384302+08:00 rfs (PID:146054): Da ...
一周排行
    -Advertisement-
    Play Games
  • 通過WPF的按鈕、文本輸入框實現了一個簡單的SpinBox數字輸入用戶組件並可以通過數據綁定數值和步長。本文中介紹了通過Xaml代碼實現自定義組件的佈局,依賴屬性的定義和使用等知識點。 ...
  • 以前,我看到一個朋友在對一個系統做初始化的時候,通過一組魔幻般的按鍵,調出來一個隱藏的系統設置界面,這個界面在常規的菜單或者工具欄是看不到的,因為它是一個後臺設置的關鍵界面,不公開,同時避免常規用戶的誤操作,它是作為一個超級管理員的入口功能,這個是很不錯的思路。其實Winform做這樣的處理也是很容... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他的程式每次關閉時就會自動崩潰,一直找不到原因讓我幫忙看一下怎麼回事,這位朋友應該是第二次找我了,分析了下 dump 還是挺經典的,拿出來給大家分享一下吧。 二:WinDbg 分析 1. 為什麼會崩潰 找崩潰原因比較簡單,用 !analyze -v 命 ...
  • 在一些報表模塊中,需要我們根據用戶操作的名稱,來動態根據人員姓名,更新報表的簽名圖片,也就是電子手寫簽名效果,本篇隨筆介紹一下使用FastReport報表動態更新人員簽名圖片。 ...
  • 最新內容優先發佈於個人博客:小虎技術分享站,隨後逐步搬運到博客園。 創作不易,如果覺得有用請在Github上為博主點亮一顆小星星吧! 博主開始學習編程於11年前,年少時還只會使用cin 和cout ,給單片機點點燈。那時候,類似async/await 和future/promise 模型的認知還不是 ...
  • 之前在阿裡雲ECS 99元/年的活動實例上搭建了一個測試用的MINIO服務,以前都是直接當基礎設施來使用的,這次準備自己學一下S3相容API相關的對象存儲開發,因此有了這個小工具。目前僅包含上傳功能,後續計劃開發一個類似圖床的對象存儲應用。 ...
  • 目錄簡介快速入門安裝 NuGet 包實體類User資料庫類DbFactory增刪改查InsertSelectUpdateDelete總結 簡介 NPoco 是 PetaPoco 的一個分支,具有一些額外的功能,截至現在 github 星數 839。NPoco 中文資料沒多少,我是被博客園群友推薦的, ...
  • 前言 前面使用 Admin.Core 的代碼生成器生成了通用代碼生成器的基礎模塊 分組,模板,項目,項目模型,項目欄位的基礎功能,本篇繼續完善,實現最核心的模板生成功能,並提供生成預覽及代碼文件壓縮下載 準備 首先清楚幾個模塊的關係,如何使用,簡單畫一個流程圖 前面完成了基礎的模板組,模板管理,項目 ...
  • 假設需要實現一個圖標和文本結合的按鈕 ,普通做法是 直接重寫該按鈕的模板; 如果想作為通用的呢? 兩種做法: 附加屬性 自定義控制項 推薦使用附加屬性的形式 第一種:附加屬性 創建Button的附加屬性 ButtonExtensions 1 public static class ButtonExte ...
  • 在C#中,委托是一種引用類型的數據類型,允許我們封裝方法的引用。通過使用委托,我們可以將方法作為參數傳遞給其他方法,或者將多個方法組合在一起,從而實現更靈活的編程模式。委托類似於函數指針,但提供了類型安全和垃圾回收等現代語言特性。 基本概念 定義委托 定義委托需要指定它所代表的方法的原型,包括返回類 ...