Oracle undo管理詳解

keeptrying發表於2013-11-07

 

一、What is undo

Every Oracle database must have a method of maintaining information that is used to roll back, or undo, changes to the database. Such information consists of records of the actions of transactions, primarily before they are committed. Oracle refers to these records collectively as undo.

Undo資訊主要用途:

l   Roll back transactions when a ROLLBACK statement is issued.

l   Recover the database.

l   Provide read consistency.

l   Analyze data as of an earlier point in time by using Oracle Flashback Query.

l   Recover from logical corruptions using Oracle Flashback features.

當發出ROLLBACK指令時,undo資訊被用來undo掉未提交的事務對資料庫造成的改變。

在資料庫恢復期間,undo資訊被用來undo掉所有未從redo log提交到資料檔案的事務。

當使用者訪問一些資料,而這些資料正被其他使用者修改時,undo通過維護資料的前映象(before image)來提供讀一致。

 

 

二、指定Undo的管理方式(undo space management)

Oracle提供兩種方式來儲存undo資訊:

l  Manual undo management mode:以前(9i以前),Oracle使用回滾段(rollback segments儲存undo資訊,這種回滾段管理方式非常複雜。

l  Automatic undo management mode Oracle9i以後使用另外一種方法來儲存undo資訊,即使用undo tablespace

在資料庫中,同一時刻只能使用一種方式。當需要在兩種方式中切換時,必須重啟系統。

注意Oracle始終使用一個SYSTEM回滾段來執行系統事務。只有一個SYSTEM回滾段,它在建立資料庫時自動被建立,而且總是在例項啟動時被online。不需要對SYSTEM回滾段進行任何操作。

 

Oracle使用初始化引數UNDO_MANAGEMENT來指定使用哪種方式管理Undo。當引數設定為MANUAL時,使用回滾段方式;當設定為AUTO時,使用undo表空間方式。Oracle推薦為AUTO

 

Oracle 9i:如果UNDO_MANAGEMENT初始化引數沒有指定值,則例項使用MANUAL模式。即使指定了UNDO_TABLESPACE初始化引數,也會忽略UNDO_MANAGEMENT引數。

Oracle 10g

UNDO_MANAGEMENTIf AUTO,use automatic undo management. The default is MANUAL.

Oracle 11g

UNDO_MANAGEMENTIf AUTO or null, enable automatic undo management. If MANAUAL,sets manual undo managemtne mode. The default is AUTO.

 

1AUTO管理模式

UNDO_MANAGEMENT=AUTO時,資料庫啟動時,例項將使用AUTO管理方式。

必須要有可用的undo tablespace來儲存undo資訊。這個表空間可以在資料庫建立時產生,也可以在資料庫建立後再建立。

例項啟動時,oracle自動選擇第一個可用的undo表空間,如果沒有可用的undo表空間,例項就會使用SYSTEM回滾段。這種情況是不被推薦的,系統會在alert.log檔案中記錄一條警告資訊。

 

使用初始化引數UNDO_TABLESPACE指定系統使用哪一個undo表空間來存放undo資訊。如果指定了undo_tablespace的值,但是系統中不存在這樣的表空間,那麼系統啟動將會失敗。此時,如果系統中存在undo表空間,為undo_tablespace指定正確的undo表空間名字,或者將undo_tablespace註釋,系統會採用存在的undo表空間。否則使用手動方式。

 

2MANUAL管理模式

UNDO_MANAGEMENT=MANUAL時,資料庫啟動時,例項將使用MANUAL管理方式。

如果UNDO_MANAGEMENT初始化引數沒有指定值,則例項使用MANUAL模式。即使指定了UNDO_TABLESPACE初始化引數,也會忽略UNDO_TABLESPACE引數。

 

當例項啟動時,系統根據以下幾個引數來確定online的回滾段的數量:

l   ROLLBACK_SEGMENTS:為例項指定一個或多個回滾段。

l   TRANSACTIONS:指定系統中最大的併發事務數。當UNDO_MANAGMENT=MANUAL時,指定系統中online回滾段的數量。系統最大併發事務數受限制於undo tablespace的大小(當UNDO_MANAGEMENT=AUTO時)和online rollback segments的數量(當UNDO_MANAGEMENT=MANUAL時)。

l   TRANSACTIONS_PER_ROLLBACK_SEGMENT:指定每一個回滾段支援的併發事務數。回滾段最小數量=TRANSACTIONS/ TRANSACTIONS_PER_ROLLBACK_SEGMENT:指明系統支援的最大的online回滾段的數目。

 

 

三、管理undo tablespace

1Undo Retention Period(undo保留期)Retention Guarantee

當事務提交後,undo資料就不再被rollbacktranaction recovery所需要。但是,出於讀一致的目的,長查詢可能會需要這些老的undo資訊。此外,oracle的幾種flashback也依賴於這些older undo information。因此就希望undo資訊保留時間儘可能長。

在自動undo管理方式下,有undo retention period(undo保留期),它指定old undo information在被覆蓋之前要保留的最小時間(Oracle attempts to do this)注意:只是指定undo 資料的過期時間Old(committed) undo information that is older than the current undo retention period is said to be expired. Old undo information with an age that is less than the current undo retention period is said to be unexpired.

Oracle資料庫根據undo表空間大小和系統的活動程度自動調整undo保留期。你可以指定一個最小的保留期(單位:秒),通過UNDO_RETENTION初始化引數(預設900秒,即15分鐘)注意,undo_retention只是指定undo資料的過期時間。並不是undo資料一定會在undo表空間中儲存該時間值。當新事務可用空間變少時,資料庫開始覆蓋expired undo。如果所有的expired undo都已經被覆蓋,而undo表空間依然沒有空間時,資料庫就開始覆蓋unexpired undo。如果被覆蓋的undo資訊被一個長查詢的讀一致請求,則該查詢會收到snapshot too old的錯誤資訊。

 

UNDO_RETENTION引數對undo保留期的具體影響如下:

l   undo表空間大小為固定值時,UNDO_RETENTION引數被忽略。

l   undo表空間為AUTOEXTEND時,如果undo表空間不夠用,oracle不覆蓋unexpired undo資訊,而是自動擴充套件undo表空間。如果自動擴充套件的undo表空間設定了MAXSIZE,這個最大值達到時,oracle就開始覆蓋unexpired undo資訊。

 

Retention Guarantee

為了確保長查詢或flashback操作的成功,可以指定retention guarantee,它可以確保指定的最小保留期。oracle將從不覆蓋unexpired undo資料,即使事務由於undo表空間不夠用而失敗。

CREATE DATABASECREATE UNDO TABLESPACE時,可以指定RETENTION GURANTEE子句,來啟用retention guarantee,也可以在ALTER TABLESPACE使用此子句。關閉語句為RETENTION NOGUARANTEE

可以通過DBA_TABLESPACES檢視檢視undo表空間是否啟用了retention guarantee

SQL> select tablespace_name,retention from dba_tablespaces;

 

TABLESPACE_NAME                RETENTION

------------------------------ -----------

SYSTEM                         NOT APPLY

UNDOTBS1                       NOGUARANTEE

SYSAUX                         NOT APPLY

TEMP                           NOT APPLY

USERS                          NOT APPLY

TS1                            NOT APPLY

已選擇6行。

 

2、建立undo tablespace

有兩種方式建立undo tablespace

l   建立資料庫時建立undo tablespace

l   在已存在的資料庫中建立。

 

建立資料庫時建立undo tablespace

使用DBCA建立資料庫時自動建立了undo tablespace。手動建立資料庫時,在CREATE DATABASE語句中指定undo tablespace子句來建立,但是這個子句不是必須的。如果在建立資料庫時,系統指定為auto模式,但是沒有指明undo tablespace的名字,那麼系統會建立一個預設的undo表空間,名稱叫sys_undotbs。這個表空間根據Oracle定義的預設值建立,初始大小為10M,可以自動擴充套件。不過Oracle推薦最好還是使用一個指定的大小。

CREATE DATABASE rdbd1

CONTROLFILE REUSE

...

UNDO TABLESPACE undotbs_01 DATAFILE ‘/u01/oracle/rdbd1/undo0101.dbf’;

注意:如果此時系統建立undo失敗,那麼整個建立資料庫的命令會失敗。需要刪除已經建立的資料檔案,糾正錯誤,重新建立資料庫。

 

使用create undo tablespace建立:

CREATE UNDO TABLESPACE undotbs_02

DATAFILE ‘/u01/oracle/rdbd1/undo0201.dbf’ SIZE 2M REUSE

AUTOEXTEND ON;

 

3Undo tablespace相關操作

1)、增加資料檔案

ALTER TABLESPACE undotbs_01

ADD DATAFILE ‘/u01/oracle/rbdb1/undo0102.dbf’ AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

 

2)、重新命名資料檔案

ALTER TABLESPACE undotbs_01

RENAME DATAFILE ‘/u01/oracle/rbdb1/undo0102.dbf’ TO ‘/u01/oracle/rbdb1/undo0101.dbf’;

 

3)、使資料檔案onlineoffline

ALTER TABLESPACE undotbs_01 online|offline;

 

4)、開始或結束一個聯機備份

ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;

 

5)、刪除undo tablespace

DROP TABLESPACE undotbs_01;

Drop undo表空間的時候必須是在未使用的情況下才能進行。如果undo表空間正在使用(例如事務失敗,但是還沒有恢復成功),那麼drop表空間命令將失敗。

DROP TABLESPACE for undo tablespaces behaves like DROP TABLESPACE...INCLUDING CONTENTS. All contents of the undo tablespace are removed.

 

6)、切換undo tablespace

ALTER SYSTEM SET UNDO_TABLESPACE=undotbs_02;

一下情況會導致表空間切換失敗:

l   表空間不存在;

l   表空間不是undo表空間;

l   表空間正在被其他例項使用(in an Oracle RAC environment only)

注意:切換操作不等待舊undo表空間的事務提交。如果舊undo表空間有事務未提交,那麼舊的undo表空間進入pending offline狀態,在這種模式下所有的事務能夠繼續進行,但是undo表空間不能被其他例項使用,也不能被刪除,直到所有的事務提交後,undo表空間才進入offline模式。

 

7)、設定undo_retention

ALTER SYSTEM SET UNDO_RETENTION=2400;

 

8)、undo表空間大小的設計計算公式

UndoSpace = UR*UPS*db_block_size + overhead

UR: is UNDO_RETENTION in seconds.

UPS: is undo blocks for each second.

overhead(冗餘量)is the small overhead for medata(transaction tables,bitmaps,and so forth).

相關統計資訊可以從下述動態效能檢視v$undostat中查詢。

 

9)、和undo相關的檢視

l   v$undostat:包含undo space的統計資訊。

l   v$rollstatundo表空間的undo segments的統計資訊。

l   v$transaction:包含undo segment資訊。

l   dba_undo_extentsundo表空間的每一個extent的大小、狀態資訊。

l   dba_hist_undostat:包含v$undostat的統計快照資訊。

v$undostat檢視對於監視當前例項事務在undo空間的狀況非常有用。檢視中的每一行代表例項每隔十分鐘的一個統計資訊。該檢視一共可包含576行,跨越4天一個週期。

 

 

四、管理Rollback Segments

1、回滾段相關操作

1)、建立回滾段

建立回滾段必須要有CREATE ROLLBACK SEGMENT系統許可權。

CREATE ROLLBACK SEGMENT rbs_01

TABLESPACE rbsspace

STORAGE(

 INITIAL 100K

NEXT 100K

OPTIMAL 4M

MINEXTENTS 20

MAXEXTENTS 100 );

 

2)、修改回滾段

修改回滾段必須要有ALTER ROLLBACK SEGMENT系統許可權。

使回滾段onlineoffline

ALTER ROLLBACK SEGMENT RB01 ONLINE;

 

修改儲存引數:

ALTER ROLLBACK SEGMENT RB01 STORAGE(MAXEXTENTS 200 OPTIMAL 2048K);

 

收縮回滾段:

ALTER ROLLBACK SEGMENT RB01 SHRINK;

注意:有OPTIMAL引數時,縮小到OPTIMAL值;沒有OPTIMAL引數時,縮小到MINEXTENTS所對應的值。

ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;

ALTER ROLLBACK SEGMENT RB01 STORAGE(MAXEXTENTS 120);

 

3)、刪除回滾段

刪除回滾段必須要有DROP ROLLBACK SEGMENT系統許可權。

原則上,INITIAL總應該等於NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由於INITIAL不能直接修改,只能先drop然後建立。

DROP ROLLBACK SEGMENT RB01;

CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1

STORAGE(INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);

 

在事務中使用特定的回滾段:

SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;

通過這個命令,可以:

更具事務量的大小,決定使用哪一個回滾段;

將大的查詢的事務放入單獨的回滾段;

當存在大的查詢使用事務時,可以將它放入大的回滾段。

 

2、和回滾段相關的檢視

DBA_ROLLBACK_SEGS:描述回滾段的資訊,包含回滾段的名字和表空間。

DBA_SEGMENTS:描述回滾段的附加資訊。

V$ROLLNAME:列出線上回滾段的名稱。

V$ROLLSTAT:包含回滾段的統計資訊。

V$TRANSACTION:包含撤銷的統計資訊。

 

 

 

 

 

 

 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25744374/viewspace-776025/,如需轉載,請註明出處,否則將追究法律責任。

相關文章