溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle undo 管理

發(fā)布時間:2020-08-10 16:56:03 來源:ITPUB博客 閱讀:108 作者:不一樣的天空w 欄目:關(guān)系型數(shù)據(jù)庫

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

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

 

1.  ora-01555錯誤的是怎么產(chǎn)生的?有什么辦法解決?

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

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


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

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

4.  回滾段的數(shù)量由什么公式來計算

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

 


什么是undo
Oracle數(shù)據(jù)庫在回退、撤銷或者改變數(shù)據(jù)所需要的維護(hù)數(shù)據(jù)庫信息的一種手段。這里的數(shù)據(jù)庫信息是指在數(shù)據(jù)庫提交之前的記錄的改變等事務(wù)信息。


Undo 信息主要有以下用途:
當(dāng)系統(tǒng)發(fā)出rollback信息
數(shù)據(jù)庫恢復(fù)
提供讀一致性


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


以前數(shù)據(jù)庫使用回滾段來存儲undo信息,這種回滾段管理方式非常的復(fù)雜。現(xiàn)在數(shù)據(jù)庫采用undo的方式降低了管理的復(fù)雜性,同時減少了dba的工作負(fù)荷。但是在數(shù)據(jù)庫只能使用這兩種方式的一種??梢栽跀?shù)據(jù)庫里定義兩種方式的文件,但是,同一時刻,必須指定數(shù)據(jù)使用哪一種方式。當(dāng)你需要在兩種方式中切換時,必須將系統(tǒng)重新啟動。


Oracle數(shù)據(jù)庫一直使用系統(tǒng)回滾段來完成系統(tǒng)的事務(wù)。系統(tǒng)回滾段是在數(shù)據(jù)庫,創(chuàng)建的時候產(chǎn)生的,系統(tǒng)啟動后就一直在線。Dba不需要對它作任何的操作來優(yōu)化。


. 指定Undo的方式
oracle 9i以后有個初始化參數(shù):undo_management。當(dāng)將undo_management設(shè)置成AUTO時系統(tǒng)使用重做表空間來管理回滾段,當(dāng)它被設(shè)置成MENUAL時系統(tǒng)使用回滾段。
oracle推薦使用重做表空間代替回滾段。


當(dāng)系統(tǒng)使用auto方式管理undo信息時,系統(tǒng)必須指定一個undo表空間。這個表空間可以是在數(shù)據(jù)庫創(chuàng)建時產(chǎn)生,也可以數(shù)據(jù)庫創(chuàng)建后再創(chuàng)建。

 

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

 

 

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


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


相關(guān)的初始化參數(shù):
undo_tablespace     指名系統(tǒng)使用哪一個重做表空間。
undo_suppress_errors  被設(shè)置成true時表示系統(tǒng)創(chuàng)建和使用回滾段時忽略錯誤。
undo_retention  系統(tǒng)提交后,回滾段的數(shù)據(jù)保留多長時間,單位是秒。
當(dāng)系統(tǒng)被設(shè)置成menual后,這幾個參數(shù)被忽略。

 

SQL> show parameter undo

NAME                        TYPE       VALUE

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

undo_management               string      AUTO

undo_retention                  integer     1000

undo_tablespace                 string      UNDOTBS1

 

補(bǔ)充:初始化參數(shù)UNDO_RETENTION

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

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

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

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

 

只有在一種情況下,undo 表空間能夠確保undo 中的數(shù)據(jù)在undo_retention 指定時間過期前一定有效,就是為undo 表空間指定Retention Guarantee,指定之后,oracle 對于undo 表空間中未過期的undo 數(shù)據(jù)不會覆蓋,

例如:

SQL> Alter tablespace undotbs1 retention guarantee;

 

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

例如:

SQL> Alter tablespace undotbs1 retention noguarantee;


2.2 manual管理模式
當(dāng)將系統(tǒng)中初始化參數(shù)undo_management設(shè)置成manual后,系統(tǒng)啟動后使用rollback segment方式存儲undo信息。如果系統(tǒng)沒有指定undo_management,那么系統(tǒng)默認(rèn)以manual方式啟動,即使設(shè)置了auto方式的參數(shù),這些參數(shù)將被忽略。


當(dāng)實例啟動時,系統(tǒng)根據(jù)如下幾個步驟確認(rèn)onlinerollback segment的數(shù)量
初始化參數(shù)rollback_segments
初始化參數(shù)transactionstransactions_per_rollback_segment
menual相關(guān)的初始化參數(shù)
rollback_segments 指定實例啟動時所需要的回滾段
transactions 指定系統(tǒng)中最大的并發(fā)事務(wù)數(shù)
transactions_per_rollback_segment 指定每一個回滾段支持的并發(fā)數(shù)
max_rollback_segments 指明系統(tǒng)支持的最大的online的回滾段數(shù)目


三 .  管理undo tablespace

創(chuàng)建undo talespace有兩種方式:
1. 數(shù)據(jù)庫創(chuàng)建時創(chuàng)建undo tablespace;
2. 在一個已經(jīng)存在的數(shù)據(jù)庫創(chuàng)建。
undo tablespace中不能創(chuàng)建數(shù)據(jù)庫對象,這是因為這個表空間是為數(shù)據(jù)庫recover而準(zhǔn)備的。


3.1 創(chuàng)建數(shù)據(jù)庫時創(chuàng)建undo tablespace
在創(chuàng)建數(shù)據(jù)庫的時候可以通過指定undo子句來創(chuàng)建undo tablespace,但是這個子句不是必須的。

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


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


注意:如果此時系統(tǒng)創(chuàng)建undo失敗,那么整個創(chuàng)建數(shù)據(jù)庫的命令就失敗了。此時
Dba需要刪除已經(jīng)創(chuàng)建的數(shù)據(jù)文件,糾正錯誤,重建創(chuàng)建數(shù)據(jù)庫。


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



3.2  Undo tablespace相關(guān)操作


1. 增加數(shù)據(jù)文件
ALTER TABLESPACE undotbs_01
ADD DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

 

2. 重命名數(shù)據(jù)文件

ALTER TABLESPACE undotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf';

 

3. 使數(shù)據(jù)文件online或者offline
ALTER TABLESPACE undotbs_01 online|offline;

 

4. 開始或者結(jié)束一個聯(lián)機(jī)備份
ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;

 

5. 刪除undo tablespace
Drop tablespace undotbs_01;

Drop undo表空間的時候必須是在未使用的情況下才能進(jìn)行。如果undo表空間正在使用(例如事務(wù)失敗,但是還沒有恢復(fù)成功),那么drop表空間命令將失敗。drop表空間的時候可以使用including contents。


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

1. 使用命令動態(tài)修改;

2. 修改初始化參數(shù)后重新啟動數(shù)據(jù)庫。

 

Alter system set undo_tablespace=undotbs1;

當(dāng)切換命令完成后,所有的事務(wù)就會在新的回滾表空間內(nèi)進(jìn)行。

 

以下幾種情況會導(dǎo)致切換命令失敗

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


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

 

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


8. Undo 表空間大小的設(shè)計規(guī)范的計算公式
Undospace = UR * UPS *db_block_size+ 冗余量
UR 表示在undo中保持的最長時間數(shù)(秒),由數(shù)據(jù)庫參數(shù)UNDO_RETENTION值決定。
UPS表示在undo中,每秒產(chǎn)生的數(shù)據(jù)庫塊數(shù)量。


undo有關(guān)的動態(tài)性能視圖v$undostat 包含undo的統(tǒng)計信息。使用這張視圖可以估計系統(tǒng)當(dāng)前所需的undo大小。
v$rollstat undo模式的視圖。是undo表空間的undo segments的統(tǒng)計信息
v$transaction 包含undo segments的信息。
dba_undo_extents 包含undo表空間中每一個范圍的提交時間。


管理回滾段

4.1 回滾段的使用方針

4.1.1 使用多個回滾段
使用多個回滾段來分擔(dān)回滾段的爭用,以提高系統(tǒng)性能。系統(tǒng)采用循環(huán)的方式來分配回滾段。當(dāng)oracle創(chuàng)建數(shù)據(jù)庫時候,系統(tǒng)自動在system中分配一個system rollback segment,用來完成系統(tǒng)的事務(wù),不為大家共用。所以系統(tǒng)最后能有至少一個回滾段存放用戶回滾信息。


系統(tǒng)能夠加載的用戶回滾段數(shù)量和以下幾個初始化參數(shù)有關(guān):
transactions_per_rollback_segment 指定每一個回滾段支持的并發(fā)數(shù);
max_rollback_segments 指明系統(tǒng)支持的最大的online的回滾段數(shù)目;
rollback_segments 指定實例啟動時所需要的回滾段;


4.1.2 選擇好回滾段的類型
private 必須通過實例指定名稱后才能使用。
如:必須在初始化參數(shù)中rollback_segments指定后,實例啟動才能使用,或者在實例啟動后online才能使用。
Public 則是實例啟動時系統(tǒng)自動發(fā)現(xiàn),系統(tǒng)根據(jù)初始化參數(shù)決定系統(tǒng)啟動時的回滾段。


4.1.3 為事務(wù)指定回滾段
在系統(tǒng)啟動時指定所需要的回滾段,

 

4.1.4 估計回滾段的大小
回滾段大小應(yīng)該基于系統(tǒng)最大的事務(wù)。如果回滾段過小,容易產(chǎn)生ora-01555錯誤??梢允褂?span>optimize選項來限制回滾段自動回收。回滾段的大小應(yīng)該是最大表的大小的10%,這個可以指定maxextents的數(shù)量。


4.1.5 創(chuàng)建范圍大小和數(shù)量相等的回滾段組
一般來說一個回滾段應(yīng)該包含1020個范圍。
s=T/n
s是初始化時定義的范圍的大小,T是初始化的回滾段大小,n是范圍數(shù)。由此可以確定定義回滾段的子句的各個參數(shù)。


4.1.6 定義optimal的值
設(shè)置這個參數(shù)可以避免回滾段無限擴(kuò)展以及系統(tǒng)自動回收空間。最小是兩個范圍的大小。

設(shè)置回滾段在不同的表空間
1:如果系統(tǒng)只有一個回滾表空間,那么回滾段出現(xiàn)問題,影響系統(tǒng)不能運行。
2:包含回滾段的表空間經(jīng)常分配和去配容易產(chǎn)生碎片。
3:當(dāng)回滾表空間被離線時,系統(tǒng)將沒有回滾表空間可以用。


MINEXTENTS最小等于2
OPTIMAL最小應(yīng)該設(shè)置成兩個extents大小
INITIAL和 NEXT最好一樣,除了應(yīng)用使用指定的回滾段;

 

4.2  回滾段的相關(guān)操作

 

4.2.1 創(chuàng)建回滾段
當(dāng)創(chuàng)建回滾段時,系統(tǒng)必須要有CREATE ROLLBACK SEGMENT系統(tǒng)權(quán)限。

 

創(chuàng)建的回滾段會online,并指定了存儲參數(shù);

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 修改回滾段

修改回滾段當(dāng)修改回滾段時,系統(tǒng)必須要有ALTER ROLLBACK SEGMENT系統(tǒng)權(quán)限

 

使回滾段online或者offline;
ALTER ROLLBACK SEGMENT RB01 ONLINE;

 

修改存儲參數(shù);
ALTER ROLLBACK SEGMENT RB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );

 

收縮回滾段;
ALTER ROLLBACK SEGMENT RB01 SHRINK;
注意:OPTIMAL參數(shù)時縮小到OPTIMAL沒有OPTIMAL參數(shù)時縮小到MINEXTENTS所對應(yīng)的尺寸

ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;
ALTER ROLLBACK SEGMENT RB01 STAROGE(MAXEXTENTS 120);


4.2.3 刪除回滾段
當(dāng)刪除回滾段時,系統(tǒng)必須要有DROP ROLLBACK SEGMENT系統(tǒng)權(quán)限
原則上,INITIAL總應(yīng)該等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滾段。由于INITIAL不能直接修改,只能先drop然后創(chuàng)建。


DROP ROLLBACK SEGMENT RB01;
CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1
STORAGE ( INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);


在事務(wù)中使用特定的回滾段 

SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;


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


4.3 和回滾段相關(guān)的性能視圖


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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI