WARNING状态本质是配置项与实际运行值不一致,DG Broker显示ORA-16792等警告仅表示元数据与真实参数/状态不符,并非服务中断;需用show database verbose定位InconsistentProperties、InconsistentLogXptProps等具体不一致项,再通过检查数据库状态、dmon进程、监听注册及spfile设置逐项修复。
Warning状态本质是配置项与实际运行值不一致
dg broker显示warning(比如ora-16792、ora-16809)不代表服务中断,而是broker发现某项数据库属性在元数据中声明的值,和当前数据库真实参数/状态对不上。它不报错,但拒绝自动修正——这是设计使然,防止误覆盖人工调整过的设置。
关键点在于:show configuration只告诉你“有警告”,而show database verbose <db_name>才暴露具体哪几项不一致。必须用这个命令,否则永远在猜。
用show database verbose定位具体不一致项
执行后重点看三类字段:
-
InconsistentProperties:如(monitor),说明Broker元数据里该属性被设为“由observer监控”,但实际没启observer或observer未连上 -
InconsistentLogXptProps:常见于LogXptMode(传输模式)、NetTimeout等网络相关参数,在主备库spfile中未显式设置,导致Broker读到的是默认值,而元数据存的是你手动edit database改过的值 -
LogXptStatus、RecvQEntries等带(monitor)标记的字段:表示Broker无法从数据库实时拉取该指标,通常因数据库未open/mount、dmon进程异常、或监听未注册_DGMGRL服务
示例输出片段:
Properties: LogXptMode = 'ASYNC' InconsistentLogXptProps = '(monitor)' LogXptStatus = '(monitor)'
这说明Broker想查LogXptStatus确认传输是否正常,但查不到——不是传输真坏了,而是Broker连不上数据库的dmon进程。
修复不一致项的实操路径
不能靠edit database硬覆盖,得先让Broker能“读到真实值”:
- 确认数据库处于
OPEN或MOUNT状态(RESTRICTED会阻断dmon通信) - 检查
ps -ef | grep dmon,确保dg_broker_start=TRUE且进程存活 - 验证
tnsping <StaticConnectIdentifier>(注意看show database verbose输出里的StaticConnectIdentifier字段)能否通——不通就查监听是否配了GLOBAL_DBNAME=xxx_DGMGRL条目 - 若某参数(如
DelayMins)在spfile里是空的,Broker元数据却写了'30',则需在SQL*Plus中执行:ALTER SYSTEM SET DelayMins=30 SCOPE=BOTH;,再enable configuration同步
最容易被忽略的坑:监听日志才是真相源头
90%的(monitor)类警告,根源不在数据库参数,而在监听拒绝Broker连接。别急着改spfile,先看$ORACLE_HOME/network/log/listener.log:
- 搜索
TNS-12514:说明监听收到Broker连接请求,但没注册xxx_DGMGRL服务名 - 搜索
UNKNOWN状态的服务:如Service "test_DGMGRL" has 1 instance(s). Instance "test", status UNKNOWN,代表监听知道这个服务名,但数据库没向它注册——此时lsnrctl services看不到该服务,要检查local_listener参数是否指向正确监听,或重启dmon
不翻监听日志,光看show database verbose输出的(monitor),就像修车只听发动机声音却不掀引擎盖。










