外观
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.html2. 分析事件数据
识别慢查询
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数据库管理和性能优化的重要工具,通过合理配置和使用事件监控,可以全面了解数据库的运行状态,及时发现和解决问题,提高数据库的性能和可靠性。数据库管理员应该根据业务需求和系统特点,选择合适的事件监控类型,制定合理的监控策略,并定期分析监控数据,持续优化数据库性能。
