外观
DB2 监控命令
概述
DB2提供了丰富的监控命令,用于实时监控数据库的性能、状态和资源使用情况。这些命令帮助DBA及时发现并解决数据库问题,优化系统性能,确保数据库的稳定运行。
监控命令分类
1. 快照命令
快照命令是DB2最常用的监控命令之一,用于获取数据库各个方面的详细信息。
GET SNAPSHOT FOR DATABASE
- 功能:获取数据库级别的快照信息,包括连接数、锁情况、缓冲池使用等
- 使用方法:sql
-- 获取指定数据库的快照 GET SNAPSHOT FOR DATABASE ON sample; -- 获取所有数据库的快照 GET SNAPSHOT FOR ALL DATABASES;
GET SNAPSHOT FOR TABLESPACE
- 功能:获取表空间级别的快照信息,包括空间使用情况、I/O统计等
- 使用方法:sql
-- 获取指定数据库的所有表空间快照 GET SNAPSHOT FOR TABLESPACES ON sample; -- 获取指定表空间的快照 GET SNAPSHOT FOR TABLESPACE userspace1 ON sample;
GET SNAPSHOT FOR TABLE
- 功能:获取表级别的快照信息,包括表的访问统计、锁情况等
- 使用方法:sql
-- 获取指定数据库的所有表快照 GET SNAPSHOT FOR TABLES ON sample; -- 获取指定表的快照 GET SNAPSHOT FOR TABLE db2inst1.employee ON sample;
GET SNAPSHOT FOR BUFFERPOOL
- 功能:获取缓冲池级别的快照信息,包括缓冲池命中率、读写统计等
- 使用方法:sql
-- 获取指定数据库的所有缓冲池快照 GET SNAPSHOT FOR BUFFERPOOLS ON sample; -- 获取指定缓冲池的快照 GET SNAPSHOT FOR BUFFERPOOL bp1 ON sample;
GET SNAPSHOT FOR LOCK
- 功能:获取锁级别的快照信息,包括锁等待、死锁情况等
- 使用方法:sql
-- 获取指定数据库的锁快照 GET SNAPSHOT FOR LOCKS ON sample; -- 获取指定应用程序的锁快照 GET SNAPSHOT FOR LOCKS FOR APPLICATION agent_id;
2. 监控表
DB2提供了一系列系统监控表,用于查询数据库的性能和状态信息。
SYSIBMADM.SNAPDB
- 功能:提供数据库级别的监控信息
- 使用方法:sql
SELECT * FROM SYSIBMADM.SNAPDB; -- 查询关键指标 SELECT DB_NAME, TOTAL_CONNECTIONS, ACTIVE_CONNECTIONS, LOCK_WAITS, DEADLOCKS FROM SYSIBMADM.SNAPDB;
SYSIBMADM.SNAPTBSP
- 功能:提供表空间级别的监控信息
- 使用方法:sql
SELECT * FROM SYSIBMADM.SNAPTBSP; -- 查询表空间使用情况 SELECT TBSP_NAME, TBSP_TYPE, TBSP_USABLE_PAGES, TBSP_USED_PAGES, (TBSP_USED_PAGES * 100.0 / TBSP_USABLE_PAGES) AS USAGE_PERCENT FROM SYSIBMADM.SNAPTBSP;
SYSIBMADM.SNAPBUF
- 功能:提供缓冲池级别的监控信息
- 使用方法:sql
SELECT * FROM SYSIBMADM.SNAPBUF; -- 查询缓冲池命中率 SELECT BP_NAME, POOL_READS, POOL_DATA_L_READS, POOL_INDEX_L_READS, 100.0 * (1 - (POOL_READS / (POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_READS))) AS HIT_RATIO FROM SYSIBMADM.SNAPBUF;
SYSIBMADM.SNAPLOCK
- 功能:提供锁级别的监控信息
- 使用方法:sql
SELECT * FROM SYSIBMADM.SNAPLOCK; -- 查询锁等待情况 SELECT APPL_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_WAIT_TIME FROM SYSIBMADM.SNAPLOCK WHERE LOCK_WAIT_TIME > 0;
SYSIBMADM.SNAPAPPL
- 功能:提供应用程序级别的监控信息
- 使用方法:sql
SELECT * FROM SYSIBMADM.SNAPAPPL; -- 查询活动应用程序 SELECT APPL_ID, APPL_NAME, AGENT_ID, STATUS, ELAPSED_TIME_SEC FROM SYSIBMADM.SNAPAPPL WHERE STATUS = 'ACTIVE';
3. 命令行工具
DB2提供了多种命令行工具,用于监控数据库的性能和状态。
db2top
- 功能:实时监控DB2数据库的性能,类似于top命令
- 使用方法:bash
# 启动db2top db2top -d sample # 使用不同视图 db2top -d sample -C # 连接视图 db2top -d sample -B # 缓冲池视图 db2top -d sample -L # 锁视图 db2top -d sample -T # 表视图
db2pd
- 功能:获取DB2数据库的实时诊断信息,包括缓冲池、锁、事务等
- 使用方法:bash
# 获取数据库的基本信息 db2pd -d sample # 获取缓冲池信息 db2pd -d sample -bufferpools # 获取锁信息 db2pd -d sample -locks # 获取事务信息 db2pd -d sample -transactions # 获取表空间信息 db2pd -d sample -tablespaces # 获取应用程序信息 db2pd -d sample -applications # 获取日志信息 db2pd -d sample -logs
db2stat
- 功能:收集和报告数据库的统计信息
- 使用方法:bash
# 收集表统计信息 db2 runstats on table db2inst1.employee with distribution and detailed indexes all # 收集索引统计信息 db2 runstats on table db2inst1.employee for indexes all
db2support
- 功能:收集DB2数据库的支持信息,用于问题诊断
- 使用方法:bash
# 收集数据库支持信息 db2support /tmp -d sample -s
4. 事件监控
事件监控用于捕获数据库的特定事件,如死锁、语句执行等。
创建事件监控
- 功能:创建事件监控,捕获数据库事件
- 使用方法:sql
-- 创建死锁事件监控 CREATE EVENT MONITOR deadlock_mon FOR DEADLOCKS WRITE TO TABLE; -- 激活事件监控 SET EVENT MONITOR deadlock_mon STATE 1; -- 创建语句事件监控 CREATE EVENT MONITOR stmt_mon FOR STATEMENTS WRITE TO TABLE; -- 激活语句事件监控 SET EVENT MONITOR stmt_mon STATE 1;
查询事件监控数据
- 功能:查询事件监控捕获的数据
- 使用方法:sql
-- 查询死锁事件数据 SELECT * FROM deadlock_mon.DeadlockEvent; SELECT * FROM deadlock_mon.Participant; -- 查询语句事件数据 SELECT * FROM stmt_mon.Statement;
版本差异
| 版本 | 监控命令特点 |
|---|---|
| DB2 9.7 | 支持基本的快照命令和监控表,引入db2top工具 |
| DB2 10.1 | 增强了监控表的功能,引入更多性能指标 |
| DB2 10.5 | 改进了db2pd工具,支持更多诊断信息 |
| DB2 11.1 | 增强了事件监控功能,支持更多事件类型 |
| DB2 11.5 | 引入了新的监控视图和命令,增强了实时监控能力 |
生产实践
1. 常用监控脚本
数据库状态监控脚本
bash
#!/bin/bash
# DB2 数据库状态监控脚本
db_name="sample"
output_file="db_status_$(date +%Y%m%d_%H%M%S).log"
# 输出监控头
echo "DB2 数据库状态监控报告" > $output_file
echo "生成时间: $(date)" >> $output_file
echo "数据库: $db_name" >> $output_file
echo "========================================" >> $output_file
# 获取数据库基本信息
echo "1. 数据库基本信息:" >> $output_file
db2 connect to $db_name > /dev/null
db2 -x "SELECT DB_NAME, STATUS, TOTAL_CONNECTIONS, ACTIVE_CONNECTIONS FROM SYSIBMADM.SNAPDB" >> $output_file
echo "========================================" >> $output_file
# 获取缓冲池信息
echo "2. 缓冲池信息:" >> $output_file
db2 -x "SELECT BP_NAME, POOL_READS, POOL_DATA_L_READS, POOL_INDEX_L_READS, \n
100.0 * (1 - (POOL_READS / (POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_READS))) AS HIT_RATIO \n
FROM SYSIBMADM.SNAPBUF" >> $output_file
echo "========================================" >> $output_file
# 获取表空间使用情况
echo "3. 表空间使用情况:" >> $output_file
db2 -x "SELECT TBSP_NAME, TBSP_TYPE, \n
TBSP_USABLE_PAGES * PAGE_SIZE / 1024 / 1024 AS USABLE_MB, \n
TBSP_USED_PAGES * PAGE_SIZE / 1024 / 1024 AS USED_MB, \n
(TBSP_USED_PAGES * 100.0 / TBSP_USABLE_PAGES) AS USAGE_PERCENT \n
FROM SYSIBMADM.SNAPTBSP" >> $output_file
echo "========================================" >> $output_file
# 获取锁等待情况
echo "4. 锁等待情况:" >> $output_file
lock_wait_count=$(db2 -x "SELECT COUNT(*) FROM SYSIBMADM.SNAPLOCK WHERE LOCK_WAIT_TIME > 0")
if [ $lock_wait_count -gt 0 ]; then
db2 -x "SELECT APPL_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_WAIT_TIME FROM SYSIBMADM.SNAPLOCK WHERE LOCK_WAIT_TIME > 0" >> $output_file
else
echo "没有锁等待" >> $output_file
fi
echo "========================================" >> $output_file
# 获取活动应用程序
echo "5. 活动应用程序:" >> $output_file
db2 -x "SELECT APPL_ID, APPL_NAME, AGENT_ID, STATUS, ELAPSED_TIME_SEC FROM SYSIBMADM.SNAPAPPL WHERE STATUS = 'ACTIVE'" >> $output_file
echo "========================================" >> $output_file
db2 connect reset > /dev/null
echo "监控完成,结果保存到 $output_file" >> $output_file性能监控脚本
bash
#!/bin/bash
# DB2 性能监控脚本
db_name="sample"
output_file="perf_mon_$(date +%Y%m%d_%H%M%S).log"
echo "DB2 性能监控报告" > $output_file
echo "生成时间: $(date)" >> $output_file
echo "数据库: $db_name" >> $output_file
echo "========================================" >> $output_file
db2 connect to $db_name > /dev/null
# 获取SQL语句性能信息
echo "1. 高消耗SQL语句:" >> $output_file
db2 -x "SELECT SUBSTR(STMT_TEXT, 1, 100) AS SQL_TEXT, EXECUTION_TIME, CPU_TIME, BUFFERPOOL_DATA_PHYSICAL_READS, \n
BUFFERPOOL_INDEX_PHYSICAL_READS, ROWS_READ, ROWS_WRITTEN \n
FROM SYSIBMADM.TOP_DYNAMIC_SQL \n
ORDER BY EXECUTION_TIME DESC FETCH FIRST 10 ROWS ONLY" >> $output_file
echo "========================================" >> $output_file
# 获取缓冲池性能
echo "2. 缓冲池性能:" >> $output_file
db2 -x "SELECT BP_NAME, \n
POOL_DATA_L_READS + POOL_INDEX_L_READS AS LOGICAL_READS, \n
POOL_READS AS PHYSICAL_READS, \n
100.0 * (1 - (POOL_READS / (POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_READS))) AS HIT_RATIO, \n
POOL_WRITE_TIME AS WRITE_TIME, \n
POOL_READ_TIME AS READ_TIME \n
FROM SYSIBMADM.SNAPBUF" >> $output_file
echo "========================================" >> $output_file
# 获取I/O性能
echo "3. I/O性能:" >> $output_file
db2 -x "SELECT TBSP_NAME, PHYSICAL_READS, PHYSICAL_WRITES, \n
PHYSICAL_READ_TIME, PHYSICAL_WRITE_TIME, \n
CASE WHEN PHYSICAL_READS > 0 THEN PHYSICAL_READ_TIME / PHYSICAL_READS ELSE 0 END AS AVG_READ_TIME, \n
CASE WHEN PHYSICAL_WRITES > 0 THEN PHYSICAL_WRITE_TIME / PHYSICAL_WRITES ELSE 0 END AS AVG_WRITE_TIME \n
FROM SYSIBMADM.SNAPTBSP" >> $output_file
echo "========================================" >> $output_file
db2 connect reset > /dev/null
echo "性能监控完成,结果保存到 $output_file" >> $output_file2. 监控最佳实践
实时监控
- 使用db2top进行实时监控,及时发现性能问题
- 配置自动报警,当关键指标超过阈值时发送通知
- 定期执行监控脚本,生成性能报告
历史趋势分析
- 保存监控数据,建立性能基线
- 分析性能趋势,预测系统瓶颈
- 对比不同时期的性能数据,评估优化效果
关键指标监控
- 缓冲池命中率:目标>95%
- 锁等待时间:目标<100ms
- 死锁数量:目标=0
- 物理I/O:根据系统配置评估
- SQL执行时间:根据业务需求评估
3. 常见问题诊断
问题1:数据库响应缓慢
诊断步骤:
- 使用db2top查看实时性能
- 检查缓冲池命中率
- 检查锁等待情况
- 查看高消耗SQL语句
- 检查I/O性能
解决方法:
- 调整缓冲池大小
- 优化高消耗SQL语句
- 调整锁超时参数
- 优化存储I/O
问题2:死锁频繁发生
诊断步骤:
- 使用db2pd -locks查看锁情况
- 分析死锁事件监控数据
- 查看应用程序日志
解决方法:
- 优化应用程序逻辑,减少锁持有时间
- 调整事务隔离级别
- 增加锁超时参数
- 使用行级锁替代表级锁
问题3:缓冲池命中率低
诊断步骤:
- 使用GET SNAPSHOT FOR BUFFERPOOL查看缓冲池统计信息
- 分析缓冲池读写比例
- 检查SQL语句的索引使用情况
解决方法:
- 增加缓冲池大小
- 优化SQL语句,增加索引覆盖
- 调整缓冲池页大小
- 考虑使用多个缓冲池
常见问题(FAQ)
Q1: db2top和db2pd有什么区别?
A1: db2top和db2pd都是DB2的监控工具,但它们有不同的特点:
- db2top:提供实时的交互式监控界面,类似于top命令,适合实时监控和性能分析
- db2pd:提供详细的诊断信息,适合深入分析和问题诊断,可以生成文本输出,便于脚本处理
Q2: 如何启用DB2的监控功能?
A2: DB2的监控功能默认是启用的,但有些高级监控功能需要手动启用:
sql
-- 启用监控
UPDATE DATABASE MANAGER CONFIGURATION USING HEALTH_MON OFF;
UPDATE DATABASE CONFIGURATION FOR sample USING MON_ACTIVITY_STATUS WITH RESET;
UPDATE DATABASE CONFIGURATION FOR sample USING MON_REQ_METRICS BASE;
UPDATE DATABASE CONFIGURATION FOR sample USING MON_OBJ_METRICS BASE;Q3: 如何监控DB2的日志使用情况?
A3: 可以使用以下命令监控DB2的日志使用情况:
bash
# 使用db2pd命令
db2pd -d sample -logs
# 使用快照命令
GET SNAPSHOT FOR LOGS ON sample;
# 查询监控表
SELECT * FROM SYSIBMADM.SNAPLOG;Q4: 如何监控DB2的连接数?
A4: 可以使用以下命令监控DB2的连接数:
bash
# 使用db2top命令,进入连接视图
db2top -d sample -C
# 使用db2pd命令
db2pd -d sample -applications
# 查询监控表
SELECT TOTAL_CONNECTIONS, ACTIVE_CONNECTIONS FROM SYSIBMADM.SNAPDB;Q5: 如何监控DB2的锁情况?
A5: 可以使用以下命令监控DB2的锁情况:
bash
# 使用db2top命令,进入锁视图
db2top -d sample -L
# 使用db2pd命令
db2pd -d sample -locks
# 使用快照命令
GET SNAPSHOT FOR LOCKS ON sample;
# 查询监控表
SELECT * FROM SYSIBMADM.SNAPLOCK WHERE LOCK_WAIT_TIME > 0;Q6: 如何监控DB2的SQL执行情况?
A6: 可以使用以下命令监控DB2的SQL执行情况:
bash
# 使用db2top命令,进入SQL视图
db2top -d sample -S
# 查询监控表
SELECT * FROM SYSIBMADM.TOP_DYNAMIC_SQL ORDER BY EXECUTION_TIME DESC;
# 使用事件监控
CREATE EVENT MONITOR stmt_mon FOR STATEMENTS WRITE TO TABLE;
SET EVENT MONITOR stmt_mon STATE 1;总结
DB2提供了丰富的监控命令和工具,帮助DBA实时监控数据库的性能、状态和资源使用情况。通过合理使用这些监控命令,可以及时发现并解决数据库问题,优化系统性能,确保数据库的稳定运行。
建议DBA根据实际需求选择合适的监控命令和工具,建立完善的监控体系,定期进行性能分析和优化。同时,要注意监控数据的保存和分析,建立性能基线,预测系统瓶颈,为数据库的长期稳定运行提供保障。
