分类: Oracle
2009-05-17 16:28:11
被使用的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;