(注:原文开头插入了“你是风儿我是沙,点点蓝字到天涯”的引流动图,该图与公众号关注提示相关,属于引流图,已按要求删除。)
前言
AWR(Automatic Workload Repository,自动工作负载信息库/自动工作集负载信息库) 是达梦 DM8 内置的性能数据采集与历史分析基础设施。它的核心动作只有一句话:系统按固定间隔,为库内重要统计信息和负载信息做一次快照,并把快照持久化保存。
- 快照是数据库在某一时间点的只读静态镜像,通过检索快照可以还原源库在快照创建时刻的数据状态。
- AWR 默认关闭,不是开库即用。
- AWR 报告面向系统级时间窗分析;它不是实时监控,也不是会话级明细工具。
0. AWR 原理流程
【第一步 开启】
SP_INIT_AWR_SYS(1)
├─ 创建 DBMS_WORKLOAD_REPOSITORY 系统包
└─ 默认创建 SYSAUX 表空间(数据文件 SYSAWR.DBF)用于存放快照
└─ 包被删除时,SYSAUX 表空间也一并删除
【第二步 设定节奏】
DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(N)
├─ 单位:分钟
├─ 缺省:60 分钟
├─ 范围:10 ~ 525600
├─ 设为 0:关闭快照
└─ 默认快照保留时间:8 天
【第三步 后台采集】
按间隔自动执行(也可手动 CREATE_SNAPSHOT 立即生成)
├─ 对重要统计信息与负载信息打快照
├─ 快照写入 SYSAUX(只读静态镜像)
└─ 快照元数据记录于 WRM$_SNAPSHOT / DBA_HIST_SNAPSHOT
【第四步 区间分析】
选择起始 snap_id 与结束 snap_id
├─ 校验两个快照的 STARTUP_TIME 必须相等
│ └─ 期间不能重启数据库,否则基线断裂、报告无效
├─ 调用 AWR_REPORT_HTML / AWR_REPORT_TEXT 生成区间报告
└─ 报告 = HEAD INFO + Report Summary + Main Report
AWR 相关对象
| 对象 |
用途 |
SYS.WRM$_SNAPSHOT |
快照信息,核对快照连续性与 STARTUP_TIME |
SYS.WRM$_SNAPSHOT_D |
快照明细维度 |
SYS.WRM$_WR_CONTROL |
仓库控制信息(快照间隔等) |
SYS.DBA_HIST_SNAPSHOT |
工作负载仓库快照信息 |
SYS.DBA_TABLESPACES |
确认 SYSAUX 是否已建立 |
SYS.V$SYSSTAT |
AWR 报告主要体现的系统级指标来源 |
SP_INIT_AWR_SYS |
创建/关闭 AWR 系统包 |
DBMS_WORKLOAD_REPOSITORY |
快照管理包(设置间隔、创建快照等) |
SF_CHECK_AWR_SYS |
检查 AWR 系统包启用状态(0 未启用 / 1 已启用) |
1. 开启 DM AWR
达梦数据库 DM8/9 的 AWR 是默认关闭的,需手动初始化后再采集快照、出报告。
SQL> select * from v$version;
BANNER
---------------------------------
DM Database Server 64 V9
DB Version: 0x7000d
03151060506-20260417-322930-20218
Msg Version: 3
Gsu level(5) cnt: 102
SELECT SF_CHECK_AWR_SYS; -- 0 未开,1 已开
CALL SP_INIT_AWR_SYS(1); -- 创建 DBMS_WORKLOAD_REPOSITORY,并建 SYSAUX 表空间
SELECT SF_CHECK_AWR_SYS; -- 应变为 1
SELECT NAME FROM V$TABLESPACE WHERE NAME LIKE '%SYS%'; -- 能看到 SYSAUX

2. 设置快照间隔和保留时间
-- 自动:间隔 60 分钟,保留 7 天(单位都是分钟)
CALL DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(10080, 60);
-- 或者:间隔 30 分钟,保留 30 天(单位都是分钟)
CALL DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(43200, 30);
-- 或只改间隔(分钟),间隔过小会导致 SYSAUX 表空间增长过快,注意磁盘空间
CALL DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(15);
-- 手动打点(压测前/后各打一次)
CALL DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 第1个快照
-- ……业务跑一段时间……
CALL DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); -- 第2个快照
3. 查看快照并出报告
SELECT SNAP_ID, STARTUP_TIME, BEGIN_INTERVAL_TIME, END_INTERVAL_TIME
FROM SYS.WRM$_SNAPSHOT
ORDER BY SNAP_ID;
-- 结果集预览(HTML 文本)
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(1, 2));
-- 写文件(目录需对数据库用户可写)
CALL SYS.AWR_REPORT_HTML(1, 2, '/home/dmdba/awr', 'dm8_awr.html');
-- 文本版:
CALL SYS.AWR_REPORT_TXT(1, 2, '/home/dmdba/awr', 'dm8_awr.txt');
4. 查看 AWR 报告内容
使用浏览器打开 dm8_awr.html 即可看负载、Top SQL、等待事件、IO 等。报告主要分 3 类,报告主要涉及等待事件、SQL 统计、实例活动、IO、缓冲区、撤销、锁、死锁、段活动、字典缓存、库缓存、内存、排序、资源限制、dm.ini 参数、Top SQL with Top Events。核心指标共 9 类:Elapsed Time、CPU Time、Wait Events、Buffer Hit Ratio、SQL Statistics、Top Timed Events、Segment Statistics、Latch and Mutex Statistics、Redo Log Statistics。

查看 ASH 报告相关 SQL
-- 查看 ASH 报告
SELECT * FROM v$active_session_history ORDER BY sample_time DESC LIMIT 4;
-- 1) 活跃会话负载曲线(按小时)
SELECT TO_CHAR(SAMPLE_TIME, 'YYYY-MM-DD HH24') AS T,
COUNT(*) AS SAMPLES,
SUM(CASE WHEN SESSION_STATE = 'ON CPU' THEN 1 ELSE 0 END) AS CPU_SAMPLES,
SUM(CASE WHEN SESSION_STATE = 'WAITING' THEN 1 ELSE 0 END) AS WAIT_SAMPLES
FROM V$ACTIVE_SESSION_HISTORY
WHERE SAMPLE_TIME >= '2026-10-23 15:30:00'
AND SAMPLE_TIME < '2026-10-23 16:40:00'
GROUP BY TO_CHAR(SAMPLE_TIME, 'YYYY-MM-DD HH24')
ORDER BY T;
-- 1b) 负载曲线——EXTRACT 纯数字分桶版(不碰任何格式掩码)
SELECT EXTRACT(YEAR FROM SAMPLE_TIME) AS Y,
EXTRACT(MONTH FROM SAMPLE_TIME) AS MO,
EXTRACT(DAY FROM SAMPLE_TIME) AS D,
EXTRACT(HOUR FROM SAMPLE_TIME) AS H,
COUNT(*) AS SAMPLES,
SUM(CASE WHEN SESSION_STATE = 'ON CPU' THEN 1 ELSE 0 END) AS CPU_SAMPLES,
SUM(CASE WHEN SESSION_STATE = 'WAITING' THEN 1 ELSE 0 END) AS WAIT_SAMPLES
FROM V$ACTIVE_SESSION_HISTORY
WHERE SAMPLE_TIME >= '2026-10-23 15:30:00'
AND SAMPLE_TIME < '2026-10-23 16:40:00'
GROUP BY EXTRACT(YEAR FROM SAMPLE_TIME),
EXTRACT(MONTH FROM SAMPLE_TIME),
EXTRACT(DAY FROM SAMPLE_TIME),
EXTRACT(HOUR FROM SAMPLE_TIME)
ORDER BY Y, MO, D, H;
-- 2) 等待类分布(CPU 样本的 WAIT_CLASS 为空)
SELECT NVL(WAIT_CLASS, 'ON CPU') AS WAIT_CLASS,
COUNT(*) AS CNT
FROM V$ACTIVE_SESSION_HISTORY
WHERE SAMPLE_TIME >= '2026-10-23 15:30:00'
AND SAMPLE_TIME < '2026-10-23 16:40:00'
GROUP BY NVL(WAIT_CLASS, 'ON CPU')
ORDER BY CNT DESC;
-- 3) 等待事件 Top(只看等待样本)
SELECT EVENT, WAIT_CLASS,
COUNT(*) AS CNT,
SUM(WAIT_TIME) AS TOT_WAIT_TIME
FROM V$ACTIVE_SESSION_HISTORY
WHERE SESSION_STATE = 'WAITING'
AND EVENT IS NOT NULL
AND SAMPLE_TIME >= '2026-10-23 15:30:00'
AND SAMPLE_TIME < '2026-10-23 16:40:00'
GROUP BY EVENT, WAIT_CLASS
ORDER BY CNT DESC;
-- 4) 最耗资源的 SQL Top20
SELECT SQL_ID, SQL_OPNAME, TOP_LEVEL_SQL_ID,
COUNT(*) AS CNT
FROM V$ACTIVE_SESSION_HISTORY
WHERE SQL_ID IS NOT NULL
AND SAMPLE_TIME >= '2026-10-23 15:30:00'
AND SAMPLE_TIME < '2026-10-23 16:40:00'
GROUP BY SQL_ID, SQL_OPNAME, TOP_LEVEL_SQL_ID
ORDER BY CNT DESC
LIMIT 20;
-- 5) 最忙会话 / 客户端 Top20
SELECT SESSION_ID, SESSION_SERIAL#, USER_ID, PROGRAM, MACHINE,
COUNT(*) AS CNT
FROM V$ACTIVE_SESSION_HISTORY
WHERE SAMPLE_TIME >= '2026-10-23 15:30:00'
AND SAMPLE_TIME < '2026-10-23 16:40:00'
GROUP BY SESSION_ID, SESSION_SERIAL#, USER_ID, PROGRAM, MACHINE
ORDER BY CNT DESC
LIMIT 20;
-- 6) 单个会话的活动时间线(下钻:把 SESSION_ID 换成目标值)
SELECT SAMPLE_TIME, SESSION_STATE,
NVL(EVENT, '-') AS EVENT, WAIT_CLASS, SQL_ID, SQL_OPNAME
FROM V$ACTIVE_SESSION_HISTORY
WHERE SESSION_ID = 139768772115208
AND SAMPLE_TIME >= '2026-10-23 15:30:00'
AND SAMPLE_TIME < '2026-10-23 16:40:00'
ORDER BY SAMPLE_TIME;
5. 表空间管理
大概测试了一下,14 小时 SYSAUX 表空间自动扩展到了 8GB,快照间隔 15 分钟,保留 7 天,还是很吃磁盘空间的,这个需要合理评估设置。
-- 查询表空间大小
SELECT Upper(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
|| '%' "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM
(SELECT TABLESPACE_NAME,
Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 2 DESC;
-- 查看表空间与数据文件对应关系
SELECT TS.NAME, DF.PATH, DF.TOTAL_SIZE * SF_GET_PAGE_SIZE() / 1024 / 1024 AS TOTAL_MB,
DF.FREE_SIZE * SF_GET_PAGE_SIZE() / 1024 / 1024 AS FREE_MB,
DF.AUTO_EXTEND, DF.NEXT_SIZE AS "NEXT_SIZE(M)", DF.MAX_SIZE / 1024 AS "MAX_SIZE(G)"
FROM V$TABLESPACE AS TS, V$DATAFILE AS DF
WHERE TS.ID = DF.GROUP_ID;
-- 注意:TOTAL_SIZE/FREE_SIZE 的单位是“页”,不是 MB。
-- 查看 SYSAUX 表空间大小
SELECT d.TOTAL_SIZE * SF_GET_PAGE_SIZE() / 1024 / 1024 AS TOTAL_MB,
d.FREE_SIZE * SF_GET_PAGE_SIZE() / 1024 / 1024 AS FREE_MB
FROM V$DATAFILE d
JOIN V$TABLESPACE t ON t.ID = d.GROUP_ID
WHERE t.NAME = 'SYSAUX';
-- 添加数据文件
ALTER TABLESPACE SYSAUX ADD DATAFILE 'SYSAWR02.DBF'
SIZE 2048 AUTOEXTEND ON NEXT 64 MAXSIZE 65536;
-- 或者 resize 原文件大小
ALTER TABLESPACE SYSAUX
RESIZE DATAFILE '/data/dm8/data/DAMENG/SYSAWR.DBF' TO 102400;
-- 或者修改原文件为自动扩展至 maxsize
ALTER TABLESPACE SYSAUX DATAFILE '/data/dm8/data/DAMENG/SYSAWR.DBF'
AUTOEXTEND ON NEXT 64 MAXSIZE 65536;
6. 注意事项
- 关闭会清空快照:
SP_INIT_AWR_SYS(0);
- 起止快照的
STARTUP_TIME 必须相同,中间不能重启。
- 在 SYSDBA 下、在“主库”执行——主备架构,备库只读跑不了初始化。
- 报告输出目录要数据库进程可写;生产上别放 /tmp,放专门的归档目录。
- 页大小 4K 不支持
DBMS_WORKLOAD_REPOSITORY 包相关方法、MPP 环境不支持该包。
- 初始化会建表空间数据文件(SYSAUX),执行前确认数据目录磁盘余量足够、dmdba 有写权限。
- 快照间隔过小会非常占用表空间,频繁创建快照会消耗服务器资源,报告生成本身也会对数据库产生压力,需合理设置。
- 快照数据落在 SYSAUX 表空间,会自动扩展,但该表空间存在 10240MB(10GB)上限,DM9 上限为 16GB;达到上限后快照创建会报空间超限,表现为 snap_id 递增但结束时间为空,此时生成报告可能“显示成功却无输出”。
7. 参考链接
更多信息可查阅达梦官方《DM 系统包使用手册》中 DBMS_WORKLOAD_REPOSITORY 包章节:
https://docs.dameng.com/zh-CN/docs/1/452/109611
或软件安装路径下:
- V8:
$DM_HOME/doc/DM8系统包使用手册.pdf
- V9:
$DM_HOME/doc/Language And Development/DM9-System Packages Manual.pdf
关于达梦 AWR 的配置和 SYSAUX 表空间管理,就先分享到这里。如果你在实际生产环境中也遇到过快照把磁盘撑爆的情况,欢迎到 云栈社区 的国产数据库板块交流踩坑经验,一起把配置参数调得更稳妥。