active data guard备库默认不生成awr快照,因statistics_level=basic且mmon进程在只读模式下禁用;启用需满足三条件:处于adg模式、statistics_level设为typical/all、主备双向dblink连通且sys$umf用户解锁。

Active Data Guard备库默认不生成AWR快照,直接运行awrrpt.sql会报错或返回空报告——这不是权限或脚本问题,而是因为备库的STATISTICS_LEVEL默认为BASIC,且AWR相关后台进程(MMON)在只读模式下被禁用。
为什么备库默认不能生成AWR报告
物理备库(PHYSICAL STANDBY)在READ ONLY WITH APPLY状态下,Oracle禁止自动收集AWR快照:
- MMON进程不启动,DBA_HIST_*视图无新数据写入
- 即使手动执行DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT,也会报ORA-16000(数据库只读)
- STATISTICS_LEVEL= BASIC是默认值,AWR、ASH、ADDM全部关闭
- 备库的V$DATABASE中OPEN_MODE为READ ONLY WITH APPLY,不是READ WRITE,无法触发快照逻辑
启用备库AWR必须满足的三个条件
缺一不可,否则报告始终为空或报错:
- 备库必须处于
ACTIVE DATA GUARD模式(即OPEN READ ONLY WITH APPLY),而非传统物理备库 -
STATISTICS_LEVEL需设为TYPICAL或ALL(仅改参数不够,还需解锁SYS$UMF用户并配置DBLINK) - 主库与备库之间需建立双向
DBLINK,且SYS$UMF用户在双方均解锁并拥有SELECT_CATALOG_ROLE和EXECUTE_CATALOG_ROLE
实际操作步骤(以12c+ Active DG为例)
以下命令需按顺序执行,跳过任一环节都会导致awrrpt.sql生成空报告或报ORA-01403: no data found:
- 在主库执行:
ALTER USER sys$umf IDENTIFIED BY your_pwd ACCOUNT UNLOCK; - 在主库创建指向备库的DBLINK:
CREATE DATABASE LINK dbl_primary_to_standby CONNECT TO sys$umf IDENTIFIED BY your_pwd USING 'standby_tns'; - 在备库创建指向主库的DBLINK:
CREATE DATABASE LINK dbl_standby_to_primary CONNECT TO sys$umf IDENTIFIED BY your_pwd USING 'primary_tns'; - 在备库执行:
ALTER SYSTEM SET STATISTICS_LEVEL=TYPICAL SCOPE=BOTH;(重启实例非必需,但需确保生效) - 验证是否就绪:
SELECT * FROM v$database@dbl_primary_to_standby;和SELECT * FROM v$database@dbl_standby_to_primary;都应成功返回
完成后,在备库SQL*Plus中运行@?/rdbms/admin/awrrpt.sql,选择目标实例时输入standby_instance_name(不是primary),即可生成真实备库的AWR报告。
常见报错及对应修复点
遇到这些错误,基本可定位到具体缺失环节:
-
ORA-16000: database open for read-only access→ 未启用Active Data Guard,或备库仍处于MOUNT状态 -
ORA-01403: no data found→SYS$UMF用户未解锁,或DBLINK连通性失败(用SELECT instance_name FROM v$instance@dbl_xxx测试) - AWR报告中“Load Profile”全为0 →
STATISTICS_LEVEL仍是BASIC,或未等待至少两个快照周期(默认每小时一次,首次报告需等满1小时) - 报告里出现主库指标而非备库 → 运行
awrrpt.sql时误选了主库实例名,或DBLINK反向查询路径失效
真正麻烦的不是步骤多,而是每个环节都依赖前序状态——比如DBLINK不通,STATISTICS_LEVEL再高也没用;SYS$UMF密码错了,DBLINK就永远连不上。建议把四步验证(用户、DBLINK、参数、快照时间)做成检查清单,逐项确认。











