外观
DM 关键监控指标
指标分类
DM数据库的关键监控指标可以分为以下几类:
- 实例级指标:反映数据库实例的整体运行状态
- 会话级指标:反映当前活跃会话的活动情况
- 性能级指标:反映数据库的性能表现
- 资源使用指标:反映CPU、内存、磁盘IO等系统资源的使用情况
- 存储相关指标:反映数据库存储的使用情况
- 锁与等待指标:反映数据库的锁争用和等待情况
- SQL执行指标:反映SQL语句的执行效率
1.2 指标获取方式
- 系统视图:通过V$系列视图查询
- DM管理工具:图形化界面展示
- DM性能监控工具:专业的性能指标展示
- 命令行工具:disql、dmcmd等
- 第三方监控系统:Zabbix、Prometheus等
1.3 指标监控原则
- 全面性:覆盖数据库的各个方面
- 实时性:及时获取最新的指标数据
- 历史性:保存历史数据用于趋势分析
- 告警性:设置合理的告警阈值
- 可操作性:指标数据应能指导运维操作
实例级关键指标
2.1 实例状态指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
INSTANCE_STATUS | 实例运行状态 | OPEN | V$INSTANCE.STATUS$ |
START_TIME | 实例启动时间 | - | V$INSTANCE.START_TIME |
UPTIME | 实例运行时长 | - | 计算当前时间与START_TIME的差值 |
VERSION | 数据库版本 | - | V$INSTANCE.VERSION |
ARCH_MODE | 归档模式状态 | Y(建议) | V$INSTANCE.ARCH_MODE |
2.2 连接指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
SESSION_COUNT | 当前会话数 | 小于MAX_SESSIONS的80% | V$INSTANCE.SESSIONS |
ACTIVE_SESSION_COUNT | 当前活跃会话数 | 小于CPU核心数的2倍 | V$INSTANCE.ACTIVE_SESSIONS |
MAX_SESSIONS | 最大允许会话数 | 根据实际需求配置 | V$INSTANCE.MAX_SESSIONS |
LOGIN_FAILURES | 登录失败次数 | 越少越好 | V$INSTANCE.LOGIN_FAILURES |
2.3 事务指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
ACTIVE_TRANSACTIONS | 当前活跃事务数 | 小于MAX_TRANS的50% | V$INSTANCE.ACTIVE_TRX |
MAX_TRANSACTIONS | 最大允许事务数 | 根据实际需求配置 | V$INSTANCE.MAX_TRX |
COMMIT_COUNT | 提交事务数 | - | V$SYSSTAT中COMMITS值 |
ROLLBACK_COUNT | 回滚事务数 | 远小于COMMIT_COUNT | V$SYSSTAT中ROLLBACKS值 |
会话级关键指标
3.1 会话基本信息
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
SID | 会话ID | - | V$SESSION.SID |
USERNAME | 会话用户名 | - | V$SESSION.USERNAME |
STATUS | 会话状态 | ACTIVE/INACTIVE | V$SESSION.STATUS |
CLIENT_IP | 客户端IP地址 | - | V$SESSION.CLIENT_IP |
PROGRAM | 客户端程序名 | - | V$SESSION.PROGRAM |
LOGON_TIME | 登录时间 | - | V$SESSION.LOGON_TIME |
IDLE_TIME | 空闲时间 | 过长可能需要清理 | V$SESSION.IDLE_TIME |
3.2 会话资源消耗
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
CPU_USAGE | 会话CPU使用率 | 单会话CPU使用率不宜过高 | V$SESSION.CPU_USAGE |
MEMORY_USAGE | 会话内存使用率 | 单会话内存使用率不宜过高 | V$SESSION.MEMORY_USED |
DISK_READS | 会话磁盘读取次数 | 越少越好 | V$SESSION.DISK_READS |
DISK_WRITES | 会话磁盘写入次数 | 越少越好 | V$SESSION.DISK_WRITES |
BUFFER_GETS | 会话缓冲区获取次数 | 与磁盘读取的比值越高越好 | V$SESSION.BUFFER_GETS |
3.3 会话等待指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
WAIT_EVENT | 会话等待事件 | 非空闲等待越少越好 | V$SESSION_WAIT.EVENT |
WAIT_TIME | 等待时间 | 越短越好 | V$SESSION_WAIT.WAIT_TIME |
STATE | 等待状态 | WAITING/WAITED | V$SESSION_WAIT.STATE |
性能级关键指标
4.1 吞吐量指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
TPS | 每秒事务数 | 根据业务需求 | V$SYSSTAT中COMMITS和ROLLBACKS的总和除以时间间隔 |
QPS | 每秒查询数 | 根据业务需求 | V$SYSSTAT中SELECTS、INSERTS、UPDATES、DELETES的总和除以时间间隔 |
IOPS | 每秒IO操作数 | 根据存储设备性能 | 计算磁盘读写次数总和除以时间间隔 |
4.2 响应时间指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
AVG_RESPONSE_TIME | 平均响应时间 | 小于100ms | 计算总执行时间除以总SQL数 |
LONG_EXEC_SQL_COUNT | 长执行SQL数 | 越少越好 | V$LONG_EXEC_SQL的记录数 |
MAX_EXEC_TIME | 最大执行时间 | 小于10s | V$SQL_STATISTICS.ELAPSED_TIME的最大值 |
4.3 命中率指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
BUFFER_HIT_RATIO | 缓冲区命中率 | 大于95% | (1 - (PHYSICAL_READS / (LOGICAL_READS + 1))) * 100 |
INDEX_HIT_RATIO | 索引命中率 | 大于90% | (1 - (TABLE_SCANS / (INDEX_SCANS + TABLE_SCANS))) * 100 |
SHARED_POOL_HIT_RATIO | 共享池命中率 | 大于99% | V$SYSSTAT中相关指标计算 |
资源使用关键指标
5.1 CPU使用指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
CPU_USAGE | CPU使用率 | 小于80% | V$INSTANCE.CPU_USAGE |
USER_CPU_TIME | 用户态CPU时间 | - | V$SYSSTAT中USER_CPU_TIME |
SYSTEM_CPU_TIME | 系统态CPU时间 | 小于USER_CPU_TIME | V$SYSSTAT中SYSTEM_CPU_TIME |
5.2 内存使用指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
MEMORY_USAGE | 内存使用率 | 小于90% | V$INSTANCE.MEMORY_USAGE |
SHARED_MEMORY_USED | 共享内存使用量 | 小于配置值的90% | V$MEMORY.DYNAMIC_USED |
PRIVATE_MEMORY_USED | 私有内存使用量 | - | V$MEMORY.PRIVATE_USED |
BUFFER_POOL_USED | 缓冲池使用量 | 小于配置值的90% | V$BUFFERPOOL.TOTAL_USED |
5.3 磁盘IO指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
DISK_READ_RATE | 磁盘读取速率 | 小于存储设备的最大读取速率 | 计算单位时间内的磁盘读取量 |
DISK_WRITE_RATE | 磁盘写入速率 | 小于存储设备的最大写入速率 | 计算单位时间内的磁盘写入量 |
IO_WAIT_TIME | IO等待时间 | 越短越好 | V$SESSION_WAIT中IO等待事件的等待时间 |
AVERAGE_IO_WAIT_TIME | 平均IO等待时间 | 小于10ms | 计算IO等待时间的平均值 |
存储相关关键指标
6.1 表空间指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
TABLESPACE_NAME | 表空间名称 | - | V$TABLESPACE.NAME |
TOTAL_SIZE | 表空间总大小 | - | V$TABLESPACE.TOTAL_SIZE |
USED_SIZE | 表空间已使用大小 | - | V$TABLESPACE.USED_SIZE |
FREE_SIZE | 表空间可用大小 | - | V$TABLESPACE.FREE_SIZE |
USED_PERCENTAGE | 表空间使用率 | 小于80% | V$TABLESPACE.PCT_USED |
STATUS | 表空间状态 | ONLINE | V$TABLESPACE.STATUS$ |
6.2 数据文件指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
FILE_NAME | 数据文件路径 | - | V$DATAFILE.PATH |
FILE_SIZE | 数据文件大小 | - | V$DATAFILE.TOTAL_SIZE |
USED_SIZE | 数据文件已使用大小 | - | V$DATAFILE.USED_SIZE |
AUTOEXTEND | 是否自动扩展 | YES(建议) | V$DATAFILE.AUTOEXTEND |
MAX_SIZE | 最大允许大小 | - | V$DATAFILE.MAX_SIZE |
6.3 日志文件指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
LOG_GROUP | 日志组号 | - | V$LOGFILE.GROUP_ID |
LOG_SEQUENCE | 日志序列号 | - | V$LOGFILE.SEQ_NO |
LOG_SIZE | 日志文件大小 | 建议256MB-1GB | V$LOGFILE.TOTAL_SIZE |
USED_SIZE | 日志已使用大小 | - | V$LOGFILE.USED_SIZE |
STATUS | 日志状态 | ACTIVE/CURRENT/INACTIVE | V$LOGFILE.STATUS$ |
SWITCH_COUNT | 日志切换次数 | 每小时少于20次 | V$INSTANCE.LOG_SWITCHES |
锁与等待关键指标
7.1 锁指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
LOCK_COUNT | 当前锁数量 | 越少越好 | V$INSTANCE.LOCKS |
DEADLOCK_COUNT | 死锁次数 | 0 | V$INSTANCE.DEADLOCKS |
LOCK_WAIT_COUNT | 锁等待次数 | 越少越好 | V$INSTANCE.LOCK_WAITS |
LOCK_WAIT_TIME | 锁等待总时间 | 越少越好 | V$INSTANCE.LOCK_WAIT_TIME |
7.2 等待事件指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
WAIT_EVENT_COUNT | 等待事件数量 | 越少越好 | V$SESSION_WAIT的记录数 |
TOP_WAIT_EVENT | 最频繁的等待事件 | - | 统计V$SESSION_WAIT.EVENT的出现次数 |
AVERAGE_WAIT_TIME | 平均等待时间 | 越短越好 | 计算V$SESSION_WAIT.WAIT_TIME的平均值 |
7.3 常见等待事件及处理方法
| 等待事件 | 说明 | 处理方法 |
|---|---|---|
IO | IO等待 | 优化存储性能,增加缓存 |
LOCK | 锁等待 | 优化SQL,减少锁持有时间,调整事务隔离级别 |
LATCH | 闩锁等待 | 增加共享内存,优化SQL |
CPU | CPU等待 | 优化SQL,增加CPU资源 |
LOG_BUFFER | 日志缓冲区等待 | 增加日志缓冲区大小 |
COMMIT | 提交等待 | 优化事务大小,减少提交频率 |
SQL执行关键指标
8.1 SQL执行统计指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
SQL_TEXT | SQL语句文本 | - | V$SQL.SQL_TEXT |
EXEC_COUNT | 执行次数 | - | V$SQL_STATISTICS.EXEC_COUNT |
ELAPSED_TIME | 总执行时间 | 越短越好 | V$SQL_STATISTICS.ELAPSED_TIME |
AVG_EXEC_TIME | 平均执行时间 | 越短越好 | ELAPSED_TIME / EXEC_COUNT |
BUFFER_GETS | 缓冲区获取次数 | 越少越好 | V$SQL_STATISTICS.BUFFER_GETS |
DISK_READS | 磁盘读取次数 | 越少越好 | V$SQL_STATISTICS.DISK_READS |
ROWS_PROCESSED | 处理的行数 | - | V$SQL_STATISTICS.ROWS_PROCESSED |
PARSE_CALLS | 解析次数 | 越少越好 | V$SQL_STATISTICS.PARSE_CALLS |
8.2 低效SQL指标
| 指标名 | 说明 | 正常范围 | 获取方式 |
|---|---|---|---|
LONG_EXEC_SQL_COUNT | 长执行SQL数量 | 越少越好 | V$LONG_EXEC_SQL的记录数 |
FULL_TABLE_SCAN_COUNT | 全表扫描次数 | 越少越好 | V$SYSSTAT中TABLE_SCANS |
HASH_JOIN_COUNT | 哈希连接次数 | - | V$SYSSTAT中HASH_JOINS |
NESTED_LOOP_JOIN_COUNT | 嵌套循环连接次数 | - | V$SYSSTAT中NESTED_LOOPS |
监控指标最佳实践
9.1 指标选择与监控频率
9.1.1 核心指标监控频率
- 实例状态:每秒
- 会话数:每秒
- CPU、内存使用率:每秒
- IO指标:每秒
- 锁与等待:每5秒
- SQL执行:每10秒
- 存储使用:每5分钟
9.1.2 非核心指标监控频率
- 表空间使用率:每小时
- 数据文件增长:每天
- 日志切换频率:每小时
- 历史性能数据:每小时聚合,保留30天
9.2 告警阈值设置
9.2.1 实例级告警
- 实例状态非OPEN:紧急告警
- 会话数超过最大会话数的90%:严重告警
- 活跃会话数超过CPU核心数的3倍:警告
9.2.2 资源告警
- CPU使用率超过90%:严重告警
- 内存使用率超过95%:严重告警
- 磁盘IO使用率超过90%:严重告警
9.2.3 存储告警
- 表空间使用率超过85%:警告
- 表空间使用率超过95%:严重告警
- 日志切换频率超过每小时30次:警告
9.2.4 性能告警
- TPS/QPS突然下降超过50%:警告
- 平均响应时间超过500ms:警告
- 长执行SQL数量超过10个:警告
9.3 指标分析方法
9.3.1 趋势分析
- 比较当前指标与历史数据的变化
- 识别指标的长期趋势和季节性变化
- 预测未来可能出现的问题
9.3.2 对比分析
- 比较不同时间段的指标数据
- 比较不同实例的指标数据
- 比较实际值与基线值的差异
9.3.3 关联分析
- 分析不同指标之间的关联关系
- 例如:CPU使用率高与活跃会话数的关系
- 例如:锁等待与SQL执行计划的关系
9.3.4 异常检测
- 识别指标的突然变化
- 检测超出正常范围的指标
- 发现指标之间的异常关联
9.4 性能基线管理
9.4.1 建立基线
- 在业务正常运行期间,收集2-4周的性能数据
- 计算各项指标的平均值、最大值、最小值和标准差
- 确定各项指标的正常范围(平均值±2倍标准差)
- 建立性能基线文档
9.4.2 维护基线
- 定期更新基线数据(如每季度)
- 当业务发生重大变化时,重新建立基线
- 对比当前性能数据与基线,识别异常
版本差异说明
10.1 DM 7 与 DM 8 的差异
| 指标类别 | DM 7 | DM 8 |
|---|---|---|
| 实例指标 | 提供基本的实例状态和连接指标 | 增加了更多精细化的实例指标 |
| 内存指标 | 内存监控相对简单 | 提供了更详细的内存分配和使用指标 |
| 存储指标 | 基本的表空间和数据文件指标 | 增加了更多存储性能指标 |
| 锁与等待指标 | 提供基本的锁和等待事件 | 增加了更丰富的等待事件类型和详细信息 |
| SQL执行指标 | 基本的SQL执行统计 | 提供了更详细的SQL执行计划和统计信息 |
| 系统视图 | 约100个系统视图 | 约200个系统视图,提供更全面的指标 |
10.2 不同版本的注意事项
- DM 7.6 之前的版本不支持部分性能指标
- DM 8.0 开始支持自动性能基线
- 升级数据库版本后,建议重新调整监控指标和告警阈值
常见问题与解决方案
11.1 指标获取问题
11.1.1 问题:某些系统视图无法访问
解决方案:
- 确保用户具有足够的权限
- 检查视图是否存在(不同版本可能有差异)
- 使用SYSDBA用户验证
11.1.2 问题:指标数据不准确
解决方案:
- 检查系统时间是否正确
- 确保数据库统计信息是最新的
- 重启监控工具或重新连接数据库
11.2 告警问题
11.2.1 问题:频繁收到误告警
解决方案:
- 调整告警阈值,使其更符合实际情况
- 增加告警延迟时间,避免瞬时峰值触发告警
- 分析告警原因,优化系统配置
11.2.2 问题:重要告警未及时收到
解决方案:
- 检查告警配置是否正确
- 测试告警通知渠道是否正常
- 确保监控系统本身正常运行
11.3 性能问题
11.3.1 问题:监控系统影响数据库性能
解决方案:
- 减少监控频率
- 优化监控查询语句
- 使用只读副本进行监控
- 增加监控系统的资源
11.3.2 问题:指标数据不完整
解决方案:
- 检查监控配置是否覆盖所有关键指标
- 确保监控系统与数据库的连接稳定
- 增加监控系统的存储空间
常见问题(FAQ)
Q1: 如何选择需要监控的关键指标?
A1: 应根据业务需求和系统特点选择监控指标,建议优先监控:
- 实例状态和连接指标
- CPU、内存、IO等资源指标
- 锁与等待指标
- 关键SQL执行指标
- 存储使用指标
Q2: 如何设置合理的告警阈值?
A2: 可以通过以下方法设置:
- 参考数据库厂商的建议
- 根据历史性能数据建立基线
- 考虑业务需求和系统承载能力
- 从小阈值开始,逐步调整
- 不同级别的告警设置不同的阈值
Q3: 如何监控DM数据库的性能趋势?
A3: 可以通过以下方法:
- 保存历史性能数据
- 使用性能监控工具生成趋势图表
- 定期生成性能报告
- 建立性能基线,对比分析
Q4: 如何识别DM数据库的性能瓶颈?
A4: 可以通过以下步骤:
- 检查CPU、内存、IO等资源使用率
- 分析等待事件,识别资源争用
- 查看Top SQL,识别低效SQL
- 检查锁信息,识别锁争用
- 分析存储使用情况
Q5: 如何监控DM数据库的存储空间?
A5: 可以通过以下方法:
- 监控表空间使用率
- 监控数据文件增长趋势
- 设置表空间自动扩展
- 定期检查和清理无用数据
- 配置存储告警
Q6: 如何监控DM数据库的锁情况?
A6: 可以通过以下方法:
- 监控锁数量和锁等待时间
- 分析锁等待事件
- 查看锁持有情况,识别长时间持有的锁
- 配置锁等待告警
- 使用DM管理工具的锁管理功能
Q7: 如何监控DM数据库的SQL执行情况?
A7: 可以通过以下方法:
- 监控Top SQL
- 分析SQL执行计划
- 监控SQL执行统计信息
- 启用SQL审计
- 使用SQL追踪功能
Q8: 如何优化DM数据库的监控性能?
A8: 可以通过以下方法:
- 选择关键指标,避免监控过多指标
- 调整监控频率,平衡实时性和性能开销
- 优化监控查询语句
- 使用只读副本进行监控
- 增加监控系统的资源
- 定期清理历史监控数据
Q9: 如何将DM数据库的指标集成到第三方监控系统?
A9: 可以通过以下方法:
- 使用JDBC/ODBC驱动连接数据库,查询系统视图
- 开发自定义监控插件
- 使用DM数据库提供的监控API
- 配置日志转发,解析日志获取指标
- 使用Prometheus等支持的 exporter
Q10: 如何使用系统视图查询DM数据库的关键指标?
A10: 可以使用以下常用查询:
sql
-- 实例状态和连接指标
SELECT STATUS$, SESSIONS, ACTIVE_SESSIONS, CPU_USAGE, MEMORY_USAGE
FROM V$INSTANCE;
-- 会话等待事件
SELECT EVENT, COUNT(*) AS WAIT_COUNT, AVG(WAIT_TIME) AS AVG_WAIT_TIME
FROM V$SESSION_WAIT
GROUP BY EVENT
ORDER BY WAIT_COUNT DESC;
-- 表空间使用率
SELECT NAME, TOTAL_SIZE/1024/1024 AS TOTAL_MB,
USED_SIZE/1024/1024 AS USED_MB,
PCT_USED
FROM V$TABLESPACE
ORDER BY PCT_USED DESC;
-- Top SQL
SELECT SQL_TEXT, EXEC_COUNT, ELAPSED_TIME/1000 AS TOTAL_TIME_MS,
(ELAPSED_TIME/EXEC_COUNT)/1000 AS AVG_TIME_MS
FROM V$SQL_STATISTICS
ORDER BY ELAPSED_TIME DESC
LIMIT 10;