Skip to content

DB2 事件监控

事件监控概述

事件监控是DB2数据库性能管理和故障诊断的重要工具,它允许数据库管理员捕获和分析数据库中发生的各种事件。通过事件监控,可以实时了解数据库的运行状态,识别性能瓶颈,并及时发现和解决问题。

事件监控的作用

  • 性能分析:捕获SQL执行、锁等待、死锁等性能相关事件
  • 故障诊断:记录数据库错误、警告和异常事件
  • 安全审计:监控用户登录、权限变更等安全相关事件
  • 资源管理:跟踪CPU、内存、I/O等资源使用情况
  • 合规性:满足法规要求的审计和监控需求

事件监控类型

1. 活动事件监控(Activity Event Monitor)

监控内容

  • SQL语句的执行情况
  • 查询执行计划
  • 锁等待和死锁
  • 内存和CPU使用情况
  • 语句执行时间和资源消耗

适用场景

  • 性能调优和瓶颈分析
  • SQL语句优化
  • 资源使用监控

2. 语句事件监控(Statement Event Monitor)

监控内容

  • SQL语句文本
  • 语句执行统计信息
  • 编译和执行时间
  • 行数和I/O统计

适用场景

  • 识别慢查询
  • SQL语句性能分析
  • 应用程序调试

3. 事务事件监控(Transaction Event Monitor)

监控内容

  • 事务开始和结束时间
  • 事务持续时间
  • 事务影响的行数
  • 事务提交和回滚情况

适用场景

  • 事务性能分析
  • 长事务识别
  • 事务并发控制

4. 死锁事件监控(Deadlock Event Monitor)

监控内容

  • 死锁发生时间
  • 参与死锁的事务和语句
  • 锁的类型和持有情况
  • 死锁解决方式

适用场景

  • 死锁问题诊断
  • 并发控制优化
  • 应用程序设计改进

5. 连接事件监控(Connection Event Monitor)

监控内容

  • 连接建立和断开
  • 连接用户和应用程序
  • 连接持续时间
  • 连接来源和IP地址

适用场景

  • 安全审计
  • 连接模式分析
  • 资源使用监控

6. 表空间事件监控(Tablespace Event Monitor)

监控内容

  • 表空间状态变化
  • 空间使用情况
  • 自动存储扩展事件
  • 表空间备份和恢复事件

适用场景

  • 存储管理
  • 容量规划
  • 表空间性能监控

事件监控配置

1. 创建事件监控器

语法

sql
CREATE EVENT MONITOR monitor_name
  FOR { ACTIVITIES | STATEMENTS | TRANSACTIONS | DEADLOCKS | CONNECTIONS | TABLESPACES }
  [WRITE TO { FILE [ filename ] | PIPE [ pipename ] | TABLE [ table_schema.table_name ] }]
  [BUFFERSIZE buffer_size]
  [BUFFERSPACE buffer_space]
  [NUMBUFFERS num_buffers]
  [INACTIVE EVENT FLUSH]
  [AUTOSTART]
  [MANUALSTART]

示例

sql
-- 创建活动事件监控器,写入表
CREATE EVENT MONITOR activity_mon
  FOR ACTIVITIES
  WRITE TO TABLE
  AUTOSTART;

-- 创建死锁事件监控器,写入文件
CREATE EVENT MONITOR deadlock_mon
  FOR DEADLOCKS
  WRITE TO FILE 'C:\db2\eventmon\deadlock'
  BUFFERSIZE 1024
  NUMBUFFERS 10
  AUTOSTART;

2. 激活事件监控器

语法

sql
SET EVENT MONITOR monitor_name STATE 1;
-- 或
START EVENT MONITOR monitor_name;

示例

sql
-- 激活活动事件监控器
SET EVENT MONITOR activity_mon STATE 1;

-- 激活死锁事件监控器
START EVENT MONITOR deadlock_mon;

3. 配置监控选项

活动事件监控配置

sql
-- 启用详细活动监控
CALL SYSPROC.ADMIN_CMD('ALTER EVENT MONITOR activity_mon ADD ACTIVITY DETAILS ALL');

-- 配置监控的活动类型
CALL SYSPROC.ADMIN_CMD('ALTER EVENT MONITOR activity_mon ADD ACTIVITY TYPES ALL');

语句事件监控配置

sql
-- 配置监控的语句类型
CALL SYSPROC.ADMIN_CMD('ALTER EVENT MONITOR statement_mon ADD STATEMENT TYPES ALL');

事件数据的收集与分析

1. 收集事件数据

从表中收集数据

sql
-- 查询活动事件监控数据
SELECT application_handle, activity_id, uow_id, 
       activity_type, stmt_text, 
       total_cpu_time, total_execution_time
FROM activity_mon.activity
ORDER BY total_execution_time DESC;

-- 查询死锁事件监控数据
SELECT member, deadlock_id, lock_wait_start_time, 
       application_handle, activity_id, stmt_text
FROM deadlock_mon.deadlock_events
ORDER BY lock_wait_start_time DESC;

从文件中收集数据

bash
# 使用db2evmon工具格式化文件事件数据
db2evmon -path C:\db2\eventmon\deadlock > deadlock_report.txt

# 使用db2evmonfmt工具生成HTML报告
db2evmonfmt -d sample -ue deadlock_mon -f html -o deadlock_report.html

2. 分析事件数据

识别慢查询

sql
-- 查找执行时间超过1秒的SQL语句
SELECT stmt_text, total_execution_time, total_cpu_time,
       total_rows_returned, total_bufferpool_data_read
FROM activity_mon.activity
WHERE total_execution_time > 1000000
ORDER BY total_execution_time DESC;

分析死锁问题

sql
-- 分析死锁事件,找出频繁导致死锁的SQL语句
SELECT stmt_text, COUNT(*) as deadlock_count
FROM deadlock_mon.deadlock_events
GROUP BY stmt_text
ORDER BY deadlock_count DESC;

监控资源使用

sql
-- 监控应用程序的资源消耗
SELECT application_name, application_handle,
       SUM(total_cpu_time) as total_cpu,
       SUM(total_execution_time) as total_time,
       SUM(total_bufferpool_data_read) as total_reads
FROM activity_mon.activity
GROUP BY application_name, application_handle
ORDER BY total_cpu DESC;

事件监控的管理

1. 查看事件监控器状态

语法

sql
SELECT name, target_type, target, state
FROM syscat.eventmonitors;

-- 查看详细状态
SELECT * FROM TABLE(SYSPROC.MON_GET_EVENT_MONITOR_LIST(NULL));

示例

sql
-- 查看所有事件监控器的状态
SELECT name, target_type, target, state
FROM syscat.eventmonitors;

-- 查看特定事件监控器的详细信息
SELECT * FROM TABLE(SYSPROC.MON_GET_EVENT_MONITOR_LIST('activity_mon'));

2. 停止事件监控器

语法

sql
SET EVENT MONITOR monitor_name STATE 0;
-- 或
STOP EVENT MONITOR monitor_name;

示例

sql
-- 停止活动事件监控器
SET EVENT MONITOR activity_mon STATE 0;

-- 停止死锁事件监控器
STOP EVENT MONITOR deadlock_mon;

3. 重置事件监控器数据

语法

sql
-- 对于表类型的事件监控器
TRUNCATE TABLE monitor_schema.table_name IMMEDIATE;

-- 对于文件类型的事件监控器
-- 删除或重命名现有文件,然后重新激活监控器

示例

sql
-- 重置活动事件监控器的表数据
TRUNCATE TABLE activity_mon.activity IMMEDIATE;
TRUNCATE TABLE activity_mon.activitystmt IMMEDIATE;

4. 删除事件监控器

语法

sql
DROP EVENT MONITOR monitor_name;

示例

sql
-- 删除不再需要的事件监控器
DROP EVENT MONITOR old_activity_mon;

版本差异

DB2 9.7及以下

  • 事件监控类型相对较少
  • 主要支持文件和管道输出
  • 配置选项有限
  • 分析工具功能简单

DB2 10.1

  • 引入表类型事件监控器
  • 增强了活动事件监控功能
  • 引入了更多监控选项
  • 优化了事件数据的收集和存储

DB2 10.5

  • 增强了BLU Acceleration的事件监控支持
  • 引入了更多性能相关的监控指标
  • 优化了事件监控的性能开销
  • 增强了事件数据的分析能力

DB2 11.1及以上

  • 引入了自动事件监控功能
  • 增强了云环境下的事件监控支持
  • 优化了大数据库环境下的事件监控性能
  • 提供了更丰富的事件数据可视化选项

生产实践

1. 事件监控最佳实践

监控策略

  • 分层监控:根据重要性和影响范围,对不同级别的事件进行监控
  • 针对性监控:根据业务需求和系统特点,选择合适的监控类型
  • 定期调整:根据监控结果和业务变化,定期调整监控配置
  • 成本控制:平衡监控粒度和系统开销

性能优化

  • 合理设置缓冲大小和数量,避免频繁I/O
  • 选择合适的输出目标(表或文件)
  • 定期清理旧的事件数据
  • 避免在生产高峰期进行大量事件数据的查询和分析

2. 活动事件监控配置示例

创建和配置活动事件监控器

sql
-- 创建活动事件监控器
CREATE EVENT MONITOR activity_mon
  FOR ACTIVITIES
  WRITE TO TABLE
  ACTIVITYTABLE activity
  ACTIVITYSTMTTABLE activitystmt
  ACTIVITYVALUETABLE activityvalue
  AUTOSTART;

-- 激活监控器
SET EVENT MONITOR activity_mon STATE 1;

-- 配置监控活动类型
CALL SYSPROC.ADMIN_CMD('ALTER EVENT MONITOR activity_mon ADD ACTIVITY TYPES ALL');

-- 配置详细信息收集
CALL SYSPROC.ADMIN_CMD('ALTER EVENT MONITOR activity_mon ADD ACTIVITY DETAILS ALL');

分析活动数据

sql
-- 创建视图简化活动数据查询
CREATE VIEW vw_activity_summary AS
SELECT 
  a.appl_name,
  a.appl_id,
  a.uow_id,
  a.activity_id,
  s.stmt_text,
  a.activity_type,
  a.total_cpu_time / 1000000 as cpu_time_sec,
  a.total_execution_time / 1000000 as exec_time_sec,
  a.total_rows_returned,
  a.total_bufferpool_data_read + a.total_bufferpool_index_read as total_reads,
  a.start_time
FROM activity_mon.activity a
JOIN activity_mon.activitystmt s ON a.activity_id = s.activity_id AND a.uow_id = s.uow_id AND a.appl_id = s.appl_id;

-- 查询慢查询
SELECT * FROM vw_activity_summary
WHERE exec_time_sec > 5
ORDER BY exec_time_sec DESC;

3. 死锁事件监控配置示例

创建和配置死锁事件监控器

sql
-- 创建死锁事件监控器
CREATE EVENT MONITOR deadlock_mon
  FOR DEADLOCKS WITH DETAILS
  WRITE TO TABLE
  AUTOSTART;

-- 激活监控器
SET EVENT MONITOR deadlock_mon STATE 1;

分析死锁数据

sql
-- 查询死锁事件
SELECT 
  d.deadlock_id,
  d.lock_wait_start_time,
  d.member,
  e.event_timestamp,
  e.event_type,
  e.appl_name,
  e.appl_id,
  e.stmt_text,
  e.lock_mode,
  e.lock_object_type,
  e.lock_object_name
FROM deadlock_mon.deadlock d
JOIN deadlock_mon.deadlock_events e ON d.deadlock_id = e.deadlock_id
ORDER BY d.lock_wait_start_time DESC;

4. 自动化事件监控管理

自动清理事件数据

sql
-- 创建存储过程,定期清理旧的事件数据
CREATE OR REPLACE PROCEDURE cleanup_event_data(retention_days INT)
LANGUAGE SQL
BEGIN
  -- 清理活动事件数据
  DELETE FROM activity_mon.activity
  WHERE start_time < CURRENT TIMESTAMP - retention_days DAYS;
  
  DELETE FROM activity_mon.activitystmt
  WHERE activity_id IN (
    SELECT activity_id FROM activity_mon.activity
    WHERE start_time < CURRENT TIMESTAMP - retention_days DAYS
  );
  
  -- 清理死锁事件数据
  DELETE FROM deadlock_mon.deadlock
  WHERE lock_wait_start_time < CURRENT TIMESTAMP - retention_days DAYS;
  
  DELETE FROM deadlock_mon.deadlock_events
  WHERE deadlock_id IN (
    SELECT deadlock_id FROM deadlock_mon.deadlock
    WHERE lock_wait_start_time < CURRENT TIMESTAMP - retention_days DAYS
  );
END;

调度清理任务

bash
# 创建定时任务脚本
#!/bin/bash

db2 connect to sample

db2 "CALL cleanup_event_data(7)"

db2 connect reset
db2 terminate

常见问题(FAQ)

Q1: 事件监控会对数据库性能产生影响吗?

A1: 是的,事件监控会产生一定的性能开销,具体影响取决于:

  • 监控的事件类型和粒度
  • 缓冲大小和数量配置
  • 输出目标(表或文件)
  • 事件发生的频率

建议:

  • 只监控必要的事件类型
  • 合理设置监控粒度
  • 定期评估监控的性能影响

Q2: 如何选择事件监控的输出目标?

A2: 输出目标的选择取决于:

  • :适合需要频繁查询和分析事件数据的场景,查询方便但性能开销较大
  • 文件:适合长期存储和批量分析,性能开销较小但查询不便
  • 管道:适合实时处理和分析,需要外部程序配合

Q3: 如何优化事件监控的性能?

A3: 优化建议:

  • 合理设置缓冲大小和数量
  • 选择合适的输出目标
  • 避免监控不必要的事件
  • 定期清理旧的事件数据
  • 考虑在非高峰期进行数据分析

Q4: 如何监控特定应用程序的事件?

A4: 可以通过以下方法:

  • 使用应用程序名称或ID过滤事件数据
  • 创建专门针对特定应用的事件监控器
  • 使用监控视图和存储过程进行过滤查询

Q5: 事件监控数据如何用于性能调优?

A5: 事件监控数据可用于:

  • 识别慢查询并进行优化
  • 分析锁等待和死锁问题
  • 优化资源分配和配置
  • 改进应用程序设计
  • 制定合理的性能基线

事件监控工具

1. DB2自带工具

db2evmon

  • 用于格式化文件事件监控数据
  • 语法:db2evmon -path <path> [-f <format>]

db2evmonfmt

  • 用于生成HTML格式的事件报告
  • 语法:db2evmonfmt -d <database> -ue <event_monitor> -f <format> -o <output_file>

IBM Data Studio

  • 提供图形化界面配置和管理事件监控器
  • 支持可视化分析事件数据
  • 提供事件数据的报表生成功能

2. 第三方工具

IBM InfoSphere Optim Performance Manager

  • 高级性能监控和分析工具
  • 支持自动收集和分析事件数据
  • 提供智能性能建议

IBM Db2 Advanced Workgroup Server Edition

  • 包含增强的事件监控和分析功能
  • 支持实时性能监控和告警

总结

事件监控是DB2数据库管理和性能优化的重要工具,通过合理配置和使用事件监控,可以全面了解数据库的运行状态,及时发现和解决问题,提高数据库的性能和可靠性。数据库管理员应该根据业务需求和系统特点,选择合适的事件监控类型,制定合理的监控策略,并定期分析监控数据,持续优化数据库性能。