oracle 19c rac中两节点不能交叉访问对方本地归档日志,因归档受控制文件、arcn进程及全局队列保护,本地路径导致scn记录缺失、路径不可达、恢复链断裂;必须统一写入共享位置(如asm或nfs),并通过v$archive_dest和v$archived_log验证跨节点归档一致性。

Oracle 19c RAC 中两节点间无法直接“交叉访问”对方归档日志——这不是设计目标,强行打通反而破坏归档一致性与RAC集群语义。真正该做的是让所有节点统一写入共享归档目标(如ASM磁盘组或NFS),并确保归档路径在所有实例中逻辑一致。
为什么不能让 rac1 直接读 rac2 的本地归档目录
归档日志不是普通文件,它受实例控制文件、归档进程(ARCn)和RAC全局队列保护。若rac2将归档写到/u01/arch/rac2而rac1试图去读,会遇到:
- rac1的控制文件里没有该归档的SCN序列记录,
RECOVER DATABASE会报ORA-00279/ORA-00289 - rac2宕机后该路径不可达,rac1无法完成恢复链;RAC要求“任一节点可接管全部恢复任务”,本地路径破坏这一前提
- 归档命名冲突风险:两个实例若都用
%t_%s_%r.dbf但未强制区分INSTANCE_NAME,可能生成同名文件覆盖
正确做法:归档必须写入所有节点可见的共享位置
Oracle 19c RAC 默认支持跨节点归档,但前提是归档目标本身是共享的,且log_archive_dest_1配置为统一路径:
- 使用ASM磁盘组(推荐):
log_archive_dest_1='LOCATION=+ARCH'—— 所有节点通过ASM实例访问同一别名,物理块由ASM自动分布,无需关心哪块盘在哪节点 - 使用NFS挂载点(需严格权限校验):
log_archive_dest_1='LOCATION=/nfs/arch',且所有节点以oracle:oinstall挂载、启用noac选项避免缓存不一致 - 绝对禁止写成:
LOCATION=/u01/arch/rac1或LOCATION=/u01/arch/rac2—— 这会导致单点故障和恢复断裂
如何验证归档是否真正跨节点可用
不能只看文件是否存在,要确认RAC集群级归档链完整:
- 在任意节点执行:
SELECT DEST_ID, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE DEST_ID = 1,所有节点返回STATUS = VALID且ERROR为空 - 查归档历史:
SELECT THREAD#, SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY FIRST_TIME DESC,应看到THREAD 1和THREAD 2的日志交替出现,且NEXT_TIME连续无跳变 - 手动切换日志:
ALTER SYSTEM SWITCH LOGFILE,然后立刻在另一节点查V$LOG_HISTORY,确认新归档已同步可见(延迟通常
容易被忽略的关键点
即使路径共享,仍可能因以下配置失效:
-
log_archive_format中未含%t(thread#):导致THREAD 1和THREAD 2归档文件名冲突,覆盖发生后RECOVER直接失败 - ASM磁盘组冗余不足:若
+ARCH是EXTERNAL冗余,某块磁盘损坏即丢失全部归档,必须设为NORMAL或HIGH - 归档目录空间监控未覆盖ASM:
df -h查不到ASM空间,要用ASMCMD lsdg监控FREE_MB,否则ORA-00257悄无声息卡住归档











