Skip to content

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%
活跃事务数< 100100-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等)设置告警
  • 编写自定义脚本,定期检查容量使用情况,发送告警通知