Chinaunix首页 | 论坛 | 博客
  • 博客访问: 142926
  • 博文数量: 46
  • 博客积分: 3033
  • 博客等级: 中校
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-05 16:13
文章分类

全部博文(46)

文章存档

2011年(1)

2010年(8)

2009年(22)

2008年(15)

我的朋友

分类: 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; 

阅读(968) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~