外观
DM 容量监控
容量监控范围
1. 存储容量监控
存储容量监控是容量监控的核心,包括表空间、数据文件、日志文件等的使用情况监控。
2. 内存容量监控
内存容量监控用于监控数据库内存的使用情况,包括缓冲区、共享内存、会话内存等。
3. CPU容量监控
CPU容量监控用于监控CPU的使用情况,包括系统CPU使用率、用户CPU使用率等。
4. 会话容量监控
会话容量监控用于监控数据库会话的使用情况,包括当前会话数、最大会话数等。
5. 事务容量监控
事务容量监控用于监控数据库事务的使用情况,包括活跃事务数、事务响应时间等。
存储容量监控
1. 表空间监控
sql
-- 表空间使用情况监控
SELECT T.NAME AS TABLESPACE_NAME,
ROUND(T.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS TOTAL_MB,
ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * P.PAGE_SIZE / 1024 / 1024, 2) AS USED_MB,
ROUND(T.FREE_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS FREE_MB,
ROUND((T.TOTAL_SIZE - T.FREE_SIZE) * 100 / T.TOTAL_SIZE, 2) AS USED_PERCENT
FROM V$TABLESPACE T, V$DM_INI P
WHERE P.PARA_NAME = 'PAGE_SIZE'
ORDER BY USED_PERCENT DESC;
-- 表空间增长率监控
SELECT T.NAME AS TABLESPACE_NAME,
ROUND(T.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS CURRENT_SIZE_MB,
ROUND(H.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS HISTORY_SIZE_MB,
ROUND((T.TOTAL_SIZE - H.TOTAL_SIZE) * P.PAGE_SIZE / 1024 / 1024, 2) AS GROWTH_MB,
ROUND((T.TOTAL_SIZE - H.TOTAL_SIZE) * 100 / H.TOTAL_SIZE, 2) AS GROWTH_PERCENT
FROM V$TABLESPACE T, V$TABLESPACE_HISTORY H, V$DM_INI P
WHERE T.ID = H.TABLESPACE_ID
AND P.PARA_NAME = 'PAGE_SIZE'
AND H.SNAPSHOT_TIME = TRUNC(SYSDATE) - 7;2. 数据文件监控
sql
-- 数据文件使用情况监控
SELECT DF.NAME AS DATAFILE_NAME,
ROUND(DF.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS TOTAL_MB,
ROUND((DF.TOTAL_SIZE - DF.FREE_SIZE) * P.PAGE_SIZE / 1024 / 1024, 2) AS USED_MB,
ROUND(DF.FREE_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS FREE_MB,
ROUND((DF.TOTAL_SIZE - DF.FREE_SIZE) * 100 / DF.TOTAL_SIZE, 2) AS USED_PERCENT
FROM V$DATAFILE DF, V$DM_INI P
WHERE P.PARA_NAME = 'PAGE_SIZE'
ORDER BY USED_PERCENT DESC;
-- 数据文件自动扩展监控
SELECT DF.NAME AS DATAFILE_NAME,
DF.AUTOEXTENSIBLE,
ROUND(DF.MAX_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS MAX_SIZE_MB,
ROUND(DF.INCREMENT_BY * P.PAGE_SIZE / 1024 / 1024, 2) AS INCREMENT_MB
FROM V$DATAFILE DF, V$DM_INI P
WHERE P.PARA_NAME = 'PAGE_SIZE' AND DF.AUTOEXTENSIBLE = 'YES';3. 日志文件监控
sql
-- 日志文件使用情况监控
SELECT LF.NAME AS LOGFILE_NAME,
ROUND(LF.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS TOTAL_MB,
LF.STATUS
FROM V$LOGFILE LF, V$DM_INI P
WHERE P.PARA_NAME = 'PAGE_SIZE';
-- 日志切换频率监控
SELECT TO_CHAR(SWITCH_TIME, 'YYYY-MM-DD HH24') AS HOUR,
COUNT(*) AS SWITCH_COUNT
FROM V$LOG_HISTORY
WHERE SWITCH_TIME > TRUNC(SYSDATE)
GROUP BY TO_CHAR(SWITCH_TIME, 'YYYY-MM-DD HH24')
ORDER BY HOUR;4. 归档日志监控
sql
-- 归档日志生成量监控
SELECT TO_CHAR(COMPLETION_TIME, 'YYYY-MM-DD') AS DATE,
COUNT(*) AS ARCH_COUNT,
ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024, 2) AS TOTAL_MB
FROM V$ARCHIVED_LOG
WHERE COMPLETION_TIME > TRUNC(SYSDATE) - 7
GROUP BY TO_CHAR(COMPLETION_TIME, 'YYYY-MM-DD')
ORDER BY DATE;
-- 归档日志路径使用情况监控
SELECT ARCH_DEST,
(SELECT ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024, 2)
FROM V$ARCHIVED_LOG
WHERE NAME LIKE ARCH_DEST || '%') AS USED_MB
FROM V$DM_INI
WHERE PARA_NAME = 'ARCH_DEST';内存容量监控
1. 内存使用情况监控
sql
-- 内存使用情况监控
SELECT M.NAME AS MEMORY_NAME,
M.TOTAL_SIZE / 1024 / 1024 AS TOTAL_MB,
M.USED_SIZE / 1024 / 1024 AS USED_MB,
M.FREE_SIZE / 1024 / 1024 AS FREE_MB,
ROUND(M.USED_SIZE * 100 / M.TOTAL_SIZE, 2) AS USED_PERCENT
FROM V$MEMORY M
ORDER BY USED_PERCENT DESC;
-- 缓冲区使用情况监控
SELECT B.NAME AS BUFFER_NAME,
B.TOTAL_BLOCKS,
B.USED_BLOCKS,
B.FREE_BLOCKS,
ROUND(B.USED_BLOCKS * 100 / B.TOTAL_BLOCKS, 2) AS USED_PERCENT,
B.HIT_RATE
FROM V$BUFFERPOOL B
ORDER BY USED_PERCENT DESC;2. 共享内存监控
sql
-- 共享内存使用情况监控
SELECT S.SEGMENT_NAME,
S.SIZE / 1024 / 1024 AS SIZE_MB,
S.USED_SIZE / 1024 / 1024 AS USED_MB,
ROUND(S.USED_SIZE * 100 / S.SIZE, 2) AS USED_PERCENT
FROM V$SHARED_MEMORY S
ORDER BY USED_PERCENT DESC;3. 会话内存监控
sql
-- 会话内存使用情况监控
SELECT S.SID,
S.USERNAME,
S.MEMORY_USED / 1024 / 1024 AS MEMORY_USED_MB
FROM V$SESSION S
ORDER BY MEMORY_USED_MB DESC
FETCH FIRST 10 ROWS ONLY;
-- 会话内存使用统计
SELECT ROUND(AVG(MEMORY_USED) / 1024 / 1024, 2) AS AVG_MEMORY_MB,
ROUND(MAX(MEMORY_USED) / 1024 / 1024, 2) AS MAX_MEMORY_MB,
ROUND(SUM(MEMORY_USED) / 1024 / 1024, 2) AS TOTAL_MEMORY_MB
FROM V$SESSION;CPU容量监控
1. CPU使用率监控
sql
-- CPU使用率监控
SELECT CPU_ID,
USED_TIME * 100 / TOTAL_TIME AS CPU_USAGE_PERCENT
FROM V$CPU_USAGE
ORDER BY CPU_USAGE_PERCENT DESC;
-- 系统负载监控
SELECT * FROM V$SYSLOAD;2. CPU性能监控
sql
-- CPU密集型SQL监控
SELECT SQL_TEXT,
EXECUTIONS,
CPU_TIME / EXECUTIONS / 1000 AS AVG_CPU_TIME_MS
FROM V$SQL_STAT
WHERE EXECUTIONS > 0
ORDER BY AVG_CPU_TIME_MS DESC
FETCH FIRST 10 ROWS ONLY;会话容量监控
1. 会话使用情况监控
sql
-- 会话使用情况监控
SELECT COUNT(*) AS CURRENT_SESSIONS,
(SELECT PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'MAX_SESSIONS') AS MAX_SESSIONS,
ROUND(COUNT(*) * 100 / (SELECT PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'MAX_SESSIONS'), 2) AS USED_PERCENT
FROM V$SESSION;
-- 会话状态分布监控
SELECT STATE,
COUNT(*) AS COUNT,
ROUND(COUNT(*) * 100 / (SELECT COUNT(*) FROM V$SESSION), 2) AS PERCENT
FROM V$SESSION
GROUP BY STATE
ORDER BY COUNT DESC;2. 会话趋势监控
sql
-- 会话数量趋势监控
SELECT TO_CHAR(SNAPSHOT_TIME, 'YYYY-MM-DD HH24') AS HOUR,
AVG(SESSION_COUNT) AS AVG_SESSIONS,
MAX(SESSION_COUNT) AS MAX_SESSIONS
FROM V$SESSION_HISTORY
WHERE SNAPSHOT_TIME > TRUNC(SYSDATE) - 1
GROUP BY TO_CHAR(SNAPSHOT_TIME, 'YYYY-MM-DD HH24')
ORDER BY HOUR;事务容量监控
1. 事务使用情况监控
sql
-- 活跃事务监控
SELECT COUNT(*) AS ACTIVE_TRANSACTIONS
FROM V$TRX
WHERE STATE = 'ACTIVE';
-- 事务响应时间监控
SELECT AVG(ELAPSED_TIME) / 1000 AS AVG_TRANSACTION_TIME_MS,
MAX(ELAPSED_TIME) / 1000 AS MAX_TRANSACTION_TIME_MS
FROM V$TRX_HISTORY;2. 事务趋势监控
sql
-- 事务数量趋势监控
SELECT TO_CHAR(START_TIME, 'YYYY-MM-DD HH24') AS HOUR,
COUNT(*) AS TRANSACTION_COUNT
FROM V$TRX_HISTORY
WHERE START_TIME > TRUNC(SYSDATE) - 1
GROUP BY TO_CHAR(START_TIME, 'YYYY-MM-DD HH24')
ORDER BY HOUR;容量预测
1. 存储容量预测
sql
-- 表空间容量增长预测
-- 基于过去7天的增长情况,预测未来30天的容量需求
WITH TABLESPACE_GROWTH AS (
SELECT T.NAME AS TABLESPACE_NAME,
ROUND(T.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS CURRENT_SIZE_MB,
ROUND(AVG(DailyGrowth), 2) AS DailyGrowth_MB
FROM (
SELECT TS.ID,
TS.NAME,
(TSH.TOTAL_SIZE - LAG(TSH.TOTAL_SIZE) OVER (PARTITION BY TS.ID ORDER BY TSH.SNAPSHOT_TIME)) AS DailyGrowth
FROM V$TABLESPACE TS
JOIN V$TABLESPACE_HISTORY TSH ON TS.ID = TSH.TABLESPACE_ID
WHERE TSH.SNAPSHOT_TIME > TRUNC(SYSDATE) - 7
) T
JOIN V$DM_INI P ON P.PARA_NAME = 'PAGE_SIZE'
JOIN V$TABLESPACE TS ON TS.ID = T.ID
GROUP BY T.ID, T.NAME, P.PAGE_SIZE, TS.TOTAL_SIZE
)
SELECT TABLESPACE_NAME,
CURRENT_SIZE_MB,
DailyGrowth_MB,
CURRENT_SIZE_MB + (DailyGrowth_MB * 30) AS PREDICTED_SIZE_30D_MB,
CASE
WHEN (CURRENT_SIZE_MB + (DailyGrowth_MB * 30)) > (SELECT MAX_SIZE_MB FROM V$TABLESPACE_MAX_SIZE WHERE TABLESPACE_NAME = TG.TABLESPACE_NAME)
THEN '需要扩容'
ELSE '容量充足'
END AS STATUS
FROM TABLESPACE_GROWTH TG;2. 容量预测模型
容量预测可以采用多种模型,包括:
- 线性回归模型:基于历史数据的线性增长趋势进行预测
- 指数增长模型:基于历史数据的指数增长趋势进行预测
- 移动平均模型:基于历史数据的移动平均进行预测
- 季节性模型:考虑季节性因素的预测模型
容量监控工具
1. DM性能监控工具
DM性能监控工具提供了直观的容量监控界面,支持实时监控和历史趋势分析。
主要功能:
- 实时监控存储、内存、CPU等容量使用情况
- 提供历史趋势分析图表
- 支持设置容量告警阈值
- 支持生成容量报告
2. 第三方监控工具
DM数据库支持与第三方监控工具集成,如:
- Zabbix:提供全面的容量监控和告警功能
- Prometheus + Grafana:提供灵活的监控面板和趋势分析
- Nagios:提供简单的容量监控和告警功能
- Datadog:提供云端容量监控和分析功能
容量监控最佳实践
1. 建立容量监控体系
- 确定关键容量指标:根据业务需求和系统特点,选择关键容量指标
- 设置合理的告警阈值:根据系统负载和业务需求,设置合理的告警阈值
- 建立容量监控面板:使用监控工具建立直观的容量监控面板
- 配置容量告警通知:配置容量告警通知机制,及时通知相关人员
2. 定期进行容量分析
- 定期回顾容量使用情况:每周或每月回顾容量使用情况,了解容量增长趋势
- 进行容量预测:根据历史数据,预测未来的容量需求
- 制定扩容计划:根据容量预测结果,制定详细的扩容计划
- 优化容量使用:通过优化数据库设计和配置,提高容量利用率
3. 及时进行扩容
- 提前进行扩容:在容量达到告警阈值前,提前进行扩容
- 选择合适的扩容方式:根据容量类型和业务需求,选择合适的扩容方式
- 测试扩容效果:扩容后,测试系统性能,确保扩容效果符合预期
- 记录扩容过程:详细记录扩容过程,便于后续参考
4. 容量优化策略
- 表空间优化:合理规划表空间,设置合适的自动扩展策略
- 数据归档:对历史数据进行归档,减少存储占用
- 索引优化:优化索引设计,减少索引占用空间
- 内存优化:优化内存配置,提高内存利用率
- SQL优化:优化SQL语句,减少资源消耗
容量告警配置
1. 告警阈值设置
| 容量类型 | 正常范围 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| 表空间使用率 | < 70% | 70-85% | > 85% |
| 内存使用率 | < 70% | 70-85% | > 85% |
| CPU使用率 | < 70% | 70-85% | > 85% |
| 会话使用率 | < 70% | 70-85% | > 85% |
| 活跃事务数 | < 100 | 100-500 | > 500 |
2. 告警通知方式
容量告警可以通过多种方式进行通知,包括:
- 邮件通知:通过邮件发送告警信息
- 短信通知:通过短信发送告警信息
- 微信通知:通过微信发送告警信息
- 监控工具通知:通过监控工具的告警功能进行通知
版本差异
| 版本 | 容量监控功能差异 |
|---|---|
| DM 8.1.1.41 及以上 | 支持基本的容量监控功能,包括存储、内存、CPU等 |
| DM 8.1.1.133 及以上 | 增强了容量监控的功能,支持历史趋势分析 |
| DM 8.1.2.126 及以上 | 支持容量预测和自动告警功能 |
常见问题(FAQ)
Q1: 如何设置表空间自动扩展?
A1: 可以通过以下SQL语句设置表空间自动扩展:
sql
-- 启用数据文件自动扩展
ALTER DATABASE DATAFILE '/dm/data/DAMENG/users01.dbf'
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
-- 创建自动扩展的表空间
CREATE TABLESPACE USERS
DATAFILE '/dm/data/DAMENG/users01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 1000M;Q2: 如何监控表空间增长率?
A2: 可以通过以下SQL语句监控表空间增长率:
sql
-- 基于历史数据计算表空间增长率
SELECT T.NAME AS TABLESPACE_NAME,
ROUND(T.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS CURRENT_SIZE_MB,
ROUND(H.TOTAL_SIZE * P.PAGE_SIZE / 1024 / 1024, 2) AS HISTORY_SIZE_MB,
ROUND((T.TOTAL_SIZE - H.TOTAL_SIZE) * P.PAGE_SIZE / 1024 / 1024, 2) AS GROWTH_MB,
ROUND((T.TOTAL_SIZE - H.TOTAL_SIZE) * 100 / H.TOTAL_SIZE, 2) AS GROWTH_PERCENT
FROM V$TABLESPACE T, V$TABLESPACE_HISTORY H, V$DM_INI P
WHERE T.ID = H.TABLESPACE_ID
AND P.PARA_NAME = 'PAGE_SIZE'
AND H.SNAPSHOT_TIME = TRUNC(SYSDATE) - 7;Q3: 如何预测未来容量需求?
A3: 可以基于历史容量使用数据,使用线性回归、指数增长等模型预测未来容量需求。DM数据库提供了相关的视图和工具,支持容量预测功能。
Q4: 如何处理表空间不足问题?
A4: 处理表空间不足问题的方法包括:
- 扩展数据文件大小
- 添加新的数据文件
- 启用数据文件自动扩展
- 对历史数据进行归档
- 优化表和索引,减少存储占用
Q5: 如何优化内存使用?
A5: 优化内存使用的方法包括:
- 调整缓冲区大小,提高缓冲区命中率
- 优化共享内存配置
- 调整会话内存限制
- 优化SQL语句,减少内存消耗
- 关闭不必要的内存组件
Q6: 如何设置容量告警?
A6: 可以通过以下方式设置容量告警:
- 使用DM性能监控工具设置告警阈值和通知方式
- 使用第三方监控工具(如Zabbix、Prometheus等)设置告警
- 编写自定义脚本,定期检查容量使用情况,发送告警通知
