不能只靠脚本轮询sql查询结果实现可靠报警,因其易漏报、延迟高、无法区分抖动与故障且不感知data guard broker状态;v$archive_dest_status刷新延迟、status='valid'不保证日志已应用、error为空不等于同步正常,且完全不反映mrp进程、real-time apply或scn卡顿状态。
不能只靠脚本轮询 sql 查询结果来实现可靠报警——它容易漏报、延迟高、无法区分瞬时抖动和真实故障,且不感知 data guard broker 状态变化。
为什么 v$archive_dest_status 查询结果不可直接用于生产报警
很多人用 SELECT status, error FROM v$archive_dest_status WHERE dest_id = 2 判断日志传输是否异常,但这个视图刷新有延迟(默认 5–15 秒),且 status = 'VALID' 不代表日志已应用,只表示归档路径可写;error 字段为空也不等于同步正常——比如网络中断后监听未恢复,该字段可能仍为空,但 log_archive_dest_2 实际已断连。
更关键的是:v$archive_dest_status 完全不反映 Real-Time Apply 状态、MRP 进程是否存活、或备库是否卡在某个 SCN。它只管“发没发出去”,不管“收没收到”“用没用上”。
- 依赖该视图的脚本,在备库监听崩溃但主库仍能连通时,会持续显示
VALID,导致告警失效 - 查询需
SYSDBA权限,脚本中硬编码密码存在安全风险 - 单次查询无法判断趋势(如延迟从 0s 涨到 120s 再回落,是抖动还是开始积压?)
真正可用的 Shell 报警必须结合 dgmgrl 和系统级检查
Oracle 官方推荐路径是通过 dgmgrl 连接 Broker 获取权威状态,再辅以进程、端口、日志时间戳等交叉验证。Broker 的 SHOW DATABASE VERBOSE 输出包含 Transport Lag、Apply Lag、Observer Ready 等关键字段,且毫秒级准确。
一个最小可行报警脚本应包含以下三步检查:
- 执行
dgmgrl / "SHOW DATABASE VERBOSE 'standby_db'",提取Apply Lag行,用正则匹配(\d+) minutes? (\d+) seconds?,超过阈值(如 5 分钟)触发告警 - 用
ps -ef | grep ora_mrp0检查备库 MRP 进程是否存在;若不存在,说明 Real-Time Apply 已停,比 lag 值更紧急 - 用
nc -z standby.db.com 1521 && tnsping standby_db验证主库能否连通备库监听;失败则立刻告警,不等 lag 上升
注意:dgmgrl 必须用 /(操作系统认证)方式连接,避免密码明文;若必须远程调用,需配置 SSH 免密并限制目标用户权限。
常见误配导致脚本永远不告警
很多脚本在测试环境跑通,上线就失效,核心原因不是逻辑错,而是环境没对齐:
-
ORACLE_HOME和PATH在 crontab 中未显式设置,导致dgmgrl找不到命令或链接错误版本的库 - Broker 配置里
StaticConnectIdentifier指向了主机名,但脚本运行主机的/etc/hosts或 DNS 未解析该名,dgmgrl连接超时却未捕获错误码 - 脚本用
sqlplus / as sysdba查v$dataguard_stats,但该视图在备库 OPEN READ ONLY 状态下不可查(需先ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE) - 告警发送用
mail命令,但服务器未装mailx或未配置 SMTP,日志里只有 “sendmail: command not found”,无人发现
observer 日志才是故障第一现场
当 Fast-Start Failover 卡住或自动切换失败时,$ORACLE_HOME/rdbms/log/drc*.log 比任何脚本输出都早 30 秒以上记录根本原因。比如:
日志中出现 ORA-16664: unable to receive response from database "standby_db",说明 observer 能连主库但收不到备库心跳——这时你的 Shell 脚本还在等 Apply Lag 超阈值,而真实问题已是网络层中断。
务必把 tail -n 50 $ORACLE_HOME/rdbms/log/drc*.log | grep -E "(ORA-|ERROR|FAIL)" 加入每小时巡检任务,而不是只依赖实时监控脚本。











