能切但不能直接删旧undo表空间,因删除必须等所有回滚段OFFLINE;RAC中各实例undo配置独立,需用SID逐个切换并验证v$rollstat与dba_rollback_segs状态。

能切,但不能直接删旧的;切换本身不依赖事务是否结束,但删除必须等所有回滚段 OFFLINE。
确认当前 undo 表空间和实例绑定关系
Oracle RAC 中每个 instance 可能用不同 undo 表空间,show parameter undo_tablespace 查到的只是当前 session 所连实例的设置,不是全局统一值。真正生效的是 ALTER SYSTEM SET undo_tablespace=xxx SID='inst1' SCOPE=BOTH 这类带 SID 的语句。
- 查所有实例的配置:
SELECT inst_id, name, value FROM gv$parameter WHERE name = 'undo_tablespace' - 查当前实例实际在用哪个:
SELECT tablespace_name FROM dba_tablespaces WHERE contents = 'UNDO' AND status = 'ONLINE'(注意:这里只显示 ONLINE 的,但可能有多个 UNDO 表空间都 ONLINE,真正被用的是参数指定的那个) - 别只看 CDB 级参数——PDB 默认不设
undo_tablespace,由 CDB 自动分配;强行在 PDB 里执行ALTER SYSTEM SET undo_tablespace=...必须加SID,否则报错 ORA-65043
创建新 undo 表空间并切换(关键在 scope 和 sid)
新表空间创建后,ALTER SYSTEM SET undo_tablespace=... 必须明确指定 SID 和 SCOPE=BOTH,否则重启后失效或只在当前实例生效。不加 SID 在 RAC 下等于没设。
- 建新表空间:
CREATE UNDO TABLESPACE undotbs02 DATAFILE '/u01/oradata/db/undotbs02.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED - 切换(逐实例执行):
ALTER SYSTEM SET undo_tablespace=undotbs02 SID='rac1' SCOPE=BOTH;同理对rac2再执行一遍 - 切完立刻查:
SELECT usn, xacts, status FROM v$rollstat—— 原表空间的回滚段会逐步变成OFFLINE,新表空间出现ONLINE段 - 别信“切换即释放”——即使切换完成,原 undo 表空间仍可能处于
PENDING SWITCH-OFF状态,alert log 里会出现active transactions found in undo Tablespace X
删除旧 undo 表空间前必须验证回滚段状态
直接 DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES 极易失败或导致实例 hang,因为 Oracle 需要前镜像做事务回滚,而旧 undo 里可能还存着未提交事务的 undo record(尤其当 UNDO_RETENTION 设得大时)。
- 先确认无活跃事务:
SELECT username, t.used_ublk FROM gv$transaction t, gv$session s WHERE s.taddr = t.addr—— 结果为空不代表可删 - 真正要看回滚段:
SELECT segment_name, status FROM dba_rollback_segs WHERE tablespace_name = 'UNDOTBS1',所有行必须是OFFLINE - 如果还有
ONLINE或PENDING OFFLINE,等或强制 offline:ALTER ROLLBACK SEGMENT "_SYSSMU1_123456789$" OFFLINE(不推荐,仅应急) - 千万别删 CDB 的 undo 表空间——PDB 共享它,删了整个 CDB 启不来;PDB 自己建的 undo 表空间可以删,但必须先
ALTER SESSION SET CONTAINER=CDB$ROOT
RAC 下滚动重启与常见报错
如果切换后某实例启动失败,大概率是因为 undo_tablespace 参数指向了一个不存在的表空间名,或者数据文件路径不对。RAC 不支持“一次性全切”,必须 rolling restart。
- 错误
ORA-01092: ORACLE instance terminated. Disconnection forced常见于:改完参数没SCOPE=BOTH,重启时读 spfile 发现 undo 表空间不存在 - 错误
ORA-01552: cannot use system rollback segment for non-system tablespace说明当前实例没成功切到新 undo,还在试图用 SYSTEM 回滚段——立刻检查该实例的undo_tablespace参数值和对应表空间状态 - RECO 进程无法恢复被 drop 的 undo 表空间——它只管分布式事务协调,不存 undo 数据;真丢了只能从备份恢复,或靠 flashback database(前提是开了)
最麻烦的不是切换,而是判断“能不能删”。v$rollstat 和 dba_rollback_segs 的状态要交叉比对,且必须在每个实例上单独验证;PDB 场景下还要注意容器切换,漏一步就卡住。


















