### DB2 常见问题分析 #### 一、DB2 故障诊断与日志收集 当 DB2 数据库主机遇到重大故障时,我们可以通过 `db2support` 工具来快速收集数据库的诊断日志数据。这些数据对于后续的问题定位至关重要。 - **在可以连接的情况下**: ```shell db2support -dsample -c -g -s ``` 上述命令将会收集当前系统的样本数据,并包括连接信息、系统概览以及服务级别信息。 - **在无法连接的情况下**: ```shell db2support -c -g -s ``` 当无法正常连接数据库时,可以使用该命令来收集部分必要的日志信息。 #### 二、Buffer Pool 设置问题及解决方案 如果 Buffer Pool 的设置过大,可能会导致在连接数据库时系统出现宕机的情况。以下是一种解决方法: 1. **临时调整 Buffer Pool 大小**: ```shell db2set DB2_OVERRIDE_BPF=10000 ``` 此命令用于临时设置 Buffer Pool 的大小为 10000。 2. **重启数据库服务**: - 关闭所有应用程序: ```shell db2terminate db2force applications all ``` - 停止并重新启动 DB2 服务: ```shell db2stop db2start ``` 3. **调整 Buffer Pool 的具体配置**: - 首先连接到数据库: ```shell db2connect to db ``` - 禁用过大的 Buffer Pool: ```shell db2alter bufferpool buffer001 numblockpages ``` - 再次连接到数据库并调整 Buffer Pool 大小至合适的数值(例如 50000): ```shell db2alter bufferpool buffername immediate size 50000 ``` 4. **还原 Buffer Pool 设置**: ```shell db2set DB2_OVERRIDE_BPF= ``` 5. **再次重启数据库服务**: - 关闭所有应用程序: ```shell db2terminate db2force applications all ``` - 停止并重新启动 DB2 服务: ```shell db2stop db2start ``` #### 三、快速定位问题 根据系统资源使用情况,可以初步判断问题所在: 1. **CPU 使用率高而 I/O 较少**:可能意味着数据库正在执行大量的排序操作。 2. **I/O 繁忙且 CPU 等待时间较长**:表明数据库可能存在过多的 I/O 操作。 3. **CPU 和 I/O 都较为空闲**:可能是由于存在锁的问题。 4. **CPU 和 I/O 同时非常繁忙**:说明可能存在执行代价非常高的 SQL 语句。 #### 四、快速找到执行成本较高的 SQL 语句 1. **开启监控器**: ```shell db2update monitorswitches using bufferpool on lock on sort on statement on table on uow on ``` 以上命令用于打开监控器的各种开关。 2. **获取应用程序快照**: 在系统最繁忙的时候运行以下命令: ```shell db2get snapshot for all applications > app.out ``` 在生成的文件 `app.out` 中查找处于 Executing 状态的应用程序,并找到对应的 SQL 语句。 3. **收集 SQL 快照**: 如果通过上述方法仍然无法找到问题所在,则可以进一步收集 SQL 的快照: ```shell db2get snapshot for dynamic sql on > sql.out ``` #### 五、SQL 语句优化 1. **使用 db2expln 分析 SQL 执行计划**: 将问题 SQL 语句写入文本文件(以分号结尾),并运行: ```shell db2expln –d db_name -f sql_file -g -o sql.explain ``` 查看 `sql.explain` 文件以了解 SQL 的执行成本。 2. **使用 db2advis 优化 SQL**: 如果确认 SQL 语句存在问题,可以尝试通过建立索引来优化: ```shell db2advis -d -i sql_file ``` #### 六、处理锁问题 1. **检查数据库配置参数** `locktimeout`,确保其不被设置为 `-1`,避免引起无限期等待。 2. **收集快照以确定锁问题类型**: ```shell db2get snapshot for db on ``` 通过查看输出结果中的 Deadlocks detected 和 LockTimeouts 来判断是否存在死锁或锁等待问题。 3. **创建死锁监视器**: 当检测到死锁时,可以通过创建死锁监视器来进一步分析原因: ```shell mkdir /tmp/dlmon db2connect to dbname db2create eventmonitor dlmon for deadlock with detail write to file '/tmp/dlmon' replace db2set eventmonitor dlmon state 1 ``` 等待死锁发生后,停止监视器并分析日志文件: ```shell db2set eventmonitor dlmon state 0 db2evmon -d /tmp/dlmon > /tmp/dlmon.out ``` 通过上述方法,不仅可以有效诊断和解决 DB2 数据库中的各种故障和性能问题,还能针对具体场景采取合理的优化措施,提高数据库的稳定性和性能。
































- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源


