Oracle undo 管理

 

在開始之前,我們先來思考幾個問題?

 

1.  ora-01555錯誤的是怎麼產生的?有什麼辦法解決?

      該問題,參考我的Blog: Oracle ORA-01555快照過舊

  http://blog.csdn.net/tianlesoftware/archive/2009/10/31/4745898.aspx

2.  回滾段(回滾表空間)有什麼作用?

3.  數據庫啓動的時候,如何加載回滾段(回滾段表空間)。

4.  回滾段的數量由什麼公式來計算

5.  回滾表空間的大小如何確定?

 


一. 什麼是undo
Oracle數據庫在回退、撤銷或者改變數據所需要的維護數據庫信息的一種手段。這裏的數據庫信息是指在數據庫提交之前的記錄的改變等事務信息。


Undo 信息主要有以下用途:
當系統發出rollback信息
數據庫恢復
提供讀一致性


當系統發出rollback命令時,undo 信息通過記錄的信息將數據庫的改變恢復到commit之前的狀態。在數據庫恢復期間,undo信息被用來從redo log中撤銷任何未提交到數據文件的事務。當一個用戶在訪問數據時,Undo記錄通過維護訪問數據的前鏡像數據來保證當有其他用戶改變相同數據時數據庫的讀一致性。


以前數據庫使用回滾段來存儲undo信息,這種回滾段管理方式非常的複雜。現在數據庫採用undo的方式降低了管理的複雜性,同時減少了dba的工作負荷。但是在數據庫只能使用這兩種方式的一種。可以在數據庫裏定義兩種方式的文件,但是,同一時刻,必須指定數據使用哪一種方式。當你需要在兩種方式中切換時,必須將系統重新啓動。


Oracle數據庫一直使用系統回滾段來完成系統的事務。系統回滾段是在數據庫,創建的時候產生的,系統啓動後就一直在線。Dba不需要對它作任何的操作來優化。


二. 指定Undo的方式
oracle 9i以後有個初始化參數:undo_management。當將undo_management設置成AUTO時系統使用重做表空間來管理回滾段,當它被設置成MENUAL時系統使用回滾段。
oracle推薦使用重做表空間代替回滾段。


當系統使用auto方式管理undo信息時,系統必須指定一個undo表空間。這個表空間可以是在數據庫創建時產生,也可以數據庫創建後再創建。

 

當實例啓動的時候,系統自動選擇第一個有效的undo表空間或者是rollback segment,如果沒有有效的可用的undo表空間或者是回滾段,系統使用system rollback segment。這種情況是不被推薦的,當系統運行在沒有undo的情況下,系統會在alert.log中記錄一條警告信息。

 

 

2.1 自動管理模式(Automatic Undo Management)


如果系統使用要使用auto方式管理undo信息,那麼需要通過指定初始化參數undo_tablespace的值來指定系統使用哪一個undo表空間來存放undo信息。如果指定了undo_tablespace的值,但是系統中不存在這樣的表空間,那些系統啓動將會失敗。此時可以做的操作是,如果系統存在undo表空間,爲undo_tablespace指定正確的undo表空間名字,或者將undo_tablespace註釋。系統會採用存在的undo表空間。否則使用手動方式。


相關的初始化參數:
undo_tablespace     指名系統使用哪一個重做表空間。
undo_suppress_errors  被設置成true時表示系統創建和使用回滾段時忽略錯誤。
undo_retention  系統提交後,回滾段的數據保留多長時間,單位是秒。
當系統被設置成menual後,這幾個參數被忽略。

 

SQL> show parameter undo

NAME                        TYPE       VALUE

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

undo_management               string      AUTO

undo_retention                  integer     1000

undo_tablespace                 string      UNDOTBS1

 

補充:初始化參數UNDO_RETENTION

該參數用來指定undo 記錄保存的最長時間,以秒爲單位,是個動態參數,完全可以在實例運行時隨時修改通常默認是900 秒,也就是15 分鐘。

一定要注意,undo_retention 只是指定undo 數據的過期時間,並不是說,undo 中的數據一定會在undo表空間中保存15 分鐘,比如說剛一個新事務開始的時候,如果undo 表空間已經被寫滿,則新事務的數據會自動覆蓋已提交事務的數據,而不管這些數據是否已過期,因此呢,這就又關聯回了第一點,當你創建

一個自動管理的undo 表空間時,還要注意其空間大小,要儘可能保證undo 表空間有足夠的存儲空間。

同時還要注意,也並不是說,undo_retention 中指定的時間一過,已經提交事務中的數據就立刻無法訪問,它只是失效,只要不被別的事務覆蓋,它會仍然存在,並可隨時被flashback 特性引用。如果你的undo表空間足夠大,而數據庫又不是那麼繁忙,那麼其實undo_retention 參數的值並不會影響到你,哪怕你設置成1,只要沒有事務去覆蓋undo 數據,它就會持續有效。因此呢,這裏還是那句話,要注意undo 表空間的大小,保證其有足夠的存儲空間。

 

只有在一種情況下,undo 表空間能夠確保undo 中的數據在undo_retention 指定時間過期前一定有效,就是爲undo 表空間指定Retention Guarantee,指定之後,oracle 對於undo 表空間中未過期的undo 數據不會覆蓋,

例如:

SQL> Alter tablespace undotbs1 retention guarantee;

 

如果想禁止undo 表空間retention guarantee,

例如:

SQL> Alter tablespace undotbs1 retention noguarantee;


2.2 manual管理模式
當將系統中初始化參數undo_management設置成manual後,系統啓動後使用rollback segment方式存儲undo信息。如果系統沒有指定undo_management,那麼系統默認以manual方式啓動,即使設置了auto方式的參數,這些參數將被忽略。


當實例啓動時,系統根據如下幾個步驟確認online的rollback segment的數量:
初始化參數rollback_segments
初始化參數transactions、transactions_per_rollback_segment
與menual相關的初始化參數
rollback_segments 指定實例啓動時所需要的回滾段
transactions 指定系統中最大的併發事務數
transactions_per_rollback_segment 指定每一個回滾段支持的併發數
max_rollback_segments 指明系統支持的最大的online的回滾段數目


三 .  管理undo tablespace

創建undo talespace有兩種方式:
1. 數據庫創建時創建undo tablespace;
2. 在一個已經存在的數據庫創建。
在undo tablespace中不能創建數據庫對象,這是因爲這個表空間是爲數據庫recover而準備的。


3.1 創建數據庫時創建undo tablespace
在創建數據庫的時候可以通過指定undo子句來創建undo tablespace,但是這個子句不是必須的。

如果在創建數據庫時,系統指定是auto模式,但是沒有指明undo tablespace的名字,那麼系統會創建一個默認的回滾表空間,名稱叫sys_undotbs。這個表空間根據oracle定義的缺省值創建。初始化大小是10m,可以自動擴展。不過oracle推薦最好還是使用一個指定的大小。


CREATE DATABASE rbdb1
CONTROLFILE REUSE
...
UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';


注意:如果此時系統創建undo失敗,那麼整個創建數據庫的命令就失敗了。此時
Dba需要刪除已經創建的數據文件,糾正錯誤,重建創建數據庫。


使用create undo tablespace子句創建
CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE
AUTOEXTEND ON;



3.2  Undo 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. 使數據文件online或者offline
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表空間的時候可以使用including contents。


6. 切換undo tablespace
切換undo表空間有兩種方式:

1. 使用命令動態修改;

2. 修改初始化參數後重新啓動數據庫。

 

Alter system set undo_tablespace=undotbs1;

當切換命令完成後,所有的事務就會在新的回滾表空間內進行。

 

以下幾種情況會導致切換命令失敗:

1.  表空間不存在;
2.. 表空間不是一個回滾段表空間;
3.  表空間已經被另一個實例使用。


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

 

7. 設置undo_retention
dba可以設置undo_retention初始化參數指定undo回滾表空間保留undo信息的時間。在設置好這個參數時,系統會保留undo信息在指定的時間斷後才收回這個空間。
一般情況下,系統會保留undo信息到指定的時間後纔回收空間,但是,如果系統
存在大量的事務,也會將未到期的undo空間回收,以供使用。


8. Undo 表空間大小的設計規範的計算公式
Undospace = UR * UPS *db_block_size+ 冗餘量
UR: 表示在undo中保持的最長時間數(秒),由數據庫參數UNDO_RETENTION值決定。
UPS:表示在undo中,每秒產生的數據庫塊數量。


和undo有關的動態性能視圖v$undostat 包含undo的統計信息。使用這張視圖可以估計系統當前所需的undo大小。
v$rollstat 是undo模式的視圖。是undo表空間的undo segments的統計信息
v$transaction 包含undo segments的信息。
dba_undo_extents 包含undo表空間中每一個範圍的提交時間。


四. 管理回滾段

4.1 回滾段的使用方針

4.1.1 使用多個回滾段
使用多個回滾段來分擔回滾段的爭用,以提高系統性能。系統採用循環的方式來分配回滾段。當oracle創建數據庫時候,系統自動在system中分配一個system rollback segment,用來完成系統的事務,不爲大家共用。所以系統最後能有至少一個回滾段存放用戶回滾信息。


系統能夠加載的用戶回滾段數量和以下幾個初始化參數有關:
transactions_per_rollback_segment 指定每一個回滾段支持的併發數;
max_rollback_segments 指明系統支持的最大的online的回滾段數目;
rollback_segments 指定實例啓動時所需要的回滾段;


4.1.2 選擇好回滾段的類型
private 必須通過實例指定名稱後才能使用。
如:必須在初始化參數中rollback_segments指定後,實例啓動才能使用,或者在實例啓動後online才能使用。
Public 則是實例啓動時系統自動發現,系統根據初始化參數決定系統啓動時的回滾段。


4.1.3 爲事務指定回滾段
在系統啓動時指定所需要的回滾段,

 

4.1.4 估計回滾段的大小
回滾段大小應該基於系統最大的事務。如果回滾段過小,容易產生ora-01555錯誤。可以使用optimize選項來限制回滾段自動回收。回滾段的大小應該是最大表的大小的10%,這個可以指定maxextents的數量。


4.1.5 創建範圍大小和數量相等的回滾段組
一般來說一個回滾段應該包含10到20個範圍。
s=T/n
s是初始化時定義的範圍的大小,T是初始化的回滾段大小,n是範圍數。由此可以確定定義回滾段的子句的各個參數。


4.1.6 定義optimal的值
設置這個參數可以避免回滾段無限擴展以及系統自動回收空間。最小是兩個範圍的大小。

設置回滾段在不同的表空間
1:如果系統只有一個回滾表空間,那麼回滾段出現問題,影響系統不能運行。
2:包含回滾段的表空間經常分配和去配容易產生碎片。
3:當回滾表空間被離線時,系統將沒有回滾表空間可以用。


MINEXTENTS最小等於2
OPTIMAL最小應該設置成兩個extents大小
INITIAL和 NEXT最好一樣,除了應用使用指定的回滾段;

 

4.2  回滾段的相關操作

 

4.2.1 創建回滾段
當創建回滾段時,系統必須要有CREATE ROLLBACK SEGMENT系統權限。

 

創建的回滾段會online,並指定了存儲參數;

CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1STORAGE (

INITIAL integer K|M NEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );


 

4.2.2 修改回滾段

修改回滾段當修改回滾段時,系統必須要有ALTER ROLLBACK SEGMENT系統權限。

 

使回滾段online或者offline;
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 STAROGE(MAXEXTENTS 120);


4.2.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;


通過這個命令,可以:
根據事務量的大小,決定使用哪一個回滾段;
將大的查詢的事務放入單獨的回滾段;
當存在大的查詢使用事務時,可以將它放入大的回滾段。


4.3 和回滾段相關的性能視圖


DBA_ROLLBACK_GEGS 描述回滾段的信息,包含回滾段的名字和表空間;
DBA_SEGMENTS 描述回滾段的附加信息;
V$ROLLNAME 列出在線回滾段的名稱
V$ROLLSTAT 包含回滾段的統計信息
V$TRANSACTION 包含撤銷的統計信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章