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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...