ORA-00257报错时RAC节点通常仍可sqlplus / as sysdba登录,但普通用户无法连接;需先确认是否为归档满(查v$flash_recovery_area_usage中ARCHIVELOG使用率≥95%),再通过RMAN在任一节点执行CROSSCHECK ARCHIVELOG ALL、DELETE NOPROMPT EXPIRED ARCHIVELOG ALL及保留窗口的DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7',并确保log_archive_dest_1指向统一共享路径(如+FRA)以根治反复爆满问题。
ORA-00257报错时,RAC节点是否能连上?
不能直接用普通用户连接,但rac各节点的sqlplus / as sysdba通常仍可登录——前提是实例没彻底crash。这是关键突破口。如果连sysdba都失败,说明不是单纯归档满,而是底层存储或asm磁盘组异常,需先查crsctl stat res -t和asmcmd lsdg。
确认是归档问题后,优先在任一可连节点执行:SELECT * FROM v$flash_recovery_area_usage;
重点看ARCHIVELOG行的percent_space_used是否≥95%。RAC环境下这个视图对所有实例统一有效,无需逐节点查。
RMAN清理归档日志前,必须先做CROSSCHECK
RAC中归档日志可能分散写入不同节点的本地路径(尤其当log_archive_dest_1指向本地目录时),而控制文件只记录被归档过的日志元数据。不执行CROSSCHECK ARCHIVELOG ALL就直接删,RMAN只会删它“认为存在”的归档,大量物理文件残留。
实操要点:
- 用
rman target /连接任意节点,RMAN会自动识别RAC集群上下文 - 执行
CROSSCHECK ARCHIVELOG ALL后,再跑DELETE NOPROMPT EXPIRED ARCHIVELOG ALL——这步清掉控制文件里标记为“丢失”的归档 - 接着用
DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7'保留最近7天,避免恢复窗口断裂 - 最后
DELETE NOPROMPT OBSOLETE清理过期备份片(注意:RAC中OBSOLETE策略依赖于RETENTION POLICY,别设成RECOVERY WINDOW OF 0 DAYS)
闪回区空间不够,不能只调db_recovery_file_dest_size
单纯增大db_recovery_file_dest_size参数只是治标。RAC中更常见的是:闪回区所在ASM磁盘组真实空间已满,但Oracle计算的db_recovery_file_dest_size还没到上限,导致归档卡死却无错误提示。
必须同步检查:
- ASM磁盘组剩余空间:
SELECT name, total_mb, free_mb, round(free_mb/total_mb*100, 1) pct_free FROM v$asm_diskgroup; - 闪回区物理路径是否跨节点一致:
SHOW PARAMETER db_recovery_file_dest,确保所有节点指向同一ASM磁盘组(如+FRA),而非各自本地路径 - 若确需扩容,用
ALTER SYSTEM SET db_recovery_file_dest_size=50G SCOPE=BOTH SID='*';(SID='*'保证RAC所有实例生效)
RAC归档路径配置不当,是反复爆满的根源
很多RAC环境把log_archive_dest_1设成各节点本地目录(如/u01/arch/node1),结果归档日志分散在各节点磁盘,DBA只清了主节点目录,备节点磁盘悄悄撑爆。
正确做法:
- 强制归档到共享存储:
ALTER SYSTEM SET log_archive_dest_1='LOCATION=+FRA' SCOPE=BOTH SID='*'; - 禁用本地归档:
ALTER SYSTEM SET log_archive_dest_2='' SCOPE=BOTH SID='*';(避免误配) - 验证是否生效:
ARCHIVE LOG LIST输出中的Archive destination应显示+FRA,且所有节点一致
RAC里归档路径不统一,比单机环境更容易掩盖问题——直到某个节点磁盘告警才暴露,那时往往已连不上。


















