Skip to content

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_file

2. 监控最佳实践

实时监控

  • 使用db2top进行实时监控,及时发现性能问题
  • 配置自动报警,当关键指标超过阈值时发送通知
  • 定期执行监控脚本,生成性能报告

历史趋势分析

  • 保存监控数据,建立性能基线
  • 分析性能趋势,预测系统瓶颈
  • 对比不同时期的性能数据,评估优化效果

关键指标监控

  • 缓冲池命中率:目标>95%
  • 锁等待时间:目标<100ms
  • 死锁数量:目标=0
  • 物理I/O:根据系统配置评估
  • SQL执行时间:根据业务需求评估

3. 常见问题诊断

问题1:数据库响应缓慢

诊断步骤

  1. 使用db2top查看实时性能
  2. 检查缓冲池命中率
  3. 检查锁等待情况
  4. 查看高消耗SQL语句
  5. 检查I/O性能

解决方法

  • 调整缓冲池大小
  • 优化高消耗SQL语句
  • 调整锁超时参数
  • 优化存储I/O

问题2:死锁频繁发生

诊断步骤

  1. 使用db2pd -locks查看锁情况
  2. 分析死锁事件监控数据
  3. 查看应用程序日志

解决方法

  • 优化应用程序逻辑,减少锁持有时间
  • 调整事务隔离级别
  • 增加锁超时参数
  • 使用行级锁替代表级锁

问题3:缓冲池命中率低

诊断步骤

  1. 使用GET SNAPSHOT FOR BUFFERPOOL查看缓冲池统计信息
  2. 分析缓冲池读写比例
  3. 检查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根据实际需求选择合适的监控命令和工具,建立完善的监控体系,定期进行性能分析和优化。同时,要注意监控数据的保存和分析,建立性能基线,预测系统瓶颈,为数据库的长期稳定运行提供保障。