
关于《运维踩坑记》这是一个没有固定更新计划的系列。每一次遇到值得记录的异常、报错或诡异现象,处理完之后就随手记下来——可能是一个 SQL 的语法陷阱,可能是一次网络抖动的排查,也可能是一个配置参数的误解。没有刻意安排,遇到了就写,写完了就沉淀。如果这些记录能帮你在未来的某个深夜少走一段弯路,那这个系列就有了它存在的意义。本期是第 14 期:一次Oracle 物理备库的“起死回生”:从故障停机到 ADG 实时同步的完整排查之旅。欢迎阅读,也欢迎交流。摘要某日,业务方反馈备库无法连接,监控系统显示数据库服务异常。经过近两个小时的排查与恢复,最终不仅让备库重新上线,还成功切换至Active Data Guard(ADG)模式,实现了只读查询与实时同步并行的理想状态。本文将从故障现象、排查思路、关键决策点、操作步骤、踩坑复盘等维度,完整还原此次故障处理的全过程,希望能为运维同行提供一份有价值的参考。一、业务背景与故障初现1.1 环境简介这套环境是一套典型的Oracle Data Guard 容灾架构:角色说明主库生产核心库,承载读写业务备库物理备库,原计划承担只读报表查询,减轻主库压力预期模式Active Data Guard(只读打开 + 实时同步)然而理想很丰满,现实很骨感。某日早上,业务方反馈备库连接超时,一套关键的报表任务全部失败。1.2 初始症状登录服务器后,执行最基础的检查:# 检查Oracle进程ps-ef|grepora_|grep-vgrep# 没有任何输出 —— 数据库实例未启动# 检查监听lsnrctl status# -bash: lsnrctl: command not found初步判断:数据库实例已停止;监听服务不可用;环境变量未正确加载。二、第一阶段:环境识别与“多实例迷局”2.1 多个 Oracle 主目录的困惑首先需要找到lsnrctl命令的位置。系统里有多个 Oracle 相关目录:find/-namelsnrctl2/dev/null输出显示存在多个lsnrctl,分别位于不同的ORACLE_HOME下——说明这套服务器上安装了多套 Oracle 产品。2.2 通过/etc/oratab确定目标cat/etc/oratab输出显示该服务器配置了三个实例(实例名、路径均已泛化):实例名ORACLE_HOME说明+ASM1/opt/gridASM 实例inst_a/opt/oracle/product/11g/db_1业务实例一target_db/opt/oracle/product/11g/db_2目标备库实例需要恢复的正是target_db实例。2.3 配置环境变量exportORACLE_HOME=/opt/oracle/product/11g/db_2exportPATH=$ORACLE_HOME/bin:$PATH