Oracle 19c搭建ADG备库最稳最快方式是RMAN DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE,但必须显式指定NOREDO和NOFILENAMECHECK;主库须满足归档模式、FORCE LOGGING启用、已建Standby Redo Log三项硬性条件。主库必须开归档+强制日志,备库必须用RMAN DUPLICATE ACTIVE + NOREDO,否则同步链路从第一步就断了。
主库归档与FORCE LOGGING不是可选,是硬门槛
很多生产环境卡在第一步:主库看似开了归档,但force_logging是no。这会导致部分dml不写重做流,备库应用时直接报ora-00344或ora-16057,数据静默丢失。
验证命令必须跑全:
SELECT log_mode, force_logging FROM v$database;
输出必须是ARCHIVELOG和YES。若force_logging为NO,需在MOUNT状态下执行ALTER DATABASE FORCE LOGGING,再OPEN——仅ALTER SYSTEM无效。
- 归档路径建议用FRA(
db_recovery_file_dest),避免手工管理归档目录权限问题 -
log_archive_dest_1设为LOCATION时,务必确认目录存在且oracle用户有读写权限 - 别信“安装时默认开了归档”——
archive log list才是唯一可信依据
RMAN DUPLICATE必须用ACTIVE + NOREDO,否则备库起不来
物理备库搭建最常见失败点:误用FROM BACKUPSET或漏掉NOREDO。主库在线时,RMAN若尝试传输并应用在线日志(即没加NOREDO),必然失败,报错ORA-19505或卡在恢复阶段。
正确命令模板(注意顺序和关键词):
RMAN> CONNECT TARGET sys/password@primary_db<br>RMAN> CONNECT AUXILIARY sys/password@standby_db<br>RMAN> DUPLICATE TARGET DATABASE FOR STANDBY<br> FROM ACTIVE DATABASE<br> DORECOVER<br> NOFILENAMECHECK<br> NOREDO;
-
FROM ACTIVE DATABASE表示直连主库实时拷贝,要求TNS通、密码文件已复制、db_unique_name主备不同 -
NOFILENAMECHECK绕过文件路径冲突检查,否则备库因目录不存在直接报ORA-01180 - 别用
SPFILE参数覆盖——RMAN会自动根据目标库生成适配的备库参数文件
备库启动MRP前,三个配置必须手动确认
DUPLICATE成功不代表同步就通了。常见现象:MRP进程启动后立刻挂起,V$ARCHIVE_GAP查不到缺口,但SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY里MRP状态是WAIT_FOR_LOG。
根源通常是这三个配置没改:
-
standby_file_management必须设为AUTO:ALTER SYSTEM SET standby_file_management=AUTO SCOPE=BOTH;否则主库加数据文件,备库报ORA-01111 - 备库
LOG_ARCHIVE_DEST_2必须指向主库,且VALID_FOR设为(ONLINE_LOGFILES,PRIMARY_ROLE),否则日志传不过去 - 主库
LOG_ARCHIVE_CONFIG要包含双方db_unique_name,例如'DG_CONFIG=(orcl_primary,orcl_standby)',否则备库无法注册到Data Guard配置中
Observer不能多实例,但单实例容易静默失效
想靠起两个dgmgrl observer来“高可用”,结果是脑裂风险翻倍。Oracle官方明确限制START OBSERVER第二次执行必报ORA-16672。
真正有效的做法是加固单observer的运行环境:
- TNSNAMES.ORA里主备服务名必须用真实IP或SCAN VIP,禁用
localhost或127.0.0.1——否则observer根本连不上远端库 - observer所在主机的
$ORACLE_HOME必须和主备库完全一致(含RU补丁号),否则DGMGRL解析dgbroker.ora时可能触发ORA-16501 - 启动用户对
$ORACLE_HOME/dbs要有写权限,否则observer无法生成临时控制文件,进程无报错但实际不工作
最常被忽略的是observer的健康探测逻辑——它不主动上报心跳,只依赖外部监控定期ps -ef | grep observer + telnet其监听端口(默认8888),缺一不可。


















