必须双向配置tnsnames.ora,主库配备库服务名、备库配主库服务名,否则DG日志传输中断、switchover失败;备库NOMOUNT时依赖listener.ora静态注册,GLOBAL_DBNAME须设为DB_UNIQUE_NAME;sqlnet.ora需统一配置超时参数防半开连接。
tnsnames.ora 必须在主库和备库两端都配对写
只在主库配 tnsnames.ora、备库不配,或者反过来,会导致 data guard 启动失败、日志传输中断、甚至 alter database recover managed standby database 报 ora-12154: tns:could not resolve the connect identifier specified。这不是“能连就行”的问题,而是 dg 内部组件(如 lgwr、rfs、mrp)依赖服务名做双向通信。
关键点:主库要能通过服务名连到备库(用于传输日志),备库也要能通过服务名连回主库(用于查询控制文件、验证角色切换路径、某些 Broker 操作)。两者服务名可以不同,但必须各自可解析。
- 主库
tnsnames.ora中至少定义一个指向备库的服务名,例如STBY,ADDRESS填备库监听 IP 和端口,SERVICE_NAME填备库的service_names(不是db_name) - 备库
tnsnames.ora中至少定义一个指向主库的服务名,例如PRIM,ADDRESS填主库监听 IP 和端口,SERVICE_NAME填主库的service_names - 服务名本身无强制命名规则,但建议语义清晰,避免用
ORCL这类泛化名,防止后续扩多套 DG 时混淆
listener.ora 静态注册不能少,尤其备库启动到 nomount 时
备库在 NOMOUNT 状态下无法动态注册服务——因为实例还没读控制文件,service_names 为空。此时如果 listener.ora 没配静态注册,RFS 进程根本连不上监听器,日志收不到,SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY 里看不到 RFS 行。
静态注册只需在 SID_LIST 里声明实例名和 ORACLE_HOME,不依赖数据库状态:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl_stby) <!-- 备库全局数据库名,应与 DB_UNIQUE_NAME 一致 -->
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SID_NAME = orcl_stby)
)
)- 主库也建议配静态注册,虽然它通常能动态注册成功,但故障切换后角色互换,原主库变备库,若没静态注册会立刻掉链路
-
GLOBAL_DBNAME推荐设为DB_UNIQUE_NAME,而非DB_NAME,避免主备同名冲突 - 改完
listener.ora必须执行lsnrctl reload,stop/start不必要且有连接中断风险
sqlnet.ora 的超时和重试参数直接影响 DG 稳定性
默认的 sqlnet.ora 不设超时,一旦网络抖动或防火墙中断空闲连接,LGWR 或 RFS 可能卡住数分钟才报错,造成归档 GAP。生产环境必须显式配置:
-
SQLNET.EXPIRE_TIME = 10:每 10 分钟发探测包,及时发现断连 -
SQLNET.RECV_TIMEOUT = 60:接收阻塞超过 60 秒就中断,防 RFS 卡死 -
SQLNET.SEND_TIMEOUT = 60:发送同理 -
SQLNET.INBOUND_CONNECT_TIMEOUT = 60:限制新连接建立耗时,防 DoS 类攻击影响 DG 流程
这些参数需在主、备两端 $ORACLE_HOME/network/admin/sqlnet.ora 中同时存在,且值一致。不一致不会报错,但可能导致一端快速断开、另一端还在等,出现“半开连接”状态。
tnsping 和 sqlplus 连接测试必须分方向、分用户验证
tnsping STBY 成功 ≠ 能真正建会话。它只测监听器可达性,不校验服务名是否注册、用户权限、密码文件是否同步。真实问题常出在后者。
务必按以下顺序逐项验证:
- 主库上:
tnsping STBY→sqlplus sys@STBY AS SYSDBA(用密码文件认证,非 OS 认证) - 备库上:
tnsping PRIM→sqlplus sys@PRIM AS SYSDBA - 两台机器都执行:
lsnrctl status,确认输出中包含对应服务名(如orcl_stby)且状态为READY,不是UNKNOWN - 检查
V$DATABASE中DB_UNIQUE_NAME和OPEN_MODE:备库应为MOUNTED,主库为READ WRITE
最容易被忽略的是密码文件同步——主备 orapw<sid></sid> 必须完全一致,且备库密码文件需在 NOMOUNT 时就已存在。否则 sqlplus sys@PRIM AS SYSDBA 会报 ORA-01017: invalid username/password,即使密码没错。


















