Oracle undo 管理

不一樣的天空w發表於2018-01-30

http://blog.csdn.net/xujinyang/article/details/6822971

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

 

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

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

   http://blog.csdn.net/xujinyang/article/details/6832722


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方式的引數,這些引數將被忽略。


當例項啟動時,系統根據如下幾個步驟確認onlinerollback segment的數量
初始化引數rollback_segments
初始化引數transactionstransactions_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 建立範圍大小和數量相等的回滾段組
一般來說一個回滾段應該包含1020個範圍。
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 包含撤銷的統計資訊

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

相關文章