oracle rac中undo表空间必须按实例隔离分配,不可统一配置;各实例需独立确认、扩容及切换undo表空间,严禁跨节点混用或误操作,否则引发ora-01555、ora-30036等严重错误。

Oracle RAC中Undo表空间不能“统一配”,必须按实例隔离分配——否则会触发ORA-01555、ORA-30036甚至事务可见性错乱。
查清每个实例实际绑定的UNDO表空间名
别凭印象认为所有节点都用UNDOTBS1。RAC里各实例可能绑定不同表空间,比如节点1用UNDOTBS1,节点2用UNDOTBS2,这是LOCAL UNDO模式下的默认行为(12.2+)。连到每个实例分别执行:
-
SHOW PARAMETER undo_tablespace—— 看当前实例生效值 -
SELECT tablespace_name, status FROM dba_tablespaces WHERE contents = 'UNDO'—— 确认该表空间是否ONLINE -
SELECT file_name, bytes/1024/1024/1024 GB FROM dba_data_files WHERE tablespace_name = ''—— 查物理文件大小和路径
如果某实例查dba_data_files返回空,说明它根本没加载这个表空间,别对着名字硬扩。
扩容必须逐实例独立操作,不能并行ALTER DATABASE
RAC不是单机,UNDOTBS1和UNDOTBS2逻辑隔离,哪怕物理路径相同也不能混用。常见错误是:在节点1上执行ALTER TABLESPACE UNDOTBS1 ADD DATAFILE ...,再切到节点2执行同样语句——但目标表空间名写错了(比如误写成UNDOTBS1而非UNDOTBS2),直接报ORA-00959: tablespace 'UNDOTBS1' does not exist。
- 每个实例只对自己绑定的UNDO表空间执行
ALTER TABLESPACE <name> ADD DATAFILE</name> - 裸设备路径(如
/dev/rrac_undo1_raw_1)必须在所有节点上存在、属主为oracle:dba、HA集群已同步;ASM路径则需确认磁盘组(如+DATA)在v$asm_diskgroup中有足够free_mb - 不建议新增数据文件,优先开
AUTOEXTEND ON:查出当前文件路径后,执行ALTER DATABASE DATAFILE '/path/to/undotbs01.dbf' AUTOEXTEND ON NEXT 200M MAXSIZE 8G
避免UNDO_RETENTION盲目调大反而加剧爆满
UNDO_RETENTION只是“保留时间下限”,真正起作用的是v$undostat.tuned_undoretention——Oracle根据负载自动计算的实际窗口。如果tuned_undoretention长期只有1800秒,而你硬设undo_retention=7200,只会让UNDO块压得更久、空间更快耗尽。
- 先查
SELECT MAX(expstealcount) FROM v$undostat:若>0,说明UNDO空间已不够,系统正在强制覆盖未过期块,此时调参毫无意义,必须扩容 - 查
v$transaction找长事务:SELECT start_time, used_ublk FROM gv$transaction WHERE SYSDATE - start_time > 10/1440(10分钟以上),这类事务会锁住大量UNDO块,影响全局 - 12c+可临时关自动调优:
ALTER SYSTEM SET "_undo_autotune"=FALSE SCOPE=BOTH,再手动设合理值(如3600),但前提是expstealcount=0且空间充足
切换UNDO表空间前必须确保回滚段全OFFLINE
创建新UNDO表空间(如UNDOTBS2)并用ALTER SYSTEM SET undo_tablespace=UNDOTBS2 SCOPE=BOTH SID='rac2'切换后,旧表空间不能立刻删。关键卡点在清理:
-
SELECT usn, xacts, status FROM v$rollstat—— 所有status必须为OFFLINE,不能有ONLINE或PENDING -
SELECT s.username, u.name FROM gv$transaction t, gv$rollstat r, v$rollname u, gv$session s WHERE s.taddr = t.addr AND t.xidusn = r.usn AND r.usn = u.usn—— 若有结果,说明还有活跃事务在用旧回滚段 - 生产环境务必等业务低峰期操作,且切换后观察至少1小时再删旧表空间,避免
ORA-30013: undo tablespace 'XXX' is currently in use
最易被忽略的是:RAC中v$rollstat只反映本实例状态,必须在每个节点上分别查、分别等——没人替你跨节点同步OFFLINE。











