被使用的undo段。
select sum(bytes) from dba_undo_extents where tablespace_name='UNDOTBS1' and status='ACTIVE';
此語句得出要回滾的數據量,如果不為NULL,則undotbs1表空間也不能被刪除。而且如果有大量數據的話,系統會比較慢,且使用shutdown immediate將不能關閉數據庫,且重新啟動數據庫後smon仍要繼續回滾undotbs1中的數據。因為smon管理回滾及段的分配,此時集中處理回滾,將很少進行段的分配,那麼會造成數據庫慢。
可以切換使用一個undo表空間到另一個undo表空間。因為UNDO_TABLESPACE初始化參數是一個動態參數,可以使用ALTER SYSTEM SET語句分配一個新的undo表空間。下列語句有效地切換至一個新的undo表空間
--刪除當前正在undotbs1中的事務(特別注意是否是能刪除要進行確認),應在空閒時使用
select s.sid From v$transaction t,v$session s where t.addr=s.taddr;
kill
SQL> create undo tablespace undotbs3 datafile '/dev/rlv_04_210'; --undo表空間不能使用ASSM,也不能指定UNIFORM SIZE;缺省為LMT
SQL> alter tablespace undotbs3 add datafile '/dev/rlv_04_211';
SQL> alter tablespace undotbs3 add datafile '/dev/rlv_04_212';
SQL> alter tablespace undotbs3 add datafile '/dev/rlv_04_213';
SQL> alter tablespace undotbs3 add datafile '/dev/rlv_04_214';
SQL> alter system set undo_tablespace='undotbs3' sid='stat1';
--刪除undotbs1表空間
alter tablespace undotbs1 offline;
drop tablespace undotbs1;
切換操作不等待老的undo表空間中的事務處理提交。如果在老的undo表空間中有任何pending transactions,老的undo表空間進入pending offline方式(狀態)。在這個方式中,可以繼續執行已存在的事務處理,但對於新的用戶事務處理而言,不能在這個undo表空間中存儲undo記錄。
例子:
一、undo表空間中無事務存在
1.創建新的undo表空間
SQL> select count(*) from v$transaction;
COUNT(*)
----------
0
create undo tablespace undotbs3 datafile '/dev/vgqryb02/rlv_08_rbs_003';
alter system set undo_tablespace='undotbs3';
alter tablespace undotbs1 offline;
drop tablespace undotbs1;
2.切換回原undo表空間
create undo tablespace undotbs1 datafile '/dev/vgqryb01/rlv_08_rbs_001';
alter tablespace undotbs1 add datafile '/dev/vgqryb01/rlv_08_rbs_002';
SQL> select count(*) from v$transaction;
COUNT(*)
----------
0
alter system set undo_tablespace='undotbs1';
alter tablespace undotbs3 offline;
drop tablespace undotbs3;
二、undo表空間中有事務存在
1.可能時,刪除存在的事務
SQL> select count(*) from v$transaction;
COUNT(*)
----------
5
SQL> select p.SPID from v$session s,
v$process p where s.PADDR=p.ADDR and s.SID in (select s.sid From v$transaction t,v$session s where t.addr=s.taddr);
SPID
------------
24509
706
16329
21467
19335
在主機上,kill掉對應的進程:
$kill -9 24509
$kill -9 706
$kill -9 16329
$kill -9 21467
$kill -9 19335
SQL> select count(*) from v$transaction;
COUNT(*)
----------
0
2.創建新的undo表空間
create undo tablespace undotbs3 datafile '/dev/vgqrya02/rlv_08_rbs_003';
alter system set undo_tablespace='undotbs3';
alter tablespace undotbs1 offline;
drop tablespace undotbs1;
3.切換回原undo表空間
create undo tablespace undotbs1 datafile '/dev/vgqrya01/rlv_08_rbs_001';
alter tablespace undotbs1 add datafile '/dev/vgqrya01/rlv_08_rbs_002';
SQL> select count(*) from v$transaction;
COUNT(*)
----------
0
alter system set undo_tablespace='undotbs1';
alter tablespace undotbs3 offline;
drop tablespace undotbs3;