了解ORACLE UNDO及其真實使用率


首先了解什么是UNDO,可以說UNDO是ORACLE中一個非常實用的功能

UNDO數據也稱為回滾(ROLLBACK)數據,它用於確保數據的一致性.當執行DML操作時,事務操作前的數據被稱為UNDO記錄.UNDO段用於保存事務所修改數據的舊值,其中存儲着被修改數據塊的位置以及修改前數據

 

UNDO數據的作用:

1.回退事務

當執行DML操作修改數據時,UNDO數據被存放到UNDO段,而新數據則被存放到數據段中,如果事務操作存在問題,舊需要回退事務,以取消事務變化.假定用戶A執行了語句UPDATE emp SET sal=1000 WHERE empno=7788后發現,應該修改雇員7963的工資,而不是雇員7788的工資,那么通過執行ROLLBACK語句可以取消事務變化.當執行ROLLBACK命令時,oracle會將UNDO段的UNDO數據800寫回的數據段中.

2.讀一致性

用戶檢索數據庫數據時,oracle總是使用用戶只能看到被提交過的數據(讀取提交)或特定時間點的數據(SELECT語句時間點).這樣可以確保數據的一致性.例如,當用戶A執行語句UPDATE emp SET sal=1000 WHERE empno=7788時,UNDO記錄會被存放到回滾段中,而新數據則會存放到EMP段中;假定此時該數據尚未提交,並且用戶B執行SELECT sal FROM emp WHERE empno=7788,此時用戶B將取得UNDO數據800,而該數據正是在UNDO記錄中取得的.

3.事務恢復

事務恢復是例程恢復的一部分,它是由oracle server自動完成的.如果在數據庫運行過程中出現例程失敗(如斷電,內存故障,后台進程故障等),那么當重啟oracle server時,后台進程SMON會自動執行例程恢復,執行例程恢復時,oracl會重新做所有未應用的記錄.回退未提交事務.

4.倒敘查詢(FlashBack Query)

倒敘查詢用於取得特定時間點的數據庫數據,它是9i新增加的特性,假定當前時間為上午11:00,某用戶在上午10:00執行UPDATE emp SET sal=3500 WHERE empno=7788語句,修改並提交了事務(雇員原工資為3000),為了取得10:00之前的雇員工資,用戶可以使用倒敘查詢特征.

使用UNDO參數

1.UNDO_MANAGEMENT

該初始化參數用於指定UNDO數據的管理方式.如果要使用自動管理模式,必須設置該參數為AUTO,如果使用手工管理模式,必須設置該參數為MANUAL,使用自動管理模式時,oracle會使用undo表空間管理undo管理,使用手工管理模式時,oracle會使用回滾段管理undo數據,需要注意,使用自動管理模式時,如果沒有配置初始化參數UNDO_TABLESPACE,oracle會自動選擇第一個可用的UNDO表空間存放UNDO數據,如果沒有可用的UNDO表空間,oracle會使用SYSTEM回滾段存放UNDO記錄,並在ALTER文件中記載警告.

2.UNDO_TABLESPACE

該初始化參數用於指定例程所要使用的UNDO表空間,使用自動UNDO管理模式時,通過配置該參數可以指定例程所要使用的UNDO表空間.

在RAC(Real Application Cluster)結構中,因為一個UNDO表空間不能由多個例程同時使用,所有必須為每個例程配置一個獨立的UNDO表空間.

3.UNDO_RETENTION

該初始化參數用於控制UNDO數據的最大保留時間,其默認值為900秒,從9i開始,通過配置該初始化參數,可以指定undo數據的保留時間,從而確定倒敘查詢特征(Flashback Query)可以查看到的最早時間點.

 

 

UNDO的真實使用

之前看有人說是用dba_free_space來看UNDO剩余空間,其實是有些出入的,真實的UNDO使用情況使用的是DBA_UNDO_EXTENTS視圖

那么分享一個查看表空間剩余空間的腳本

select tablespace_name, sum(free_mb) + sum(expired_mb) free_mb
from (select tablespace_name,
round(sum(nvl(bytes, 0)) / 1024 / 1024, 2) free_mb,
0 expired_mb
from dba_free_space
group by tablespace_name
union all
select tablespace_name,
0 free_mb,
round(sum(nvl(bytes, 0)) / 1024 / 1024, 2) expired_mb
from dba_undo_extents d
where tablespace_name =
(select value from v$parameter where name = 'undo_tablespace')
and status = 'EXPIRED'
group by tablespace_name)
group by tablespace_name;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM