程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 10g中UNDO數據的作用及UNDO表空間的操作詳解

Oracle 10g中UNDO數據的作用及UNDO表空間的操作詳解

編輯:Oracle數據庫基礎

Oracle 10gUNDO數據的作用UNDO表空間的常用操作是本文我們主要要介紹的內容,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表空間

UNDO表空間專門用於存放UNDO數據,並且在UNDO表空間尚不能建立任何數據對象(表,索引,簇)

1.使用CREATE DATABASE命令建立UNDO表空間.

當使用CREATE DATABASE命令建立數據庫時,通過指定UNDO TABLESPACE選項,可以建立UNDO表空間.示例如下:

  1. CREATE DATABASE db01  
  2. …  
  3. UNDO TABLESPACE undotbs_01  
  4. DATAFILE '/opt/Oracle/oradata/ge01/UNDOTBS1.dbf' SIZE 30M; 

注意:UNDO TABLESPACE 子句不是必須的,如果使用自動UNDO管理模式,並且沒有指定該子句,那麼建立數據庫時會自動生成名為UNDOTBS1的UNDO表空間.

2.使用CREATE UNDO TABLESPACE命令建立UNDO表空間.

  1. create undo tablespace undotbs2 datafile '/opt/Oracle/oradata/ge01/UNDOTBS2.dbf' size 100m reuse autoextend on next 50m maxsize 5000m; 

修改UNDO表空間

使用ALTER TABLESPACE命令修改UNDO表空間.

當事務用盡了UNDO表空間後,使用ALTER TABLESPACE … ADD DATAFILE增加數據文件。

當UNDO表空間所在的磁盤填滿是,使用ALTER TABLESPACE … RENAME DATAFIEL 命令移動數據文件到其他磁盤上。

使用ALTER DATABASE … OFFLINE/ONLINE使表空間脫機/聯機。

當數據庫處於ARCHIVELOG模式時,使用ALTER TABLESPACE …BEGIN BACKUP/END BACKUP命令備份UNDO表空間.

切換UNDO表空間

啟動例程並打開數據庫後,同一時刻特定例程只能使用一個UNDO表空間,切換UNDO表空間是指停止例程當前使用的UNDO表空間,並啟動其他UNDO表空間,下面以啟用undotbs2表空間為例,說明切換UNDO表空間的方法.

ALTER SYSTEM SET undo_tablespace=undotbs02;

在RAC(Real Application Cluster)機構中,不同例程必須使用獨立的UNDO表空間,而不能共用同一個UNDO表空間.

刪除UNDO表空間

當前例程正在使用的UNDO表空間是不能被刪除的,如果確定要刪除當前例程正在使用的UNDO表空間,應首先切換UNDO表空間.然後刪除相應的UNDO表空間.

DROP TABLESPACE undotbs3;

1.確定當前例程正在使用的UNDO表空間:Show parameter undo_tablespace

2.顯示數據庫的所有UNDO表空間:SELECT tablespace_name FROM dba_tablespaces WHERE contents=’UNDO’;

3.顯示UNDO表空間統計信息

使用自動UNDO管理模式時,需要合理地設置UNDO表空間的尺寸,為例合理規劃UNDO表空間尺寸,應在數據庫運行的高峰階段搜集UNDO表空間的統計信息.最終根據該統計信息確定UNDO表空間的尺寸.通過查詢動態性能視圖V%UNDOSTAT,可以搜集UNDO統計信息.

  1. SELECT TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME,  
  2. TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME,UNDOBLKS FROM V$UNDOSTAT; 

BEGIN_TIME用於標識起始統計時間,END_TIME用於標識結束統計時間,UNDOBLKS用於標識UNDO數據所占用的數據塊個數.Oracle每隔10分鐘生成一行統計信息.

4.顯示UNDO段統計信息.

使用自動UNDO管理模式時,Oracle會在UNDO表空間上自動建立10個UNDO段,通過查詢動態信息視圖V$ROLLNAME,可以顯示所有聯機UNDO段的名稱,通過查詢動態性能視圖V$ROLLLISTAT,可以顯示UNDO段的統計信息.通過在V$ROLLNAME和V$ROLLLISTAT之間執行連接查詢,可以監視特定UNDO段的特定信息.

  1. SELECT a.name, b.xacts, b.writes, b.extents   
  2. FROM v$rollname a, v$rollstat b WHERE a.usn=b.usn; 

Name用於標識UNDO段的名稱,xacts用於標識UNDO段所包含的活動事務個數,Writes用於標識在undo段上所寫入的字節數,extents用於標識UNDO段的區個數。

5.顯示活動事務信息.

當執行DML操作時,Oracle會將這些操作的舊數據放到UNDO段中,動態性能視圖v$session用於顯示會話的詳細信息,動態性能視圖v$transaction用於顯示事務的詳細信息,動態性能視圖v$rollname用於顯示聯機UNDO段的名稱.通過在這3個動態性能視圖之間執行連接查詢,可以確定正在執行事務操作的會話,事務所使用的UNDO段,以及事務所占用的UNDO塊個數.

  1. Col username format a10  
  2. Col name format a10  
  3. SELECT a.username, b.name, c.used_ublk   
  4. FROM v$session a, v$rollname b, v$transaction c   
  5. WHERE a.saddr=c.ses_addr AND b.usn=c.xidusn AND a.username='gedb'

6.顯示UNDO區信息

數據字典視圖dba_undo_extents用於顯示UNDO表空間所有區的詳細信息.包括UNDO區尺寸和狀態等信息.

  1. SELECT extent_id, bytes, status   
  2. FROM dba_undo_extents WHERE segment_name’_SYSSMU5$’; 

其中,extent_id用於標識區編號,bytes用於標識區尺寸,status用於標識區狀態(ACTIVE:表示該區處於活動狀態,EXPIRED:標識該區未用).

V$ROLLSTAT中的常用列

USN:回滾段標識

RSSIZE:回滾段默認大小

XACTS:活動事務數

在一段時間內增量用到的列

WRITES:回滾段寫入數(單位:bytes)

SHRINKS:回滾段收縮次數

EXTENDS:回滾段擴展次數

WRAPS:回滾段翻轉(wrap)次數

GETS:獲取回滾段頭次數

WAITS:回滾段頭等待次數

關於Oracle 10g中UNDO數據的作用及UNDO表空間的操作的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved