65-Oracle Undo機制

前一期看了Oracle在redo上保持事務前滾的一致性,同樣Oracle在Undo的管理機制也是現代事務型數據庫的工程典范。核心在于通過多版本并發控制(MVCC)技術,在保障數據一致性與提升系統性能之間實現精妙平衡。Undo機制構建了原子事務的物理基礎,通過存儲數據前像實現秒級回滾。MVCC架構使讀寫操作完全解耦。Undo的智能空間管理(AUM)和保留期自動優化特性,精準控制RTO/RPO指標。通過UNDO_RETENTION GUARANTEE策略,可以為業務側帶來數據保險的時間窗口。引出另外另外一個話題:Flashback的實現對Undo有要求,然而兩者處理的事務又大大不同(單開一期),這次重點是Oracle的Undo機制。

一、Undo機制核心功能與技術原理

1. 核心功能矩陣

?功能類別?

?具體實現

?技術原理?

?事務回滾?

回滾單條SQL或整個事務

存儲數據前鏡像鏈表,通過回滾指針(ROLL_PTR)構建版本鏈

?讀一致性?

MVCC多版本控制

基于SCN(System Change Number)構建一致性快照視圖

?實例恢復?

崩潰后回滾未提交事務

SMON進程應用Undo日志回滾未提交事務

?閃回技術?

Flashback Query/Table

時間戳與SCN映射,訪問歷史Undo數據

?臨時表優化

12c+臨時Undo

隔離存儲臨時表變更,減少Redo生成

2. 技術演進歷程

Oracle 7-8i:手動回滾段?
  • 需要DBA手動創建和管理回滾段
  • 易出現空間爭用錯誤(ORA-01555)
  • 事務回滾需掃描整個段,效率低
Oracle 9i:自動Undo管理(AUM)??
  • 引入UNDO_TABLESPACE參數
  • 自動分配和管理Undo段
  • UNDO_RETENTION參數控制保留時間
Oracle 10g:IMU內存優化?
  • In-Memory Undo(IMU)技術
  • 共享池中分配私有Undo緩沖區
  • 減少60%磁盤I/O和Redo生成
Oracle 11g:自動保留期調整?
  • 動態計算TUNED_UNDORETENTION
  • 自動避免ORA-30036(空間不足)和ORA-01555(快照過舊)
Oracle 12c:臨時Undo?
  • 全局臨時表(GTT)的Undo存入臨時表空間
  • 減少75% Redo日志量
  • 物理備庫支持臨時表DML操作
Oracle 19c~23ai:混合列壓縮?
  • Undo數據列式存儲壓縮
  • 減少40%空間占用
  • 優化數據倉庫場景

二、Undo日志技術原理深度解析

Undo日志是內容,Undo表空間是容器。
所有事務生成的Undo日志最終持久化到Undo表空間文件中。

1. 數據結構

? Undo記錄頭結構:??
  • XID:事務ID(16字節,包含回滾段號+槽號+序列號)
  • UBA:前序Undo記錄地址(文件號+塊號+記錄偏移)
  • Opcode:操作類型標識(0x02=INSERT, 0x04=UPDATE, 0x10=DELETE)
  • Flags:狀態標志位(活動/過期等)
  • Data Length:數據長度
? 數據區結構:??
  • RowID:修改行的物理地址
  • ColID:修改列標識符
  • OldVal:修改前的列值

2. 存儲架構

? 層級結構:??
  1. Undo表空間:專用存儲容器
  2. 數據文件:物理存儲文件(如undotbs01.dbf)
  3. 回滾段:每個事務綁定獨立段
  4. 區(Extents):8個連續塊組成的分配單元
  5. 塊(Blocks):標準8KB Oracle塊
  6. Undo記錄:實際存儲單元
? 空間狀態管理:??
  • ?活動區(Active)??:事務進行中,強制保留
  • ?未過期區(Unexpired)??:已提交+保留期內,優先保留
  • ?過期區(Expired)??:超保留期,可覆蓋使用

3. 寫入流程

  1. DML操作觸發Undo記錄生成
  2. Undo記錄寫入Buffer Cache
  3. 同步生成Redo日志(Write-Ahead Logging)
  4. LGWR進程將Redo寫入日志文件
  5. DBWn進程異步將Undo數據寫入磁盤
  6. 事務提交時更新狀態

三、關鍵配置與管理策略

1. 核心參數配置

-- 基礎配置 --
ALTER SYSTEM SET undo_management = AUTO;          -- 啟用自動管理
ALTER SYSTEM SET undo_tablespace = undotbs2;      -- 指定表空間
ALTER SYSTEM SET undo_retention = 1800 SCOPE=BOTH;-- 保留30分鐘
--
show parameter undo;
NAME              TYPE    VALUE
----------------- ------- --------
temp_undo_enabled boolean FALSE
undo_management   string  AUTO
undo_retention    integer 900
undo_tablespace   string  UNDOTBS1
-- 高級優化 --
ALTER SYSTEM SET "_in_memory_undo" = TRUE;  -- 啟用IMU(10g+)
ALTER SYSTEM SET temp_undo_enabled = TRUE;  -- 啟用臨時Undo(12c+)
--System altered.

2. 表空間管理

?創建表空間:?

CREATE UNDO TABLESPACE undotbs2DATAFILE '/opt/oracle/oradata/FREE/FREEPDB1/undotbs2_01.dbf' SIZE 20GAUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITEDRETENTION GUARANTEE;  -- 關鍵系統啟用保證模式

?空間維護操作:??

-- 空間回收
ALTER TABLESPACE undotbs1 SHRINK SPACE KEEP 15G;
-- 表空間切換
ALTER SYSTEM SET UNDO_TABLESPACE = undotbs2;
-- 刪除舊表空間
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;

3. 監測體系

?空間壓力監控:?

SELECT TO_CHAR(begin_time, 'YYYY-MM-DD HH24:MI') AS snapshot_time,undoblks AS undo_blocks_generated,maxquerylen AS longest_query_sec,ssolderrcnt AS ora_01555_count,tuned_undoretention AS actual_retention_sec
FROM v$undostat
ORDER BY begin_time DESC;

?事務級監控:??

SELECT s.sid,s.username,t.start_time,t.used_ublk AS undo_blocks_used,t.used_urec AS undo_records_used
FROM v$transaction t
JOIN v$session s ON t.ses_addr = s.saddr;
--11g 生產庫SID USERNAME       START_TIME           UNDO_BLOCKS_USED UNDO_RECORDS_USED
-- -------------------- -------------------- ---------------- ------------
3401 HIS50         01/15/24 21:20:00                   1                 1

?文件級監控:??

SELECT file_name,bytes/1024/1024 AS size_mb,maxbytes/1024/1024 AS max_size_mb,autoextensible,increment_by * 8192/1024/1024 AS increment_mb
FROM dba_data_files
WHERE tablespace_name = 'UNDOTBS1';
---
FILE_NAME                                             SIZE_MB         MAX_SIZE_MB AUTOEXTENSIBLE       INCREMENT_MB
__________________________________________________ __________ ___________________ _________________ _______________
/opt/oracle/oradata/FREE/FREEPDB1/undotbs01.dbf           345    33554431.9765625 YES                             5

四、驗證腳本集

1. 讀一致性驗證

--會話1
UPDATE HR.employees SET salary = 15000 WHERE employee_id = 100;
-- 不提交事務--會話2
SELECT salary FROM HR.employees e WHERE e.employee_id = 100; 
-- 應返回修改前的值(比如6000)
2. 保留期保證驗證?
-- 設置保留保證
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;-- 生成測試數據并等待超保留期
BEGINUPDATE HR.employees SET salary = salary * 1.1;COMMIT;DBMS_LOCK.SLEEP(2000);  -- 等待超過undo_retention
END;
/-- 嘗試歷史查詢
SELECT salary FROM HR.employees AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '30' MINUTE
WHERE employee_id = 100;
-- 應成功返回歷史數據
3. 臨時Undo性能驗證?
-- 啟用臨時Undo
ALTER SESSION SET temp_undo_enabled = TRUE;-- 創建臨時表
CREATE GLOBAL TEMPORARY TABLE temp_emp AS SELECT * FROM HR.employees;-- 測試I/O對比
SET AUTOTRACE STATISTICS;-- 臨時表操作
INSERT INTO temp_emp SELECT * FROM HR.employees;
COMMIT;
-- 記錄統計信息中的redo size-- 常規表操作
INSERT INTO HR.employees SELECT * FROM employees WHERE 1=0;
ROLLBACK;
-- 比較redo size差異(臨時表應顯著減少)
?4. IMU效果驗證
-- 檢查IMU狀態
SELECT name, value 
FROM v$sysstat 
WHERE name LIKE '%IMU%flush%';
--
NAME                                               VALUE
--------------------------------------------- ----------
IMU recursive-transaction flush                     3401
IMU undo retention flush                            0
IMU ktichg flush                                    2
IMU bind flushes                                    0
IMU mbu flush                                       0
-- 生成負載測試
DECLARECURSOR c_emp IS SELECT * FROM HR.employees FOR UPDATE;
BEGINFOR r IN c_emp LOOPUPDATE HR.employees SET salary = salary * 1.01 WHERE CURRENT OF c_emp;END LOOP;COMMIT;
END;
/
-- 再次檢查IMU統計

五、最佳實踐指南

1. 容量規劃公式

所需空間(GB) = (DPM × ARS × UR) / (10243) × 1.5
  • DPM?:每分鐘DML操作數
  • ?ARS?:平均行大小(字節)
  • ?UR?:保留期(分鐘)
  • ?1.5?:安全系數(含元數據開銷)

2. 高可用架構設計

多表空間輪換策略?
  • 創建至少兩個Undo表空間
  • 定期切換:ALTER SYSTEM SET UNDO_TABLESPACE=undotbs2;
  • 保留舊表空間24小時后刪除
空間保障策略
-- 關鍵系統啟用保留保證
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
3. 參數優化對比?

?場景類型?

?undo_retention

?IMU?

?臨時Undo?

?壓縮?

?OLTP系統?

2小時

啟用

啟用

禁用

?數據倉庫?

6小時

按需

按需

啟用

?金融系統?

12小時+保證

啟用

啟用

禁用

?開發環境?

24小時

可選

可選

可選

4. 故障處理一覽?

?故障現象?

可能原因?

?解決方案?

ORA-01555

Undo保留不足

增加UNDO_RETENTION或表空間

ORA-30036

空間不足

擴展表空間或啟用AUTOEXTEND

閃回失敗

歷史數據不可用

啟用RETENTION GUARANTEE

性能下降

IMU未啟用

檢查"_in_memory_undo"參數

六、演進趨勢與未來方向

多租戶、云原生優化?
  • CDB/PDB多租戶Undo隔離
  • 基于負載的自動伸縮策略
  • 跨區域Undo復制
  • AI的到來自動預測和優化
持久內存應用?
  • 利用PMEM存儲Undo日志
  • 持久內存直接訪問加速
  • 崩潰恢復時間縮短90%
? 性能數據 ?:
Oracle 19c在混合負載下,IMU+臨時Undo組合可降低整體I/O 45%,提升事務吞吐量30%(from:Oracle官方實驗室基準測試)。

七、使用體驗

Oracle Undo機制通過多階段技術演進,已從基礎的事務回滾工具發展為支持多版本控制、閃回操作和多租戶、云原生優化的綜合數據管理平臺。關鍵最佳實踐包括:
  1. 根據業務負載科學規劃空間容量
  2. OLTP系統啟用IMU和臨時Undo
  3. 關鍵業務啟用RETENTION GUARANTEE
  4. 建立多層次監控預警體系
  5. 定期進行健康檢查和性能優化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85793.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ESP32攝像頭開發實例】-實現遙控視頻小車

ESP32-CAM實現遙控視頻小車 文章目錄 ESP32-CAM實現遙控視頻小車1、硬件準備2、代碼實現3、代碼解析4、程序下載到開發板在本文中,將詳細介紹如何使用ESP32-CAM制作一輛Wi-Fi遠程控制的小車。 1、硬件準備 在開始這個項目之前,我們將強調用于構建機器人的最重要的特性和組件…

圖片加載優化(縮略圖)

縮略圖 系統目前的問題:首頁直接加載原圖,原圖文件通常比縮略圖大數倍甚至數十倍,不僅導致加載時間長,還會造成大量流量浪費。 解決方案:上傳圖片時,同時生成一份較小尺寸的縮略圖。用戶瀏覽圖片列表時加…

GO語言---數組

文章目錄 數組的基本特性數組的聲明和初始化數組元素的訪問和操作數組遍歷多維數組數組的長度和容量數組作為函數參數數組與切片的區別注意 數組是Go語言中最基本的數據結構之一,它是一組相同類型元素的固定長度序列。 數組的基本特性 1、固定長度:數組…

7.5.3_1處理沖突的方法-拉鏈法

知識總覽: 拉鏈法: 開始散列表中沒有存儲任何數據元素即散列地址上的元素是空的,散列地址可以視為鏈表的頭指針,即沒有插入任何元素前鏈表的頭指針是空的。一個散列地址對應一個鏈表,散列地址上實際沒有存數據元素&am…

鴻蒙運動項目開發:項目運行環境切換器

##鴻蒙核心技術##運動開發# 在開發鴻蒙運動項目時,管理不同運行環境(如開發環境、測試環境、生產環境)是一個常見的需求。通過合理地切換運行環境,開發者可以方便地進行調試、測試和部署。本文將介紹如何實現一個項目運行環境切換…

Linux內核中安全創建套接字:為何inet_create未導出及正確替代方案

引言 在Linux內核開發中,當驅動程序需要創建網絡套接字時,開發者常會遇到一個關鍵問題:核心函數inet_create(負責初始化IPv4套接字)并未導出到內核符號表。本文深入剖析這一設計決策背后的邏輯,并提供驅動程序安全創建套接字的實踐方案。 一、inet_create未導出的深層原…

63、不同路徑II

題目 解答: 初始化和特殊情況比較麻煩的dp obstacleGrid(0,0)1的,直接return 0即可。入口都被堵住了還怎么走。 mn1情況,直接判斷 第一行初始化:dp[1][0]->dp[i][0] 碰到有障礙物的,從當前格子開始到末尾全部置…

wx小程序登錄設置角色

背景。pc端登錄后在訪問業務鏈接時可以根據固定獲取用戶的方法LoginUser user LoginHelper.getLoginUser(); 獲取到用戶信息。但wx端登錄后無法獲取。原因處在登陸時對用戶信息的設置方面pc端和小程序端登錄沒有使用相同的登錄方法。排除得知wx端小程序登錄時沒有設置角色。所…

MySQL5.7 慢查詢SQL語句集合

文章目錄 1. 按平均執行時間排序的慢查詢2. 按總執行時長排序的慢查詢3. MySQL 5.7 慢查詢配置檢查4. 掃描行數分析(找出全表掃描)5. 高頻執行的慢查詢6. 當前正在執行的查詢7. 慢查詢統計匯總8. 表結構和索引分析8.1 表索引詳情查詢8.2 表大小統計 1. 按…

MySQL學習(1)——基礎庫操作

歡迎來到博主的專欄:MySQL學習 博主ID:代碼小豪 文章目錄 數據庫原理基礎庫操作增刪數據庫數據庫編碼與校驗規則驗證不同的校驗規則對于庫中數據的影響 備份與恢復數據庫 數據庫原理 mysql版本:mysql8.0 操作系統:ubuntu22.4 為了減少由于環境配置以及權限限制帶來的使用問題&…

C++法則12:右值引用的核心目的:支持移動語義(Move Semantics)

C法則12:右值引用的核心目的:支持移動語義(Move Semantics) 右值引用(Rvalue Reference)是C11引入的最重要特性之一,其主要設計目的就是支持移動語義(Move Semantics)。 …

【LLM學習筆記4】使用LangChain開發應用程序(上)

目錄 前言一、模型、提示和解析器(model、prompt、parsers)二、儲存三、模型鏈四、基于文檔的問答1.使用向量存儲查詢2. 結合表征模型和向量存儲使用檢索問答鏈回答問題 前言 在前面兩部分,我們分別學習了大語言模型的基礎使用準則&#xff…

Negative Contrastive Estimation Negative Sampling

1. 基本概念與問題背景 1.1 大規模分類問題 在自然語言處理中,給定上下文 c c c預測單詞 w w w的條件概率為: P ( w ∣ c ) exp ? ( s θ ( w , c ) ) ∑ w ′ ∈ V exp ? ( s θ ( w ′ , c ) ) P(w|c) \frac{\exp(s_\theta(w,c))}{\sum_{w\in V…

Flink SQL Connector Kafka 核心參數全解析與實戰指南

Flink SQL Connector Kafka 是連接Flink SQL與Kafka的核心組件,通過將Kafka主題抽象為表結構,允許用戶使用標準SQL語句完成數據讀寫操作。本文基于Apache Flink官方文檔(2.0版本),系統梳理從表定義、參數配置到實戰調優…

vscode內嵌瀏覽器實時預覽vue項目

安裝插件 web Preview 啟動vue項目 打開預覽 ctrl shift p 之后輸入并選擇 Open Web Preview 即可看到預覽窗口,但此時明明我的頁面是有內容的,但是窗口卻空白的。 因為默認訪問端口是3000,我們將其修改為vue項目默認的5173端口即可。 點…

計算機網絡:(四)物理層的基本概念,數據通信的基礎知識,物理層下面的傳輸媒體

計算機網絡:(四)物理層的基本概念,數據通信的基礎知識,物理層下面的傳輸媒體 前言一、物理層的基本概念1. 什么是物理層2. 物理層的核心使命3. 物理層的四大特性 二、數據通信的基礎知識1. 數據通信系統的基本模型1.1 …

Linux系統性能優化

目錄 Linux系統性能優化 一、性能優化概述 二、性能監控工具 1. 基礎工具 2. 高級工具 三、子系統優化策略 1. CPU優化 2. 內存優化 3. 磁盤I/O優化 4. 網絡優化 四、資源限制優化 1. ulimit 2. cgroups(控制組) 五、安全與注意事項 六、…

【streamlit streamlit中 顯示 mermaid 流程圖有兩種方式】

streamlit中顯示mermaid 流程圖有兩種方式 mermaind示例 code """ flowchart LRmarkdown["This **is** _Markdown_"]newLines["Line1Line 2Line 3"]markdown --> newLinesmarkdown["This **is** _Markdown_"]newLines[&quo…

Rust調用 DeepSeek API

Rust 實現類似 DeepSeek 的搜索工具 使用 Rust 構建一個高效、高性能的搜索工具需要結合異步 I/O、索引結構和查詢優化。以下是一個簡化實現的框架: 核心組件設計 索引結構 use std::collections::{HashMap, HashSet}; use tantivy::schema::{Schema, TEXT, STORED}; use …

Unity3D仿星露谷物語開發69之動作聲音

1、目標 Player動作時產生的聲音,比如砍倒樹木、砸石頭。 2、修復NPC快速行進的bug(與本節無關) 修改NPCMovement.cs腳本的MoveToGridPositionRoutine方法。 確保npcCalculatedSpeed的速度不少于最慢速度。 原代碼: 修改后的…