db_unique_name必须主备不同且与log_archive_config中名称严格一致,否则无法识别角色;主库log_archive_dest_2的db_unique_name须指向备库名,反之亦然。

db_unique_name 必须不同,否则 log_archive_config 无法识别主备角色 —— 这是单机双实例 DG 最容易卡住的第一步。
单台服务器上跑两个 Oracle 实例做 Data Guard,本质是“伪物理备库”,不依赖网络隔离,但对参数隔离、目录结构、监听配置要求更严。它适合快速验证日志传输、switchover 流程和 Broker 基本行为,不能替代真实异地容灾测试。
必须确保两个实例的 db_unique_name 和监听服务名完全独立
Oracle 不允许同一主机上两个实例共用 db_unique_name,哪怕 SID 不同也不行。log_archive_config='DG_CONFIG=(prim,standby)' 里的名字必须和各自实例的 db_unique_name 严格一致,且不能与 db_name 相同(除非你真打算做 snapshot standby)。
- 主库实例:设
db_unique_name=orcl_prim,service_name=orcl_prim,监听中GLOBAL_DBNAME=orcl_prim - 备库实例:设
db_unique_name=orcl_stby,service_name=orcl_stby,监听中GLOBAL_DBNAME=orcl_stby - 两个实例的
ORACLE_SID也需不同(如orcl1/orcl2),且$ORACLE_HOME/dbs下的密码文件名必须匹配对应 SID(orapworcl1、orapworcl2) -
tnsnames.ora中两个服务名不能指向同一个SID,否则log_archive_dest_2='SERVICE=orcl_stby'会连错实例
log_archive_dest_2 指向本地监听服务,不是 localhost:1521
很多人写成 'SERVICE=localhost:1521/orcl_stby',这是错的 —— Oracle 的 SERVICE 参数只认 tnsnames.ora 里定义的服务名,不支持 host:port 写法。它会尝试用默认端口连 localhost,但实际监听可能绑在 127.0.0.1 或具体网卡 IP 上,导致 TNS-12514。
- 正确做法:在
$ORACLE_HOME/network/admin/tnsnames.ora中为备库定义完整条目,例如:ORCL_STBY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl_stby) ) ) - 然后主库设置:
ALTER SYSTEM SET log_archive_dest_2='SERVICE=ORCL_STBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_stby'; - 注意端口要错开:主库监听用 1521,备库监听用 1522,避免冲突;两套
listener.ora文件需分别管理(建议用不同LISTENER名,如LISTENER_PRIM/LISTENER_STBY)
备库控制文件必须用 FOR STANDBY 创建,不能直接复制
单机环境下最容易省略这步:直接把主库 control01.ctl 复制过去,结果启动时报 ORA-01102 或 ORA-19802(control file not from standby database)。因为普通控制文件不含 standby 所需的 thread 和 archive log 位置元数据。
- 主库执行:
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby_control01.ctl'; - 复制到备库对应路径(如
$ORACLE_BASE/oradata/orcl_stby/control01.ctl),并确保所有控制文件副本都替换(control02.ctl等也要同步生成) - 备库启动时必须用
STARTUP NOMOUNT→ALTER DATABASE MOUNT STANDBY DATABASE;,不能OPEN - 如果后续要用 ADG(Active Data Guard),还需提前在备库创建 standby redo logs,组数 ≥ 主库 online redo log 组数 + 1
单机双实例 DG 的核心矛盾在于:Oracle 认为“同一主机上的两个实例天然共享存储和故障域”,所以很多保护机制(比如 FAL_SERVER 自动推断、Broker 的 instance failover 判断)会失效或行为异常。真正要注意的不是“能不能跑起来”,而是哪些功能它根本不会触发 —— 比如 switchover 时 Broker 不会检查网络连通性(因为它是本地 loopback),failover 后也不会自动清理主库残留进程。这些细节,只有在切换后观察 v$archive_dest_status 和 MRP 进程状态才能暴露出来。











