Oracle切换undo后如何确定使用旧undo的会话信息

发布时间 2023-12-11 10:27:46作者: PiscesCanon

 

Oracle切换undo后如何确定使用旧undo的会话信息

 

背景

是这样的,最近RAC的磁盘组90%报警,存储空间只能再加2T空间。

而这套RAC的DATA组用了normal冗余,不知道当初哪个大聪明这么搞的,底层还是做了RAID 10的。

领导也不知道不懂这么设置的。

因此,这新的2T创建新磁盘组且使用extern的外部冗余,后续将index和undo切换到新的磁盘组上。

 

index重建到新表空间就行,而undo通过创建新的undo类型表空间并切换新undo达到迁移目的。

参考mos文档:How to Shrink the datafile of Undo Tablespace (Doc ID 268870.1)

上周五创建新undo并且切换过去后,当时立刻直接删除会报:

ORA-30013: undo tablespace 'UNDOTBS1' is currently in use

原本想着隔个周末两天时间然后今天周一再次进行删除,没想到还是报错。

根据Undo Tablespace Moved To Pending Switch-Out State (Doc ID 341372.1)可知,当默认的undo表空间改变后,原来使用旧undo的活动事务将在v$rollstat.status中显示为“PENDING OFFLINE”状态。

因此可以使用如下脚本查看使用旧undo的活动事务的会话:

col usn for 999
col name for a25
col USERNAME for a15
col STATUS for a15
col TABLESPACE_NAME for a11
col SID for 99999
col SERIAL# for 99999
col PROGRAM for a19
col MACHINE for a25
col OSUSER for a20
SELECT
a.usn,
a.name,
b.status,
c.tablespace_name,
d.addr,
e.sid,
e.serial#,
e.username,
e.program,
e.machine,
e.osuser
FROM
v$rollname a,
v$rollstat b,
dba_rollback_segs c,
v$transaction d,
v$session e
WHERE
a.usn=b.usn AND
a.name=c.segment_name AND
a.usn=d.xidusn AND
d.addr=e.taddr AND
b.status='PENDING OFFLINE';

 

以下是我此次查询结果(脱敏):

db1:
 USN NAME                  STATUS          TABLESPACE ADDR                SID SERIAL# USERNAME        PROGRAM             MACHINE                   OSUSER
---- --------------------- --------------- ---------- ---------------- ------ ------- --------------- ------------------- ------------------------- --------------------
   9 _SYSSMU9_2162248266$  PENDING OFFLINE UNDOTBS1   0000001783BFD9D8   2129      13 ABCD_EFGH       AbcdefghApp.exe     WORKGROUP\VM-ABCD-APP23   abcdefgadmin
  10 _SYSSMU10_3111847501$ PENDING OFFLINE UNDOTBS1   0000001783C44840   2065      13 ABCD_EFGH       AbcdefghApp.exe     WORKGROUP\VM-ABCD-APP23   abcdefgadmin

db2:
 USN NAME                  STATUS          TABLESPACE ADDR                SID SERIAL# USERNAME        PROGRAM             MACHINE                   OSUSER
---- --------------------- --------------- ---------- ---------------- ------ ------- --------------- ------------------- ------------------------- --------------------
  20 _SYSSMU20_2091716515$ PENDING OFFLINE UNDOTBS2   000000177BF53AA0    913       3 ABCD_EFGHG      JDBC Thin Client    ABCD-App08                abcdefgadmin

 

经过排查发现会话并没有未commit的会话,而是均使用了含有dblink的select查看,因此产生事务。

经确认可以直接kill。

至此,解决。