validate database比show database verbose更值得先跑,因其主动触发Broker与数据库全量状态协商,强制刷新缓存、暴露真实阻塞点;成功则问题自愈,失败则错误直指根因如连通性、角色或监听异常。
validate database命令为什么比show database verbose更值得先跑
因为validate database会主动触发broker与数据库的全量状态协商,而show database verbose只是静态读取元数据快照。很多“不一致”其实是broker缓存未刷新或dmon通信卡顿导致的假阳性,validate database能强制重拉真实值、暴露真正阻塞点。
执行后若返回Success,说明问题已自动修复;若报错,则错误信息直接指向根因(比如连不上库、角色异常、监听未注册),比手动猜字段高效得多。
- 必须在
dgmgrl连接到配置中的主库或备库后执行,不能在本地空连 - 如果配置里有多个备库,要对每个
database单独validate,Broker不会批量扫 - RAC环境需确保所有实例都在线且
dg_broker_start=TRUE,否则validate可能只连到一个节点就返回失败
validate失败时最常卡在哪几个地方
报错信息里带ORA-16620或ORA-16625,基本锁定三类硬性依赖没满足:
-
tnsping不通StaticConnectIdentifier指定的服务名——查lsnrctl status输出里有没有_DGMGRL后缀的服务,且状态是READY;12.1.0.2+用Oracle Restart/RAC时可省静态注册,但必须确认crsctl stat res -t | grep dgmgrl有运行中资源 -
ps -ef | grep dmon没进程,或show parameter dg_broker_start显示FALSE——注意scope要是BOTH,否则重启即失效 - 数据库处于
RESTRICTED模式或未OPEN/MOUNT——RESTRICTED会拒绝dmon连接,哪怕SQL*Plus能进
validate通过但Warning还在,说明真有属性不一致
这时才该切回show database verbose,重点盯InconsistentProperties和InconsistentLogXptProps两栏。常见陷阱:
-
ArchiveLagTarget在spfile里是60,Broker元数据存的是0:必须用edit database ... set property改Broker值,不能只改spfile——Broker不自动同步参数变更 -
StandbyArchiveLocation在RAC主库上是实例级属性:得用edit instance orcl1 on database orcl set property StandbyArchiveLocation=...,用edit database会报ORA-16582 -
LogArchiveFormat这类参数在备库spfile里是(missing):需先在SQL*Plus里ALTER SYSTEM SET LogArchiveFormat='...' SCOPE=BOTH,再edit database同步Broker值
为什么有时候enable configuration后Warning又回来
因为enable configuration只是激活Broker控制流,并不刷新属性一致性。真正起作用的是Broker后台每15秒一次的轮询——如果某次轮询时数据库刚好没响应(比如归档满、I/O卡顿),Broker就会把上次成功读到的值当“真实值”,和元数据比对后重新标为不一致。
这种波动型Warning不用急着修,观察连续3次validate database是否都成功;如果持续存在,再检查v$dataguard_stats里transport lag和apply lag是否真实上涨,避免把性能抖动误判成配置问题。











