v$database_role_history视图在Oracle 19c中并不存在,是用户误记;真实切换记录需从alert.log、drc.log日志或dba_logstdby_events(仅逻辑备库)中提取,或自建表+触发器捕获。
v$database_role_history 视图在 oracle 19c 中并不存在 —— 它是常见误解,实际官方文档和实测均证实该视图从未被 oracle 实现过。
为什么查不到 v$database_role_history
Oracle Data Guard 没有内置的、持久化存储角色切换历史的动态性能视图。所谓 v$database_role_history 是部分用户误记或混淆了 v$dataguard_stats、v$archive_dest_status 或 RMAN 备份元数据中的时间戳字段。19c 的 gv$database 和 v$database 只反映当前角色,不保留变更记录。
替代方案:从告警日志和 Data Guard Broker 日志中提取
真实可操作的切换痕迹只存在于文本日志中,需人工或脚本解析:
- 主备库各自的
alert_<sid>.log</sid>文件里会记录Switchover to standby completed或Switchover to primary completed行,附带精确时间戳 - 若启用 Data Guard Broker(
DG_BROKER_START=TRUE),则$ORACLE_HOME/rdbms/log/drc<dbname>.log</dbname>中有结构化操作日志,含SWITCHOVER命令、执行者、耗时、结果状态 - 使用
grep -i "switchover\|role.*change" /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log快速定位
用 dba_logstdby_events 查 ADG 切换辅助事件(仅限逻辑备库)
物理备库(如本文场景)不生成该视图数据;但如果你启用了逻辑备库(LogMiner-based),可查:
SELECT event_time, status, event FROM dba_logstdby_events WHERE event LIKE '%SWITCHOVER%' ORDER BY event_time DESC;
注意:dba_logstdby_events 不适用于标准物理 DG 环境,强行查询将返回空集。
最可靠的方式:自己建表 + DDL 触发器捕获
如果必须审计切换行为,建议在主库创建轻量级日志表并绑定触发器:
CREATE TABLE dg_switchover_log (
id NUMBER GENERATED BY DEFAULT AS IDENTITY,
role_before VARCHAR2(20),
role_after VARCHAR2(20),
op_time TIMESTAMP DEFAULT SYSTIMESTAMP,
host_name VARCHAR2(64)
);
CREATE OR REPLACE TRIGGER tr_dg_role_change
AFTER STARTUP ON DATABASE
DECLARE
l_role v$database.database_role%TYPE;
BEGIN
SELECT database_role INTO l_role FROM v$database;
IF l_role IN ('PRIMARY', 'PHYSICAL STANDBY') THEN
INSERT INTO dg_switchover_log (role_before, role_after, host_name)
VALUES (SYS_CONTEXT('USERENV','HOST'), l_role, SYS_CONTEXT('USERENV','HOST'));
END IF;
EXCEPTION WHEN OTHERS THEN NULL;
END;
该触发器在每次实例启动后检查当前角色,虽不能捕获“切换中”的瞬态,但能准确记录最终生效的角色状态及时间 —— 这才是业务真正依赖的落地点。
真正关键的不是“谁在哪天切过”,而是“当前角色是否稳定、日志是否连续、MRP 是否 RUNNING”。把精力放在 v$dataguard_process 和 v$archive_gap 的实时监控上,比翻日志找历史更有效。


















