Skip to content

DB2 空间监控

空间监控概述

DB2 空间监控是数据库运维的重要组成部分,用于跟踪和管理数据库的存储空间使用情况。有效的空间监控可以帮助管理员及时发现空间不足的问题,避免数据库因空间耗尽而崩溃,优化存储资源利用率,并确保数据库的持续稳定运行。

空间监控的重要性

  • 避免空间耗尽:及时发现空间不足问题,防止数据库因空间耗尽而崩溃
  • 优化存储资源:合理分配和利用存储资源,避免资源浪费
  • 预测空间增长:根据历史数据预测空间增长趋势,提前规划存储扩容
  • 确保性能稳定:避免因空间不足导致的性能下降
  • 满足合规要求:部分行业对存储使用有合规性要求,需要定期监控和报告
  • 降低运维成本:合理规划存储资源,降低存储成本

空间监控对象

1. 表空间监控

表空间是DB2中存储空间的基本管理单位,包含以下类型:

  • 常规表空间:存储用户数据和索引
  • 大对象表空间:存储LOB数据
  • 系统临时表空间:存储系统临时数据
  • 用户临时表空间:存储用户临时数据

2. 容器监控

容器是表空间的物理存储单元,可以是:

  • 文件容器:基于文件系统的文件
  • 设备容器:直接访问的块设备
  • 自动存储容器:由DB2自动管理的存储

3. 数据库级监控

监控整个数据库的空间使用情况,包括:

  • 数据库总大小
  • 已使用空间
  • 可用空间
  • 空间增长率

空间监控工具和命令

1. DB2命令行工具

表空间状态检查

bash
# 列出所有表空间
db2 list tablespaces

# 详细列出表空间
db2 list tablespaces show detail

# 查看特定表空间信息
db2 list tablespace containers for <tablespace_id> show detail

表空间使用情况

sql
-- 查询表空间使用情况
SELECT 
    tbsp_name,
    tbsp_type,
    total_pages * page_size / 1024 / 1024 AS total_mb,
    used_pages * page_size / 1024 / 1024 AS used_mb,
    (total_pages - used_pages) * page_size / 1024 / 1024 AS free_mb,
    ROUND(used_pages * 100.0 / total_pages, 2) AS used_percent
FROM 
    sysibmadm.snaptbsp_info
ORDER BY 
    used_percent DESC;

容器使用情况

sql
-- 查询容器使用情况
SELECT 
    tbsp_name,
    container_name,
    container_type,
    total_pages * page_size / 1024 / 1024 AS total_mb,
    used_pages * page_size / 1024 / 1024 AS used_mb,
    ROUND(used_pages * 100.0 / total_pages, 2) AS used_percent
FROM 
    sysibmadm.container_utilization
ORDER BY 
    tbsp_name, container_name;

2. 快照监控

bash
# 重置表空间监控数据
db2 reset monitor all

# 获取表空间快照
db2 get snapshot for tablespaces on <database_name>

# 获取特定表空间快照
db2 get snapshot for tablespace <tablespace_name> on <database_name>

3. 监控视图

DB2提供了多个系统监控视图,用于查询空间使用情况:

sql
-- 使用监控视图查询表空间使用情况
SELECT 
    TBSP_NAME,
    TBSP_TYPE,
    TBSP_CONTENT_TYPE,
    TBSP_TOTAL_SIZE_KB / 1024 AS TOTAL_SIZE_MB,
    TBSP_USED_SIZE_KB / 1024 AS USED_SIZE_MB,
    TBSP_FREE_SIZE_KB / 1024 AS FREE_SIZE_MB,
    ROUND((TBSP_USED_SIZE_KB * 100.0) / TBSP_TOTAL_SIZE_KB, 2) AS USED_PERCENT
FROM 
    SYSIBMADM.TBSP_UTILIZATION
ORDER BY 
    USED_PERCENT DESC;

4. 自动存储监控

sql
-- 查询自动存储配置
SELECT 
    STORAGE_GROUP_NAME,
    DB_STORAGE_PATH,
    HIGHEST_USED_EXTENT,
    TOTAL_EXTENTS
FROM 
    SYSIBMADM.STORAGE_GROUP
ORDER BY 
    STORAGE_GROUP_NAME;

空间监控策略

1. 定期监控

制定定期监控计划,例如:

  • 每日监控:检查关键表空间的使用情况
  • 每周监控:全面检查所有表空间和容器
  • 每月监控:分析空间增长趋势,预测未来需求

2. 阈值告警

设置空间使用阈值,当超过阈值时触发告警:

sql
-- 设置表空间告警阈值
db2 update db cfg for <database_name> using AUTO_MAINT ON
db2 update db cfg for <database_name> using AUTO_TBL_MAINT ON
db2 update db cfg for <database_name> using AUTO_RUNSTATS ON
db2 update db cfg for <database_name> using AUTO_REORG ON
db2 update db cfg for <database_name> using AUTO_DB_BACKUP ON

-- 为特定表空间设置告警阈值
db2 "ALTER TABLESPACE USERSpace1 AUTORESIZE YES INCREASESIZE 100M MAXSIZE 10G"

3. 空间增长预测

根据历史数据预测空间增长趋势:

sql
-- 查询表空间历史增长数据
SELECT 
    TBSP_NAME,
    SNAPSHOT_TIMESTAMP,
    TBSP_USED_SIZE_KB / 1024 AS USED_SIZE_MB
FROM 
    SYSIBMADM.HISTORY_TBSP_UTILIZATION
WHERE 
    TBSP_NAME = 'USERSPACE1'
ORDER BY 
    SNAPSHOT_TIMESTAMP;

4. 自动化监控脚本

编写自动化脚本定期监控空间使用情况:

bash
#!/bin/bash

# DB2空间监控脚本

DB_NAME="sample"
LOG_FILE="space_monitor.log"
THRESHOLD=80
ALERT_EMAIL="dba@example.com"

# 日志函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# 发送告警邮件
send_alert() {
    echo "DB2空间告警:表空间 $1 使用率已达到 $2%!" | mail -s "DB2空间告警" $ALERT_EMAIL
}

log "开始DB2空间监控..."

# 连接数据库
db2 connect to $DB_NAME > /dev/null 2>&1
if [ $? -ne 0 ]; then
    log "数据库连接失败"
    exit 1
fi

# 查询表空间使用情况
log "查询表空间使用情况..."

DB2_OUTPUT=$(db2 -x "SELECT TBSP_NAME, ROUND((TBSP_USED_SIZE_KB * 100.0) / TBSP_TOTAL_SIZE_KB, 2) AS USED_PERCENT FROM SYSIBMADM.TBSP_UTILIZATION ORDER BY USED_PERCENT DESC")

# 处理查询结果
while read -r line; do
    TBSP_NAME=$(echo $line | awk '{print $1}')
    USED_PERCENT=$(echo $line | awk '{print $2}')
    
    log "表空间 $TBSP_NAME 使用率:$USED_PERCENT%"
    
    # 检查是否超过阈值
    if (( $(echo "$USED_PERCENT > $THRESHOLD" | bc -l) )); then
        log "告警:表空间 $TBSP_NAME 使用率已达到 $USED_PERCENT%,超过阈值 $THRESHOLD%"
        send_alert $TBSP_NAME $USED_PERCENT
    fi
done <<< "$DB2_OUTPUT"

log "DB2空间监控完成!"

空间不足处理

1. 表空间扩容

自动存储表空间扩容

sql
-- 自动存储表空间会自动扩容,可调整最大大小
db2 "ALTER TABLESPACE USERSpace1 AUTORESIZE YES MAXSIZE 20G"

手动表空间扩容

sql
-- 为表空间添加容器
db2 "ALTER TABLESPACE USERSpace1 ADD (FILE '/db2/data/container4' 100M)"

-- 扩展现有容器
db2 "ALTER TABLESPACE USERSpace1 RESIZE (FILE '/db2/data/container1' 200M)"

2. 数据归档

对于历史数据,可以进行归档处理:

sql
-- 创建归档表
CREATE TABLE employees_archive LIKE employees;

-- 归档旧数据
INSERT INTO employees_archive SELECT * FROM employees WHERE hire_date < '2020-01-01';

-- 删除旧数据
DELETE FROM employees WHERE hire_date < '2020-01-01';

-- 更新统计信息
RUNSTATS ON TABLE employees WITH DISTRIBUTION AND INDEXES ALL;

3. 表重组

表重组可以回收碎片空间:

sql
-- 重组表
db2 reorg table employees;

-- 重组表并重建索引
db2 reorg table employees index employees_idx;

-- 自动重组
db2 update db cfg for sample using AUTO_REORG ON;

4. 索引重建

重建索引可以回收索引碎片空间:

sql
-- 重建索引
db2 reorg index employees_idx on employees;

-- 重建所有索引
db2 reorg indexes all for table employees;

空间监控报告

1. 基本报告

生成基本的空间使用报告:

sql
-- 生成表空间使用报告
SELECT 
    '表空间使用报告' AS REPORT_TITLE,
    CURRENT_DATE AS REPORT_DATE,
    TBSP_NAME,
    TBSP_TYPE,
    TBSP_CONTENT_TYPE,
    TBSP_TOTAL_SIZE_KB / 1024 AS TOTAL_SIZE_MB,
    TBSP_USED_SIZE_KB / 1024 AS USED_SIZE_MB,
    TBSP_FREE_SIZE_KB / 1024 AS FREE_SIZE_MB,
    ROUND((TBSP_USED_SIZE_KB * 100.0) / TBSP_TOTAL_SIZE_KB, 2) AS USED_PERCENT
FROM 
    SYSIBMADM.TBSP_UTILIZATION
ORDER BY 
    USED_PERCENT DESC;

2. 增长趋势报告

生成空间增长趋势报告:

sql
-- 生成空间增长趋势报告
WITH HISTORY_DATA AS (
    SELECT 
        TBSP_NAME,
        SNAPSHOT_TIMESTAMP,
        TBSP_USED_SIZE_KB / 1024 AS USED_SIZE_MB
    FROM 
        SYSIBMADM.HISTORY_TBSP_UTILIZATION
    WHERE 
        SNAPSHOT_TIMESTAMP >= CURRENT_DATE - 30 DAYS
)
SELECT 
    '空间增长趋势报告' AS REPORT_TITLE,
    CURRENT_DATE AS REPORT_DATE,
    TBSP_NAME,
    MIN(USED_SIZE_MB) AS START_SIZE_MB,
    MAX(USED_SIZE_MB) AS END_SIZE_MB,
    MAX(USED_SIZE_MB) - MIN(USED_SIZE_MB) AS GROWTH_MB,
    ROUND(((MAX(USED_SIZE_MB) - MIN(USED_SIZE_MB)) * 100.0) / MIN(USED_SIZE_MB), 2) AS GROWTH_PERCENT
FROM 
    HISTORY_DATA
GROUP BY 
    TBSP_NAME
ORDER BY 
    GROWTH_MB DESC;

3. 自动化报告生成

bash
#!/bin/bash

# DB2空间使用报告生成脚本

DB_NAME="sample"
REPORT_FILE="space_report_$(date +'%Y%m%d').txt"

# 连接数据库
db2 connect to $DB_NAME > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "数据库连接失败"
    exit 1
fi

echo "=========================================" > $REPORT_FILE
echo "DB2 空间使用报告" >> $REPORT_FILE
echo "报告生成时间:$(date)" >> $REPORT_FILE
echo "数据库名称:$DB_NAME" >> $REPORT_FILE
echo "=========================================" >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 生成表空间使用报告
echo "1. 表空间使用情况" >> $REPORT_FILE
echo "-----------------------------------------" >> $REPORT_FILE
echo "表空间名称          类型    总大小(MB) 已使用(MB) 可用(MB) 使用率(%)" >> $REPORT_FILE
echo "-----------------------------------------" >> $REPORT_FILE

db2 -x "SELECT 
    LPAD(TBSP_NAME, 20), 
    LPAD(TBSP_TYPE, 6), 
    LPAD(CAST(TBSP_TOTAL_SIZE_KB / 1024 AS INTEGER), 12), 
    LPAD(CAST(TBSP_USED_SIZE_KB / 1024 AS INTEGER), 10), 
    LPAD(CAST(TBSP_FREE_SIZE_KB / 1024 AS INTEGER), 8), 
    LPAD(ROUND((TBSP_USED_SIZE_KB * 100.0) / TBSP_TOTAL_SIZE_KB, 2), 8)
FROM 
    SYSIBMADM.TBSP_UTILIZATION
ORDER BY 
    TBSP_USED_SIZE_KB DESC" >> $REPORT_FILE

echo "" >> $REPORT_FILE

# 生成容器使用报告
echo "2. 容器使用情况" >> $REPORT_FILE
echo "-----------------------------------------" >> $REPORT_FILE
echo "表空间名称          容器名称                总大小(MB) 已使用(MB) 使用率(%)" >> $REPORT_FILE
echo "-----------------------------------------" >> $REPORT_FILE
db2 -x "SELECT 
    LPAD(TBSP_NAME, 20), 
    LPAD(CONTAINER_NAME, 30), 
    LPAD(CAST(TOTAL_PAGES * PAGE_SIZE / 1024 / 1024 AS INTEGER), 12), 
    LPAD(CAST(USED_PAGES * PAGE_SIZE / 1024 / 1024 AS INTEGER), 10), 
    LPAD(ROUND(USED_PAGES * 100.0 / TOTAL_PAGES, 2), 8)
FROM 
    SYSIBMADM.CONTAINER_UTILIZATION
ORDER BY 
    TBSP_NAME, CONTAINER_NAME" >> $REPORT_FILE
echo "" >> $REPORT_FILE

echo "=========================================" >> $REPORT_FILE
echo "报告生成完成" >> $REPORT_FILE
echo "=========================================" >> $REPORT_FILE

# 发送报告邮件
cat $REPORT_FILE | mail -s "DB2空间使用报告 $(date +'%Y-%m-%d')" dba@example.com

echo "报告已生成并发送:$REPORT_FILE"

版本差异考虑

版本空间监控特点
DB2 10.5支持基本的表空间监控和快照,提供基本的监控视图
DB2 11.1增强了监控视图,支持更多的自动存储功能,提供更好的空间预测能力
DB2 11.5提供了更丰富的监控工具和视图,支持AI驱动的空间预测,增强了自动存储管理能力

常见问题及解决方案

1. 表空间满

症状:数据库操作失败,提示表空间已满 解决方案

  • 扩展表空间大小
  • 删除或归档不必要的数据
  • 重组表回收碎片空间
  • 检查是否有未提交的大事务占用空间

2. 自动存储不足

症状:自动存储表空间无法自动扩展 解决方案

  • 检查存储路径是否有足够空间
  • 为自动存储添加新的存储路径
  • 调整表空间的最大大小限制

3. 监控数据不准确

症状:监控视图显示的空间使用数据与实际不符 解决方案

  • 运行RUNSTATS更新统计信息
  • 刷新监控数据
  • 检查监控视图的刷新机制

4. 告警阈值频繁触发

症状:空间告警阈值频繁触发,导致告警疲劳 解决方案

  • 调整告警阈值,根据实际情况设置合理值
  • 优化空间使用,减少空间增长速度
  • 考虑使用分级告警,设置多个阈值级别

5. 无法扩展表空间

症状:尝试扩展表空间时失败 解决方案

  • 检查文件系统或设备是否有足够空间
  • 检查用户权限
  • 检查表空间是否已达到最大大小限制
  • 检查容器路径是否正确

生产实践

1. 企业级空间监控方案

bash
#!/bin/bash

# 企业级DB2空间监控方案

# 配置文件
CONFIG_FILE="space_monitor.conf"
LOG_FILE="space_monitor.log"

# 加载配置
if [ -f $CONFIG_FILE ]; then
    source $CONFIG_FILE
else
    echo "配置文件不存在:$CONFIG_FILE"
    exit 1
fi

# 日志函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# 遍历所有数据库
for DB in "${DATABASES[@]}"; do
    log "开始监控数据库:$DB"
    
    # 连接数据库
    db2 connect to $DB > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        log "数据库连接失败:$DB"
        continue
    fi
    
    # 查询表空间使用情况
    RESULT=$(db2 -x "SELECT TBSP_NAME, TBSP_USED_SIZE_KB, TBSP_TOTAL_SIZE_KB FROM SYSIBMADM.TBSP_UTILIZATION")
    
    # 处理结果
    while read -r LINE; do
        TBSP_NAME=$(echo $LINE | awk '{print $1}')
        USED_KB=$(echo $LINE | awk '{print $2}')
        TOTAL_KB=$(echo $LINE | awk '{print $3}')
        
        # 计算使用率
        if [ $TOTAL_KB -gt 0 ]; then
            USED_PERCENT=$(echo "scale=2; ($USED_KB * 100) / $TOTAL_KB" | bc)
        else
            USED_PERCENT=0
        fi
        
        log "数据库:$DB,表空间:$TBSP_NAME,使用率:$USED_PERCENT%"
        
        # 检查阈值
        for ((i=0; i<${#THRESHOLDS[@]}; i++)); do
            THRESHOLD=${THRESHOLDS[$i]}
            ALERT_LEVEL=${ALERT_LEVELS[$i]}
            
            if (( $(echo "$USED_PERCENT >= $THRESHOLD" | bc -l) )); then
                ALERT_MSG="[${ALERT_LEVEL}] 数据库:$DB,表空间:$TBSP_NAME,使用率:$USED_PERCENT%,超过阈值:${THRESHOLD}%"
                log "$ALERT_MSG"
                
                # 发送告警
                case $ALERT_LEVEL in
                    "WARNING")
                        echo $ALERT_MSG | mail -s "DB2空间告警 - WARNING" $WARNING_EMAILS
                        ;;
                    "CRITICAL")
                        echo $ALERT_MSG | mail -s "DB2空间告警 - CRITICAL" $CRITICAL_EMAILS
                        # 发送短信告警
                        curl -X POST -d "msg=$ALERT_MSG" $SMS_API_URL
                        ;;
                esac
                break
            fi
        done
    done <<< "$RESULT"
    
    # 断开数据库连接
    db2 connect reset > /dev/null 2>&1
    log "完成监控数据库:$DB"
done

log "空间监控任务完成"

2. 配置文件示例

ini
# space_monitor.conf

# 监控的数据库列表
DATABASES=("sample" "prod_db" "test_db")

# 告警阈值配置(使用率)
THRESHOLDS=(70 85 95)
ALERT_LEVELS=("WARNING" "CRITICAL" "EMERGENCY")

# 告警接收人
WARNING_EMAILS="dba@example.com"
CRITICAL_EMAILS="dba@example.com,manager@example.com"
EMERGENCY_EMAILS="dba@example.com,manager@example.com,director@example.com"

# SMS API配置
SMS_API_URL="http://sms.example.com/send"

3. 集成监控系统

将DB2空间监控集成到企业监控系统中,例如Zabbix、Nagios等:

Zabbix监控示例

bash
#!/bin/bash

# Zabbix DB2空间监控脚本

DB_NAME=$1
TBSP_NAME=$2

if [ -z "$DB_NAME" ] || [ -z "$TBSP_NAME" ]; then
    echo "Usage: $0 <database_name> <tablespace_name>"
    exit 1
fi

# 连接数据库
db2 connect to $DB_NAME > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo 0
    exit 1
fi

# 查询表空间使用率
USED_PERCENT=$(db2 -x "SELECT ROUND((TBSP_USED_SIZE_KB * 100.0) / TBSP_TOTAL_SIZE_KB, 2) FROM SYSIBMADM.TBSP_UTILIZATION WHERE TBSP_NAME = '$TBSP_NAME'")

if [ -z "$USED_PERCENT" ]; then
    echo 0
else
    echo $USED_PERCENT
fi

# 断开数据库连接
db2 connect reset > /dev/null 2>&1

常见问题(FAQ)

Q1: 如何查看DB2表空间的详细使用情况?

A1: 可以使用以下命令查看表空间的详细使用情况:

bash
db2 list tablespaces show detail
db2 "SELECT * FROM SYSIBMADM.TBSP_UTILIZATION"

Q2: 如何设置表空间的自动扩展?

A2: 可以使用以下命令设置表空间自动扩展:

sql
db2 "ALTER TABLESPACE USERSpace1 AUTORESIZE YES INCREASESIZE 100M MAXSIZE 10G"

Q3: 如何回收表空间的碎片空间?

A3: 可以通过重组表来回收碎片空间:

sql
db2 reorg table table_name
db2 reorg table table_name index index_name

Q4: 如何预测表空间的增长趋势?

A4: 可以使用历史监控数据来预测增长趋势,例如:

sql
SELECT 
    TBSP_NAME,
    SNAPSHOT_TIMESTAMP,
    TBSP_USED_SIZE_KB / 1024 AS USED_SIZE_MB
FROM 
    SYSIBMADM.HISTORY_TBSP_UTILIZATION
WHERE 
    SNAPSHOT_TIMESTAMP >= CURRENT_DATE - 30 DAYS
ORDER BY 
    TBSP_NAME, SNAPSHOT_TIMESTAMP;

Q5: 如何监控DB2的自动存储?

A5: 可以使用以下命令监控自动存储:

sql
SELECT 
    STORAGE_GROUP_NAME,
    DB_STORAGE_PATH,
    HIGHEST_USED_EXTENT,
    TOTAL_EXTENTS
FROM 
    SYSIBMADM.STORAGE_GROUP;

Q6: 表空间满了会有什么后果?

A6: 表空间满了会导致:

  • 无法插入新数据
  • 无法更新现有数据
  • 无法创建新对象
  • 数据库性能下降
  • 严重情况下会导致数据库崩溃

总结

DB2 空间监控是数据库运维的重要组成部分,通过合理的监控策略和工具,可以及时发现空间不足问题,优化存储资源利用率,预测空间增长趋势,确保数据库的持续稳定运行。企业应该根据实际情况制定适合自己的空间监控方案,包括定期监控、阈值告警、空间增长预测和自动化报告生成等。同时,还应该将空间监控集成到企业的整体监控系统中,实现统一管理和告警。通过有效的空间监控,可以降低数据库运维成本,提高数据库的可靠性和性能。