Oracle 的Undo有兩種方式: 一是使用undo 表空間,,二是使用回滾段.
我們通過(guò) undo_management 參數(shù)來(lái)控制使用哪種方式,,如果設(shè)為auto,就使用UNDO 表空間,,這時(shí)必須要指定一個(gè)UNDO 表空間,。 如果設(shè)為manual,系統(tǒng)啟動(dòng)后使用rollback segment方式存儲(chǔ)undo信息,。如果系統(tǒng)沒有指定undo_management,,那么系統(tǒng)默認(rèn)以manual方式啟動(dòng),即使設(shè)置了auto方式的參數(shù),,這些參數(shù)將被忽略。
當(dāng)實(shí)例啟動(dòng)的時(shí)候,,系統(tǒng)自動(dòng)選擇第一個(gè)有效的undo表空間或者是rollback segment,,如果沒有有效的可用的undo表空間或者是回滾段,系統(tǒng)使用system rollback segment,。這種情況是不被推薦的,,當(dāng)系統(tǒng)運(yùn)行在沒有undo的情況下,系統(tǒng)會(huì)在alert.log中記錄一條警告信息,。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
參考:Oracle undo 管理 一. UNDO 表空間 下面來(lái)看一下undo 的表空間管理,。先來(lái)查看一下表空間的使用情況: /* Formatted on 2010/6/23 9:46:58 (QP5 v5.115.810.9015) */ SELECT a.tablespace_name,
ROUND (a.total_size) "total_size(MB)",
ROUND (a.total_size) - ROUND (b.free_size, 3) "used_size(MB)",
ROUND (b.free_size, 3) "free_size(MB)",
ROUND (b.free_size / total_size * 100, 2) || '%' free_rate
FROM ( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 total_size
FROM dba_data_files
GROUP BY tablespace_name) a,
( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 free_size
FROM dba_free_space
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name(+);
TABLESPACE_NAME total_size(MB) used_size(MB) free_size(MB) FREE_RATE -------------------- -------------- ------------- ------------- --------------
SYSAUX 580 545.187 34.813 6% UNDOTBS1 90 23.875 66.125 73.47%
DAVE 20 6.25 13.75 68.75%
USERS 10 8.375 1.625 16.25%
SYSTEM 960 951.062 8.938 93%
從結(jié)果我們看到UNDO 表空間已經(jīng)用了23.875M。 我們看一下這使用的23M空間里空閑和非空閑比例: /* Formatted on 2010/6/23 9:49:53 (QP5 v5.115.810.9015) */
SELECT tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)"
FROM dba_undo_extents
GROUP BY tablespace_name, status;
TABLESPACE_NAME STATUS Bytes(M) -------------------- --------- ----------
UNDOTBS1 UNEXPIRED 9.1875
UNDOTBS1 EXPIRED 13.6875
我們看一下查詢的結(jié)果,,UNEXPIRED 和EXPIRED 是已使用的undo 表空間,,其中expired 說(shuō)明是已經(jīng)過(guò)期的數(shù)據(jù),也就是15分鐘(默認(rèn)情況)以外的數(shù)據(jù),,以被覆蓋,,可以認(rèn)為是空閑的。 在此補(bǔ)充一點(diǎn)知識(shí):
采用UNDO 表空間時(shí),,會(huì)有一個(gè)參數(shù)UNDO_RETENTION,,該參數(shù)用來(lái)指定undo 記錄保存的最長(zhǎng)時(shí)間,以秒為單位,,是個(gè)動(dòng)態(tài)參數(shù),,完全可以在實(shí)例運(yùn)行時(shí)隨時(shí)修改,通常默認(rèn)是900 秒,,也就是15 分鐘,。
undo_retention 只是指定undo 數(shù)據(jù)的過(guò)期時(shí)間,并不是說(shuō),,undo 中的數(shù)據(jù)一定會(huì)在undo表空間中保存15 分鐘,,比如說(shuō)剛一個(gè)新事務(wù)開始的時(shí)候,如果undo 表空間已經(jīng)被寫滿,,則新事務(wù)的數(shù)據(jù)會(huì)自動(dòng)覆蓋已提交事務(wù)的數(shù)據(jù),,而不管這些數(shù)據(jù)是否已過(guò)期,因此呢,,這就又關(guān)聯(lián)回了第一點(diǎn),,當(dāng)你創(chuàng)建一個(gè)自動(dòng)管理的undo 表空間時(shí),還要注意其空間大小,,要盡可能保證undo 表空間有足夠的存儲(chǔ)空間,。 undo_retention 中指定的時(shí)間一過(guò),已經(jīng)提交事務(wù)中的數(shù)據(jù)就立刻無(wú)法訪問(wèn),,它只是失效,,只要不被別的事務(wù)覆蓋,,它會(huì)仍然存在,并可隨時(shí)被flashback 特性引用,。如果你的undo表空間足夠大,,而數(shù)據(jù)庫(kù)又不是那么繁忙,那么其實(shí)undo_retention 參數(shù)的值并不會(huì)影響到你,,哪怕你設(shè)置成1,,只要沒有事務(wù)去覆蓋undo 數(shù)據(jù),它就會(huì)持續(xù)有效,。因此呢,,這里還是那句話,要注意undo 表空間的大小,,保證其有足夠的存儲(chǔ)空間,。 只有在一種情況下,undo 表空間能夠確保undo 中的數(shù)據(jù)在undo_retention 指定時(shí)間過(guò)期前一定有效,,就是為undo 表空間指定Retention Guarantee,指定之后,,oracle 對(duì)于undo 表空間中未過(guò)期的undo 數(shù)據(jù)不會(huì)覆蓋,,例如: SQL> Alter tablespace undotbs1 retention guarantee;
禁止undo 表空間retention guarantee,例如:
SQL> Alter tablespace undotbs1 retention noguarantee;
總結(jié)一下:
UNDO 表空間是會(huì)被重用的,只有當(dāng)事務(wù)沒結(jié)束,或開了retention guarantee,或在undo_retention時(shí)間內(nèi)不能被重用,。
在undo_retention規(guī)定的時(shí)間內(nèi),,數(shù)據(jù)都是有效的,過(guò)期后都會(huì)設(shè)為無(wú)效,,狀態(tài)被改為Expired,,這些回滾段將會(huì)被看作Free Space。但是只要數(shù)據(jù)沒有被覆蓋就可以使用,。如果空間已滿,,新事務(wù)的數(shù)據(jù)會(huì)自動(dòng)覆蓋掉已經(jīng)提交的事務(wù)數(shù)據(jù),即使在undo_retention的時(shí)間內(nèi),。除非指定Retention Guarantee模式,,才能保證在undo_retention內(nèi)不被覆蓋。
二. UNDO 表空間滿了的處理方法
2.1 先模擬UNDO 表空間滿的情況 SQL> alter system set undo_retention=10800; -- 3個(gè)小時(shí) 系統(tǒng)已更改,。 SQL> create undo tablespace undo datafile 'F:\backup\undo.dbf' size 1m ; 表空間已創(chuàng)建,。 SQL> alter tablespace undo retention guarantee; 表空間已更改。 SQL> alter system set undo_tablespace=undo; 系統(tǒng)已更改,。 SQL> create table DBA(id number);
表已創(chuàng)建,。
SQL> begin 2 for i in 1 .. 100000 loop
3 insert into dba values(i);
4 commit;
5 end loop;
6 end;
7 /
begin
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-30036: 無(wú)法按 8 擴(kuò)展段 (在還原表空間 'UNDO' 中)
ORA-06512: 在 line 3
2.2 處理方法 處理方法有兩種,一是添加undo 表空間的數(shù)據(jù)文件,,二是切換UNDO tablespace. 這種情況下多用在undo 表空間已經(jīng)非常大的情況,。
2.2.1 增加數(shù)據(jù)文件 SQL> ALTER TABLESPACE undo ADD DATAFILE 'F:\backup\undo02.dbf' size 100M reuse;
表空間已更改,。
SQL> begin
2 for i in 1..100000 loop
3 insert into dba values(1);
4 commit;
5 end loop;
6 end;
7 /
PL/SQL 過(guò)程已成功完成。
2.2.2 切換UNDO 表空間
1,、建立新的表空間UNDOTBS2 SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 'F:\backup\undo03.dbf' size 100M reuse;
表空間已創(chuàng)建,。
2、切換到新建的UNOD表空間上來(lái),操作如下 SQL> alter system set undo_tablespace=UNDOTBS2 scope=both; 系統(tǒng)已更改,。
3,、將原來(lái)的UNDO表空間,置為脫機(jī): SQL> alter tablespace UNDO offline; 表空間已更改。 4,、刪除原來(lái)的UNDO表空間: SQL> drop tablespace UNDO including contents AND DATAFILES CASCADE CONSTRAINTS ; 表空間已刪除,。
如果只是drop tablespace UNDO ,則只會(huì)在刪除控制文件里的記錄,,并不會(huì)物理刪除文件,。 Drop undo表空間的時(shí)候必須是在未使用的情況下才能進(jìn)行。如果undo表空間正在使用(例如事務(wù)失敗,,但是還沒有恢復(fù)成功),,那么drop表空間命令將失敗。在drop表空間的時(shí)候可以使用including contents,。
三. UNDO 表空間損壞的恢復(fù)方法 一般Undo 表空間損壞的情況下,,數(shù)據(jù)庫(kù)都已不能正常打開了。啟動(dòng)時(shí)都會(huì)報(bào)類似如下的錯(cuò)誤: ORA-01157: cannot identify/lock data file 12 - see DBWR trace file ORA-01110: data file 12: '/d01/oramtest/proddata/undo01.dbf' 要想解決問(wèn)題,,必須重建UNDO 表空間,,但是如果不open, 就不能重建創(chuàng)建undo 表空間,。 所以可以先用系統(tǒng)默認(rèn)的undo 表空間:system rollback segment 來(lái)啟動(dòng)數(shù)據(jù)庫(kù),,再創(chuàng)建UNDO 表空間。 3.1 創(chuàng)建pfile 文件
SQL> create pfile='F:\initorcl.ora' from spfile;
文件已創(chuàng)建,。
3.2 修改pfile文件 #*.undo_tablespace='UNDOTBS1' #*.undo_management='AUTO'
undo_management='MANUAL'
rollback_segments='SYSTEM'
3.3 啟動(dòng)數(shù)據(jù)庫(kù)至Mount 狀態(tài) SQL> STARTUP MOUNT pfile='F:\initorcl.ora' ;
3.4 offline drop undo 表空間 SQL> ALTER DATABASE DATAFILE 'D:\app\Administrator\oradata\orcl\UNDOTBS01.DBF' OFFLINE DROP;
3.5 open 數(shù)據(jù)庫(kù) SQL> ALTER DATABASE OPEN;
3.6 刪除舊的undo 表空間 SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS;
注:該命令不會(huì)刪除物理文件,。 要想一起刪除物理文件需要 AND DATAFILES CASCADE CONSTRAINTS ;
如: drop tablespace UNDOTBS1 including contents AND DATAFILES CASCADE CONSTRAINTS ;
3.7 創(chuàng)建新的UNDO 表空間 SQL> create undo tablespace undotbs1 datafile 'D:\app\Administrator\oradata\orcl\UNDOTBS01.DBF' size 100M ; create undo tablespace undotbs1 datafile 'D:\app\Administrator\oradata\orcl\UNDOTBS01.DBF' size 100M
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-01119: 創(chuàng)建數(shù)據(jù)庫(kù)文件 'D:\app\Administrator\oradata\orcl\UNDOTBS01.DBF'時(shí)出錯(cuò)
ORA-27038: 所創(chuàng)建的文件已存在
OSD-04010: 指定了 <create> 選項(xiàng), 但文件已經(jīng)存在
因?yàn)槲覀冎皠h除時(shí)并沒有刪除物理文件,,所以在建同名文件時(shí)就會(huì)報(bào)錯(cuò),。 我們可以加上REUSE 參數(shù)。 只要文件不在使用,,就可以重寫已經(jīng)存在的文件,。 SQL> create undo tablespace undotbs1 datafile 'D:\app\Administrator\oradata\orcl\UNDOTBS01.DBF' size 100M reuse; 表空間已創(chuàng)建。
3.8 shutdown 數(shù)據(jù)庫(kù) 并將pfile 改回 SQL> select name,issys_modifiable from v$parameter where name='undo_management' or name='rollback_segments';
NAME ISSYS_MOD
-------------------- ---------
rollback_segments FALSE
undo_management FALSE
從上面查詢的結(jié)果,,可以知道修改這2個(gè)參數(shù)必須重啟數(shù)據(jù),,所以還是shutdown 吧。 SQL> shutdown immediate 3.9 修改pfile 參數(shù) *.undo_tablespace='UNDOTBS1'
*.undo_management='AUTO'
#undo_management='MANUAL'
#rollback_segments='SYSTEM'
3.10 用剛才修改的pfile 啟動(dòng)數(shù)據(jù)庫(kù),并創(chuàng)建spfile SQL> startup pfile='F:\initorcl.ora' ;
SQL> create spfile from pfile='F:\initorcl.ora';
3.10 再次shutdown,,用spfile 啟動(dòng). SQL> shutdown immediate
SQL> startup
一般數(shù)據(jù)文件損壞的情況也可以采用類似的方法,, 先啟動(dòng)到mount, 在將損壞的數(shù)據(jù)文件offline drop,。 在open 數(shù)據(jù)庫(kù),,drop 掉損壞的數(shù)據(jù)文件。 當(dāng)然這種做法有數(shù)據(jù)丟失,。 能恢復(fù)的話,,盡量恢復(fù)。
本文來(lái)自CSDN博客,,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/tianlesoftware/archive/2010/06/23/5689558.aspx
|
|