1. 程式人生 > >oracle撤銷表空間和回滾段

oracle撤銷表空間和回滾段

/* 撤銷表空間 */

通過使用撤銷技術,能夠為Oracle資料庫提供以下功能:
* 使用ROLLBACK語句撤銷事務
* 進行資料庫恢復
* 提供資料的讀一致性

Oracle強烈建議DBA在Oracle 9I資料庫中應用自動撤銷管理方式,任何資料庫使用者都不能在撤銷表空間中建立物件,在撤銷表空間中只能儲存撤銷記錄.

SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_suppress_errors                 boolean     FALSE
undo_tablespace                      string      UNDOTBS1

undo_management--auto 自動撤銷管理方式(撤銷表空間方式)
               --manual 手工撤銷管理方式(回退段方式)
undo_retention -- 撤銷記錄儲存的最長時間

建立和管理撤銷表空間
1.在建立資料庫時建立撤銷表空間
create database db01
......
undo tablespace undotbs01
 datafile 'i:/oracle/oradata/undotbs0101.dbf'
....;

2.在資料庫建立之後建立撤銷表空間
create undo tablespace undotbs02
 datafile 'i:/oracle/oradata/undotbs0201.dbf'
 autoextend on;
(建議將撤銷表空間的資料檔案增長方式設定為自動增長方式)

修改撤銷表空間
使用者只能對撤銷表空間進行如下操作
* 新增新的資料檔案
* 重新命名資料檔案
* 更改資料檔案大小
* 將資料檔案切換為聯機或離線狀態

alter tablespace undotbs01
  add datafile 'i:/oracle/oradata/undotbs0102.dbf'
  autoextend on
  next 1M
  MAXSIZE UNLIMITED;

alter database
  datafile 'i:/oracle/oradata/undotbs0101.dbf'
  resize 500M;

刪除撤銷表空間
(只有在撤銷表空間沒有被資料庫使用時才能刪除,如果撤銷表空間中包含有未決事務的撤銷記錄,也不能刪除表空間)
drop tablespace untotbs01;
drop tablespace untotbs01 include contents and datafiles;

切換撤銷表空間(undo_tablespace是一個動態初始化引數)
alter system set undo_tablespace = undotbs02;

如果存在下列情況,上面的切換操作將產生錯誤:
* 指定的撤銷表空間不存在
* 指定的表空間不是一個撤銷表空間
* 指定的表空間正在被其它例項使用

在成功的切換撤銷表空間後,任何新開始的事務都將在新的撤銷表空間中儲存撤銷記錄,但是在舊的撤銷表空間中可能還保留
有當前未提交的撤銷記錄

undo_retention引數:指定撤銷記錄的保留時間,以秒為單位,是一個動態引數
如:將保留時間設定為30分鐘 undo_retention = 1800 
alter system set undo_retention = 600;

注意:撤銷記錄在撤銷表空間中保留的時間並不一定大於UNDO_RETENTION引數說指定的時間,如果在新事務開始時,撤銷表
空間已經被寫滿,新事務將覆蓋已提交事務的撤銷記錄,即使這些撤銷記錄還未過期.因此,如果為UNDO_RETENTION引數設定了較大的值,那麼必須保證撤銷表空間具有足夠的儲存空間.

當oracle無法利用撤銷(回退)記錄來保證資料的讀一致性時,將產生“快照太舊”錯誤.
這個錯誤通常發生在執行一個執行時間很長的查詢時,由於與查詢所需相關的撤銷記錄已經被覆蓋,因此Oracle無法為查詢提供正確的讀一致性檢視.

假設有這樣的情況:
使用者SCOTT對EMP表進行了更新,但是他還沒提交更新事務,EMP表中更新前的資料被儲存在SCOTT事務的撤銷記錄中.
這時,如果有另外一個使用者JAKE也開始訪問EMP表,Oracle將利用這些撤銷記錄來提供EMP表中資料的讀一致性檢視.假設JAKE的查詢會持續很長一段時間,Oracle將持續用到這些撤銷記錄。在這個過程中,SCOTT使用者可以提交他的事務,事務提交後,儲存在撤銷表空間(或回退段)中的SCOTT事務的撤銷記錄被標記為失效,它可能會被其它事務的撤銷記錄所覆蓋,或者在Oracle縮減回退段時被釋放,這時JAKE使用者的查詢如果還沒有結束,可能會產生“快照太舊”錯誤.

解決辦法:
* 在手工撤銷管理方式下,DBA必須為執行時間較長的查詢指定一個較大的回退段(具有較大的MINEXTENTS和OPTIMAL引數值的回退段).
* 在自動撤銷管理方式下,DBA只需要指定一個較大的UNDO_RETENTION引數值,並且保證撤銷表空間具有足夠的儲存空間.

撤銷表空間資料字典
v$undostat 包含所有撤銷表空間的統計資訊,用於對撤銷表空間進行監視和調整,DBA可以利用這個檢視
  來估算撤銷表空間的大小
v$rollstat 在自動撤銷管理方式下,可以利用該檢視來查詢關於撤銷表空間的各個撤銷段的資訊
v$transaction 關於各個事務所使用的撤銷段的資訊

/* 管理回退段 */
如果為資料庫建立多個回退段,Oracle會將事務平均分配給各個回退段,這樣能夠顯著地提高系統地回退處理效能.

建立回退段
create rollback segment rbs_02 tablespace rbstbs
storage(initial 100K
 next 100k
 optimal 5M
 pctincrease 0
 minextents 20
 maxextents 100);
(pctincrease儲存引數要為0,將initial和next引數設定為相同的值,這樣回退段中所有的區都應當具有相同的大小,optimal引數的值不能小於initial+next*(minextents-1),如果不設定的話,ORACLE將使用NULL做為預設值,為MINEXTENTS引數設定一個較大的值,不要將MAXEXTENTS引數設定為UNLIMITED,可以避免由於出現一個異常事務而導致為回退段分配過多的儲存空間)

新建的回退段如果要做為私有回退段使用,可以將它的名稱新增到初始化引數ROLLBACK_SEGMENTS中
ROLLBACK_SEGMENTS = (rbs_01,rbs_02)

更改回退段的儲存引數
alter rollback segment rbs_02
storage (maxextents 120);

alter rollback segment rbs_02
storage(optimal 8M);

縮減回退段
如果在建立回退段時通過設定OPTIMAL儲存引數指定了最優大小,ORACLE會在回退段超過最優大小時自動縮減回退段,DBA也可以手工縮減回退段,回退段
的縮減操作只有在沒有活動事務使用該回退段時進行
假設回退段RBS_02的最優大小為5M
alter rollback segment rbs_02 shrink to 5M

顯示分配回退段
set transaction use rollback segment large_bs01
(set transaction語句必須是事務的第一條執行語句)

刪除回退段(必須先讓它離線,如果回退段處於任何非OFFLINE狀態,都不能對它執行刪除操作,之後必須在rollback_segment引數中也刪除)
drop rollback segment rbs_02

回退段資料字典:
dba_rollback_segs 所有回退段的資訊
v$rollname  所有聯機回退段的名稱

管理回退段的重要工作之一就是設定一個合理的OPTIMAL引數值,DBA可以首先通過查詢V$ROLLSTAT檢視以獲得該回退段的AVEACTIVE欄位值,然後將
OPTIMAL的值設定為稍稍高於AVEACTIVE值.