外观
DB2 日常巡检内容
概述
DB2 数据库日常巡检是保障数据库系统稳定运行的重要手段,通过定期检查数据库的状态、性能、存储、安全等方面,可以及时发现潜在问题并采取措施,避免问题扩大化导致系统故障。建立规范的日常巡检制度,有助于提高数据库的可用性、性能和安全性。
巡检目的
- 及时发现问题:通过定期检查,发现数据库系统中存在的隐患和问题
- 预防故障发生:针对发现的问题,及时采取措施进行修复,预防故障发生
- 优化系统性能:通过监控性能指标,找出性能瓶颈,进行优化调整
- 确保数据安全:检查安全配置和日志,确保数据的安全性和完整性
- 合规性检查:确保数据库系统符合相关法规和标准要求
- 积累运维经验:通过巡检记录,积累运维经验,提高运维水平
巡检周期
| 巡检类型 | 巡检周期 | 负责人员 |
|---|---|---|
| 日常巡检 | 每天 | 初级DBA |
| 周度巡检 | 每周 | 中级DBA |
| 月度巡检 | 每月 | 高级DBA |
| 季度巡检 | 每季度 | DBA团队 |
| 年度巡检 | 每年 | DBA团队 + 架构师 |
日常巡检内容
数据库状态检查
实例状态检查
sql
-- 检查实例状态
GET INSTANCE STATUS
-- 或使用命令行
db2 get instance status检查要点:
- 实例是否处于活动状态
- 实例启动时间
- 实例级别的错误信息
数据库状态检查
sql
-- 检查所有数据库状态
LIST DATABASE DIRECTORY
-- 检查特定数据库状态
CONNECT TO <dbname>
GET DATABASE STATUS检查要点:
- 数据库是否处于活动状态
- 数据库连接数
- 数据库级别的错误信息
应用程序连接状态
sql
-- 查看当前连接的应用程序
LIST APPLICATIONS
-- 或使用系统视图
SELECT * FROM SYSIBMADM.APPLICATIONS检查要点:
- 活跃连接数
- 长时间运行的应用程序
- 锁定的应用程序
性能检查
CPU 使用率检查
sql
-- 检查数据库进程的CPU使用率
SELECT * FROM SYSIBMADM.DB_CPU_USAGE
-- 或使用操作系统命令
top -p <db2_instance_pid>检查要点:
- 数据库进程的CPU使用率
- 系统总体CPU使用率
- CPU使用率的变化趋势
内存使用率检查
sql
-- 检查缓冲池命中率
SELECT BP_NAME, POOL_READ_PAGES, POOL_DATA_L_READS,
CASE WHEN POOL_READ_PAGES + POOL_DATA_L_READS > 0
THEN 100 - (POOL_READ_PAGES * 100.0 / (POOL_READ_PAGES + POOL_DATA_L_READS))
ELSE 100 END AS HIT_RATIO
FROM SYSIBMADM.BP_HITRATIO
-- 检查数据库内存使用情况
SELECT * FROM SYSIBMADM.MEMORY_USAGE检查要点:
- 数据缓冲池命中率(目标:>95%)
- 索引缓冲池命中率(目标:>95%)
- 数据库总体内存使用率
I/O 性能检查
sql
-- 检查表空间I/O情况
SELECT TBSP_NAME, READS, WRITES, READ_TIME, WRITE_TIME,
CASE WHEN READS > 0 THEN READ_TIME / READS ELSE 0 END AS AVG_READ_TIME,
CASE WHEN WRITES > 0 THEN WRITE_TIME / WRITES ELSE 0 END AS AVG_WRITE_TIME
FROM SYSIBMADM.TBSP_IO_STATS
-- 检查磁盘I/O等待时间
SELECT * FROM SYSIBMADM.DISK_IO_STATS检查要点:
- 磁盘读写速率
- 平均I/O等待时间(目标:<10ms)
- I/O瓶颈的表空间
日志性能检查
sql
-- 检查日志写入情况
SELECT * FROM SYSIBMADM.LOG_UTILIZATION
-- 检查日志缓冲区命中率
SELECT LOG_BUFFER_WAIT, LOG_DISK_WAIT FROM SYSIBMADM.WAITEVENTS检查要点:
- 日志空间使用率
- 日志写入速率
- 日志缓冲区命中率
存储检查
表空间使用率检查
sql
-- 检查表空间使用率
SELECT TBSP_NAME, TBSP_TYPE,
TBSP_TOTAL_SIZE_KB / 1024 / 1024 AS TOTAL_GB,
TBSP_USED_SIZE_KB / 1024 / 1024 AS USED_GB,
TBSP_FREE_SIZE_KB / 1024 / 1024 AS FREE_GB,
CASE WHEN TBSP_TOTAL_SIZE_KB > 0
THEN (TBSP_USED_SIZE_KB * 100.0 / TBSP_TOTAL_SIZE_KB)
ELSE 0 END AS USAGE_PERCENT
FROM SYSIBMADM.TBSP_UTILIZATION检查要点:
- 各表空间的使用率(警告阈值:80%,严重阈值:90%)
- 表空间的增长趋势
- 自动存储表空间的扩展情况
容器状态检查
sql
-- 检查容器状态
LIST TABLESPACE CONTAINERS FOR <tablespace_id>
-- 或使用系统视图
SELECT * FROM SYSIBMADM.TBSP_CONTAINERS检查要点:
- 容器是否可用
- 容器的存储路径是否正确
- 容器的可用空间
临时表空间检查
sql
-- 检查临时表空间使用率
SELECT TBSP_NAME, TBSP_USED_SIZE_KB / 1024 / 1024 AS USED_GB,
TBSP_FREE_SIZE_KB / 1024 / 1024 AS FREE_GB,
CASE WHEN TBSP_TOTAL_SIZE_KB > 0
THEN (TBSP_USED_SIZE_KB * 100.0 / TBSP_TOTAL_SIZE_KB)
ELSE 0 END AS USAGE_PERCENT
FROM SYSIBMADM.TBSP_UTILIZATION
WHERE TBSP_TYPE = 'TEMPORARY'检查要点:
- 临时表空间使用率
- 临时表空间的配置是否合理
- 是否存在临时表空间不足的情况
安全检查
失败登录尝试检查
sql
-- 检查失败的登录尝试
SELECT * FROM SYSIBMADM.LOGIN_FAILURES检查要点:
- 失败登录尝试的次数
- 失败登录尝试的来源IP
- 是否存在暴力破解的迹象
特权用户活动检查
sql
-- 检查特权用户的活动
SELECT * FROM SYSIBMADM.AUTHORIZATIONID_AUTHORITIES
WHERE AUTHORITY IN ('SYSADM', 'SYSCTRL', 'SYSMAINT', 'DBADM')检查要点:
- 特权用户的数量和权限
- 特权用户的最近活动
- 是否存在未授权的特权用户
审计日志检查
sql
-- 检查审计日志配置
GET DATABASE CONFIGURATION FOR <dbname> SHOW DETAIL | grep -i audit
-- 查看审计日志内容
db2audit describe检查要点:
- 审计日志是否启用
- 审计日志的配置是否合理
- 审计日志中是否存在异常事件
备份恢复检查
备份状态检查
sql
-- 检查最近的备份情况
SELECT * FROM SYSIBMADM.DB_HISTORY
WHERE OPERATION IN ('B', 'R', 'W')
ORDER BY TIMESTAMP DESC检查要点:
- 最近的备份是否成功
- 备份的类型和频率是否符合策略
- 备份的完整性和一致性
归档日志检查
sql
-- 检查归档日志配置
GET DATABASE CONFIGURATION FOR <dbname> | grep -i logarch
-- 检查归档日志目录
ls -la <archive_log_path>检查要点:
- 归档日志是否正常生成
- 归档日志目录的空间使用率
- 归档日志的保留期限
锁和死锁检查
锁等待检查
sql
-- 检查锁等待情况
SELECT * FROM SYSIBMADM.LOCKWAITS
-- 检查锁统计信息
SELECT * FROM SYSIBMADM.LOCK_STATS检查要点:
- 当前锁等待的数量
- 锁等待的时间
- 导致锁等待的SQL语句
死锁检查
sql
-- 检查死锁历史
SELECT * FROM SYSIBMADM.DEADLOCKS
-- 或检查数据库配置中的死锁数量
GET DATABASE CONFIGURATION FOR <dbname> | grep -i deadlock检查要点:
- 最近发生的死锁数量
- 导致死锁的SQL语句
- 死锁发生的频率和模式
周度巡检内容
性能深入检查
SQL 性能检查
sql
-- 检查慢查询
SELECT * FROM SYSIBMADM.LONG_RUNNING_SQL
WHERE ELAPSED_TIME_SEC > 60
-- 检查SQL语句的执行计划
EXPLAIN PLAN FOR <sql_statement>
SELECT * FROM EXPLAIN_INSTANCE检查要点:
- 慢查询的数量和执行时间
- 频繁执行的SQL语句
- SQL语句的执行计划是否合理
- 是否存在缺少索引的情况
缓冲池性能检查
sql
-- 检查缓冲池详细性能
SELECT * FROM SYSIBMADM.BP_STATISTICS
-- 检查缓冲池命中率趋势
SELECT BP_NAME, SNAPSHOT_TIMESTAMP,
CASE WHEN POOL_READ_PAGES + POOL_DATA_L_READS > 0
THEN 100 - (POOL_READ_PAGES * 100.0 / (POOL_READ_PAGES + POOL_DATA_L_READS))
ELSE 100 END AS HIT_RATIO
FROM SYSIBMADM.BP_HITRATIO_HISTORY
ORDER BY SNAPSHOT_TIMESTAMP检查要点:
- 缓冲池的读写统计
- 缓冲池命中率的变化趋势
- 缓冲池的大小是否需要调整
数据库对象检查
表和索引状态检查
sql
-- 检查无效的索引
SELECT * FROM SYSIBMADM.INVALID_OBJECTS
WHERE OBJECT_TYPE = 'INDEX'
-- 检查表的统计信息
RUNSTATS ON TABLE <schema>.<table> SHOW DETAIL检查要点:
- 是否存在无效的数据库对象
- 表的统计信息是否最新
- 索引的使用情况
约束检查
sql
-- 检查约束状态
SELECT * FROM SYSIBMADM.CHECK_CONSTRAINTS
WHERE STATUS <> 'N'检查要点:
- 约束是否处于活动状态
- 是否存在违反约束的情况
配置检查
数据库配置检查
sql
-- 检查数据库配置
GET DATABASE CONFIGURATION FOR <dbname>
-- 检查实例配置
GET DATABASE MANAGER CONFIGURATION检查要点:
- 配置参数是否符合最佳实践
- 配置参数是否有最近的变更
- 配置参数的设置是否合理
月度巡检内容
存储深入检查
表空间增长趋势分析
sql
-- 收集表空间使用历史数据
SELECT TBSP_NAME, SNAPSHOT_TIMESTAMP,
TBSP_USED_SIZE_KB / 1024 / 1024 AS USED_GB,
TBSP_FREE_SIZE_KB / 1024 / 1024 AS FREE_GB
FROM SYSIBMADM.TBSP_UTILIZATION_HISTORY
ORDER BY TBSP_NAME, SNAPSHOT_TIMESTAMP检查要点:
- 表空间的增长趋势
- 预测未来的存储需求
- 识别快速增长的表空间
数据分布检查
sql
-- 检查表的数据分布
RUNSTATS ON TABLE <schema>.<table> WITH DISTRIBUTION ON COLUMNS (*)检查要点:
- 表的数据分布是否均匀
- 是否存在数据倾斜的情况
- 是否需要重新组织表数据
安全深入检查
权限审计
sql
-- 审计用户权限
SELECT * FROM SYSIBMADM.AUTHORIZATIONID_AUTHORITIES检查要点:
- 用户权限的分配是否符合最小权限原则
- 是否存在权限过度分配的情况
- 是否存在长期未使用的用户
网络安全检查
sql
-- 检查数据库的网络配置
GET DATABASE MANAGER CONFIGURATION | grep -i svcename
-- 检查连接控制配置
GET DATABASE CONFIGURATION FOR <dbname> | grep -i connection检查要点:
- 数据库的网络服务配置
- 连接控制的配置是否合理
- 是否启用了SSL/TLS加密
备份恢复测试
测试内容:
- 从最近的备份恢复数据库到测试环境
- 验证恢复的数据库的完整性和一致性
- 测试点时间恢复功能
- 记录恢复时间和过程
检查要点:
- 备份是否可以成功恢复
- 恢复时间是否符合RTO要求
- 恢复的数据是否完整一致
巡检工具与自动化
常用巡检工具
DB2 内置工具
- DB2 Control Center:图形化管理工具,提供监控和管理功能
- DB2 Health Monitor:内置的健康监控工具,可配置告警
- DB2 Snapshot Monitor:用于收集数据库快照信息
- DB2 Event Monitor:用于收集特定事件的详细信息
第三方工具
- IBM Data Studio:IBM 官方提供的综合数据库管理工具
- IBM Tivoli Monitoring:企业级监控解决方案
- Nagios/Zabbix:开源监控工具,可通过插件监控DB2
- Prometheus + Grafana:流行的开源监控组合,可通过DB2 Exporter监控DB2
- Datadog:云原生监控平台,支持DB2监控
自动化巡检脚本
日常巡检脚本示例
bash
#!/bin/bash
# DB2 日常巡检脚本
# 设置环境变量
export DB2INSTANCE=<db2_instance>
export PATH=$PATH:/home/$DB2INSTANCE/sqllib/bin
# 定义日志文件
LOG_FILE=/home/$DB2INSTANCE/logs/db2_daily_check_$(date +%Y%m%d).log
echo "=========================================" >> $LOG_FILE
echo "DB2 日常巡检报告 - $(date)" >> $LOG_FILE
echo "=========================================" >> $LOG_FILE
# 1. 实例状态检查
echo "\n1. 实例状态检查" >> $LOG_FILE
db2 get instance status >> $LOG_FILE
# 2. 数据库状态检查
echo "\n2. 数据库状态检查" >> $LOG_FILE
db2 list database directory >> $LOG_FILE
# 3. 表空间使用率检查
echo "\n3. 表空间使用率检查" >> $LOG_FILE
db2 connect to <dbname> >> /dev/null
db2 -x "SELECT TBSP_NAME, \
TBSP_USED_SIZE_KB / 1024 / 1024 AS USED_GB, \
TBSP_FREE_SIZE_KB / 1024 / 1024 AS FREE_GB, \
CASE WHEN TBSP_TOTAL_SIZE_KB > 0 \
THEN ROUND((TBSP_USED_SIZE_KB * 100.0 / TBSP_TOTAL_SIZE_KB), 2) \
ELSE 0 END AS USAGE_PERCENT \
FROM SYSIBMADM.TBSP_UTILIZATION" >> $LOG_FILE
# 4. 连接数检查
echo "\n4. 连接数检查" >> $LOG_FILE
db2 -x "SELECT COUNT(*) AS ACTIVE_CONNECTIONS FROM SYSIBMADM.APPLICATIONS" >> $LOG_FILE
# 5. 缓冲池命中率检查
echo "\n5. 缓冲池命中率检查" >> $LOG_FILE
db2 -x "SELECT BP_NAME, \
CASE WHEN POOL_READ_PAGES + POOL_DATA_L_READS > 0 \
THEN ROUND(100 - (POOL_READ_PAGES * 100.0 / (POOL_READ_PAGES + POOL_DATA_L_READS)), 2) \
ELSE 100 END AS HIT_RATIO \
FROM SYSIBMADM.BP_HITRATIO" >> $LOG_FILE
# 6. 最近备份检查
echo "\n6. 最近备份检查" >> $LOG_FILE
db2 -x "SELECT OPERATION, TIMESTAMP, STATUS \
FROM SYSIBMADM.DB_HISTORY \
WHERE OPERATION IN ('B', 'R', 'W') \
ORDER BY TIMESTAMP DESC \
FETCH FIRST 10 ROWS ONLY" >> $LOG_FILE
db2 connect reset >> /dev/null
echo "\n=========================================" >> $LOG_FILE
echo "巡检完成 - $(date)" >> $LOG_FILE
echo "=========================================" >> $LOG_FILE
# 发送巡检报告
mail -s "DB2 日常巡检报告 - $(date +%Y%m%d)" dba@example.com < $LOG_FILE巡检结果分析与处理
巡检结果记录
- 使用统一的巡检模板记录巡检结果
- 记录巡检时间、负责人员、巡检内容和发现的问题
- 对发现的问题进行分类和优先级划分
问题处理流程
- 问题记录:将发现的问题记录到问题跟踪系统
- 问题分析:分析问题的原因和影响范围
- 解决方案制定:根据问题的严重程度,制定相应的解决方案
- 解决方案实施:按照计划实施解决方案
- 验证解决结果:验证问题是否得到解决
- 经验总结:总结问题的原因和解决方法,积累经验
版本差异
| 版本 | 巡检功能变化 |
|---|---|
| DB2 9.7 | 引入了更多的系统视图,简化了巡检操作 |
| DB2 10.1 | 增强了性能监控功能,提供了更多的性能指标 |
| DB2 10.5 | 引入了 BLU Acceleration 相关的监控指标 |
| DB2 11.1 | 改进了安全监控功能,增强了审计能力 |
| DB2 11.5 | 增强了云环境下的监控能力,提供了更多的自动化巡检功能 |
最佳实践
巡检计划制定
- 根据数据库的重要性和业务需求,制定合理的巡检计划
- 明确巡检的内容、周期、负责人员和流程
- 定期 review 和优化巡检计划
巡检工具选择
- 根据实际情况,选择合适的巡检工具
- 结合使用内置工具和第三方工具,提高巡检效率
- 考虑自动化巡检,减少人工操作
巡检结果管理
- 建立巡检结果的集中存储和管理机制
- 对巡检结果进行定期分析和趋势预测
- 利用巡检结果改进数据库的运维管理
持续改进
- 定期 review 巡检内容和流程,进行优化调整
- 结合新的技术和工具,改进巡检方法
- 学习和借鉴行业最佳实践,提高巡检水平
常见问题(FAQ)
Q1: 如何确定巡检的重点内容?
A1: 巡检的重点内容应根据数据库的重要性、业务需求、历史故障记录和性能瓶颈等因素来确定。一般来说,数据库状态、性能、存储和安全是巡检的核心内容。
Q2: 如何处理巡检中发现的问题?
A2: 对于巡检中发现的问题,应按照问题的严重程度进行分类,制定相应的解决方案,并跟踪解决进度。对于严重问题,应立即处理;对于一般问题,可以安排在维护窗口处理。
Q3: 如何实现自动化巡检?
A3: 可以使用脚本语言编写巡检脚本,结合 cron 或其他调度工具定期执行。也可以使用专业的监控工具,配置自动巡检和告警功能。
Q4: 如何评估巡检的效果?
A4: 可以通过以下指标评估巡检的效果:
- 故障发生率的变化
- 故障处理时间的变化
- 系统性能的变化
- 存储利用率的变化
- 安全事件的数量
Q5: 如何积累巡检经验?
A5: 可以通过以下方式积累巡检经验:
- 详细记录巡检结果和问题处理过程
- 定期 review 巡检记录,总结经验教训
- 参加培训和技术交流,学习行业最佳实践
- 建立知识库,共享巡检经验
Q6: 巡检周期应该如何设置?
A6: 巡检周期应根据数据库的重要性、业务需求和系统的稳定性来确定。对于关键业务数据库,建议每天进行日常巡检;对于一般数据库,可以适当延长巡检周期。
Q7: 如何确保巡检的质量?
A7: 可以通过以下方式确保巡检的质量:
- 制定详细的巡检 checklist
- 对巡检人员进行培训和考核
- 定期进行巡检结果的审核和抽查
- 引入自动化工具,减少人为错误
Q8: 如何处理大量的巡检数据?
A8: 可以使用数据分析工具对巡检数据进行分析和可视化,找出数据中的规律和异常。也可以建立巡检数据仓库,进行长期的趋势分析和预测。
Q9: 巡检与监控有什么区别?
A9: 巡检是定期进行的全面检查,而监控是实时或准实时的状态监控。巡检侧重于发现潜在问题和进行全面评估,而监控侧重于及时发现和告警当前的问题。两者相辅相成,共同保障数据库系统的稳定运行。
Q10: 如何将巡检结果与业务需求结合?
A10: 可以将巡检结果与业务需求结合,了解数据库性能对业务的影响,找出性能瓶颈,进行针对性优化。同时,可以根据业务的变化,调整巡检的重点内容和周期。
