tnsnames.ora中主库服务名必须配置双节点vip并启用failover=on,确保dg日志传输高可用;备库service_name需与db_unique_name一致,global_dbname须严格匹配,否则报ora-12514。

tnsnames.ora 里必须配全主库两个节点的 VIP 或 SCAN,不能只写一个
单实例 DG 备库要连主库做日志传输,log_archive_dest_2 里写的 SERVICE=xxx 最终会查 tnsnames.ora。如果只配了一个节点地址,归档传输可能在某个节点宕机或监听异常时失败,尤其当主库用的是 RAC 默认的负载均衡连接方式时。
正确做法是让每个服务名都包含双地址,并显式指定 (LOAD_BALANCE=off) 或 (FAILOVER=on) —— 实际中更推荐后者,避免因顺序问题导致连接卡住:
-
ORCL(主库服务名)应指向两个节点 VIP:(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))和(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521)) - 加上
(FAILOVER=on)和(CONNECT_DATA=(SERVICE_NAME=orcl)(FAILOVER_MODE=(TYPE=select)(METHOD=basic))),确保 SQL*Net 层能自动切到可用节点 - 备库自己的服务名(如
ORCLDG)只需配本机 IP + 端口,但SID_NAME必须和备库实际启动的实例名一致(比如orcldg),否则ALTER DATABASE RECOVER MANAGED STANDBY DATABASE会报 ORA-12514
备库 listener.ora 的 GLOBAL_DBNAME 必须匹配 DB_UNIQUE_NAME,不是 DB_NAME
很多人把 GLOBAL_DBNAME 写成 orcl(主库 db_name),结果备库监听起来后,主库用 tnsping orcldg 能通但连接时报 ORA-12514:TNS:listener does not currently know of service requested。
根本原因是 Data Guard 日志传输依赖静态注册,而 Oracle 在静态注册时只认 GLOBAL_DBNAME 和备库的 db_unique_name 是否一致:
- 检查备库当前
db_unique_name:SELECT db_unique_name FROM v$database;,假设是orcldg - 则
listener.ora中SID_DESC下的GLOBAL_DBNAME必须设为orcldg,不是orcl,也不是orcldg.localdomain -
ORACLE_HOME路径要指向 Oracle 数据库存储软件路径(不是 Grid Home),SID_NAME必须和ORACLE_SID环境变量值完全一致(大小写敏感)
主库 tnsnames.ora 里要不要加 INSTANCE_NAME?看是否需要定向连接
默认情况下,主库两个节点都注册了同一个 SERVICE_NAME,所以 tnsnames.ora 里不写 INSTANCE_NAME 是 OK 的——日志传输走的是后台进程,不关心具体连哪个实例。
但如果你在主库上手动测试归档发送(比如 ALTER SYSTEM ARCHIVE LOG CURRENT 后查 v$archive_dest_status),或者要用 SQL*Plus 连接主库做故障模拟,就容易遇到连接被路由到非预期节点的问题:
- 想强制连节点 1?加
(INSTANCE_NAME=orcl1)到对应地址的CONNECT_DATA块里 - 想保留负载均衡又支持手动切换?建议额外定义一个带
INSTANCE_NAME的别名,比如ORCL1和ORCL2,主用ORCL,调试用单独别名 - 注意:RAC 中
INSTANCE_NAME默认是DB_NAME+ 序号(如orcl1),不是SID;查v$instance确认真实值
tnsping 能通 ≠ 归档能传,必须验证 SERVICE_NAME 是否被监听器真正识别
tnsping orcldg 返回 OK 只说明网络层通、监听进程活着,不代表它真能接受 DG 连接。常见漏检点:
- 监听器没 reload:
lsnrctl reload比stop/start更安全,避免中断已建立连接 - 监听器日志里有没有
TNS-12514或Service "orcldg" has 1 instance(s)这类行?查$ORACLE_HOME/network/log/listener.log - 用
lsnrctl services看输出里是否有Service "orcldg"且状态是READY,而不是UNKNOWN - 主库执行:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER;→ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;,触发一次重连,再查v$archive_dest_status.error
最易忽略的是:备库监听器配置完后,忘了用 oracle 用户而非 grid 用户启动,或者 ORACLE_HOME 指向了 Grid Home 导致 SID 注册失败——这个错不会报在日志开头,得翻到底部找 “TNS-01155” 类提示。











