HOME

DB2 数据库配置参数详解:从 GET DB CFG 看懂内存、日志、锁与自动维护

文章目录25 节

一、这篇文章要解决什么问题

DB2 出现内存占用高、锁等待、日志空间不足、备份无法前滚或 SQL 执行计划异常时,经常会先执行:

# SAMPLEDB 是脱敏后的示例数据库名,使用时替换成现场数据库别名
DB_NAME="SAMPLEDB"
db2 get db cfg for "${DB_NAME}"

问题是,GET DB CFG 会一次输出近百个字段。如果只把输出保存下来,却不知道每个字段属于建库属性、运行状态还是可调整参数,后续很容易误判。

本文以一份脱敏后的 DB2 9.7 数据库配置为例,逐项说明这些参数控制什么、当前值意味着什么,以及修改时要注意哪些边界。

本文已做以下脱敏:

  • 数据库名统一写成 SAMPLEDB
  • 主机名、IP、业务系统名称和真实实例用户不出现。
  • 在线日志、镜像日志和备份目录统一使用变量或占位路径。
  • 不包含密码、备份文件名、时间戳和生产容量信息。

二、先学会读 DB CFG 输出

1. AUTOMATIC(数值) 不能照抄括号里的数值

例如:

Size of database shared memory (4KB) (DATABASE_MEMORY) = AUTOMATIC(941860)

真正的配置方式是 AUTOMATIC。括号里的 941860 是 DB2 根据当前机器资源和运行状态计算出的当前值。

迁移到另一台机器时,应保留 AUTOMATIC,不能直接写成:

# 错误示例:把一台机器的自动计算结果固定到另一台机器
db2 update db cfg for "${DB_NAME}" using DATABASE_MEMORY 941860

2. (4KB) 参数需要换算

计算方式:

实际字节数 = 参数值 × 4 KiB

例如 UTIL_HEAP_SZ=524288

524288 × 4 KiB = 2 GiB

3. 输出里不全是可修改参数

DB CFG 输出包含三类信息:

  • 建库属性:代码页、字符集、territory、排序序列和默认页大小,通常不能在线修改。
  • 配置参数:可以通过 UPDATE DB CFG 修改,但部分参数需要数据库重新激活才能生效。
  • 状态字段:例如 backup pending、rollforward pending,只表示当前状态,不能把它们当成普通参数修改。

三、当前示例配置的关键结论

在逐项展开前,先把最值得关注的地方列出来:

  1. 数据库为 GBK / CN / 4 KiB,属于建库属性。
  2. 已开启归档日志,但第一归档方式是 LOGRETAIN,没有真正的独立归档目录。失活日志可能长期滞留在在线日志区域。
  3. 单个日志文件约 39.06 MiB,50 个主日志约 1.91 GiB,最多 100 个辅助日志约 3.81 GiB。
  4. 配置镜像日志后,在线日志和镜像日志会各保存一套。若两个目录位于同一个文件系统,无法防护整个磁盘或逻辑卷故障。
  5. UTIL_HEAP_SZ=2 GiB,在小内存实验机上执行 BACKUP、RESTORE、LOAD、REORG 时需要观察内存压力。
  6. LOCKTIMEOUT=-1 表示锁可以无限等待。
  7. MAXLOCKS=98 允许单个应用使用接近整个锁列表后才触发锁升级。
  8. 自动备份和自动清理均关闭,备份文件、恢复历史和归档日志需要人工管理。
  9. HADR 参数没有配置,数据库角色是普通的 STANDARD

四、版本、字符集和建库属性

输出项示例值作用和影响
Database configuration release level0x0d00DB CFG 文件的内部格式版本,用于 DB2 判断配置结构。它不是性能参数。
Database release level0x0d00数据库磁盘格式的发布级别,升级数据库时可能变化,不能手工调整。
Database territoryCN建库时指定的区域,影响部分本地化、日期和排序默认行为。
Database code page1386GBK 对应的 DB2 代码页编号。
Database code setGBK数据库存储字符使用 GBK。客户端使用其他代码页时会发生字符集转换。无法映射的字符可能报错或失真。
Database country/region code86CN 对应的国家或区域代码。
Database collating sequenceUNIQUE决定字符串比较、排序、索引顺序和唯一约束判断。建库后不能普通更换。
ALT_COLLATE没有启用备用排序序列。
Number compatibilityOFF没有启用 Oracle 风格 NUMBER 兼容行为。
Varchar2 compatibilityOFF没有启用 Oracle VARCHAR2 兼容行为。
Date compatibilityOFF没有启用 Oracle DATE 兼容语义。
Database page size4096默认页大小为 4 KiB,影响默认缓冲池、表空间、行长度和部分对象容量上限。不能通过普通 DB CFG 改成 8K、16K 或 32K。

五、SQL 编译和优化器

参数示例值作用和影响
DYN_QUERY_MGMTDISABLE关闭旧式动态 SQL Query Management/Query Patroller 管理功能,不是禁止执行动态 SQL。
STMT_CONCOFF关闭语句集中器。仅文字常量不同的 SQL 不会自动统一成同一参数化语句,可能增加包缓存条目,但能保留针对具体常量选择执行计划的机会。
DISCOVER_DBENABLE允许旧式 DB2 Discovery 机制发现数据库。直接按主机、端口和数据库名连接不依赖它。
Restrict accessNO数据库未处于受限访问模式,拥有正常 CONNECT 权限的用户可以连接。这一行主要反映状态。
DFT_QUERYOPT5默认优化级别。5 在 SQL 编译时间和执行计划质量之间做平衡。
DFT_DEGREE1默认查询并行度为 1,即默认串行执行。实例级 INTRA_PARALLEL 也会影响并行能力。
DFT_SQLMATHWARNNO算术异常不会只记录警告后继续,相关 SQL 通常会失败。
DFT_REFRESH_AGE0默认不允许优化器使用过期的 MQT 数据。
DFT_MTTB_TYPESSYSTEM优化器按系统默认规则决定可使用哪些 maintained table/MQT 类型。
NUM_FREQVALUES10RUNSTATS 默认保存前 10 个高频值,帮助优化器识别数据倾斜。
NUM_QUANTILES20RUNSTATS 默认保存 20 个分位点,帮助估算范围条件的选择率。
DECFLT_ROUNDINGROUND_HALF_EVEN十进制浮点采用“银行家舍入”,中间值向偶数舍入,降低大量累计计算的系统性偏差。

六、备份、恢复和一致性状态

这些是状态字段,不是普通调优参数。

状态项示例值含义
Backup pendingNO当前不要求先做备份,数据库可以正常使用。从循环日志切换到归档日志后通常会变成 YES,首次完整备份后清除。
All committed transactions have been written to diskNO可能仍有已提交数据页停留在缓冲池中。它不代表已提交事务会丢失,事务日志仍保证持久性,异常后可通过崩溃恢复重做。
Rollforward pendingNO数据库没有等待前滚恢复。
Restore pendingNO数据库没有处于尚未完成的 RESTORE 状态。
Multi-page file allocation enabledYESDB2 可以批量分配多个页面或 extent,减少大量页面扩展时的分配开销。
Log retain for recovery statusRECOVERY数据库处于支持前滚恢复的归档日志模式。
User exit for logging statusNO没有使用旧式日志 user exit 程序。

七、数据库内存

参数示例值约算作用和影响
SELF_TUNING_MEMON开启 STMM。DB2 可以在数据库内存、缓冲池、包缓存和排序堆等自动参数之间调整资源。
DATABASE_MEMORYAUTOMATIC(941860)当前约 3.59 GiB数据库共享内存总预算。配置是 AUTOMATIC,括号内只是当前运行值。
DB_MEM_THRESH1010%数据库内存管理的安全余量或阈值,为可能临时超出目标的内存消费者保留空间。
LOCKLIST19328约 75.5 MiB整个数据库的锁列表内存。大事务持有大量行锁时会消耗它。
MAXLOCKS9898%单个应用使用锁列表达到该比例时尝试锁升级。98 很高,减少锁升级,但可能让单个大事务占用几乎全部锁内存。
PCKCACHESZAUTOMATIC(5110)当前约 20 MiB包缓存保存已编译 SQL section、静态包和动态 SQL 执行计划。过小会增加重新编译。
SHEAPTHRES_SHRAUTOMATIC(23320)当前约 91.1 MiB所有共享排序共同使用的总排序内存阈值。
SORTHEAPAUTOMATIC(1166)当前约 4.55 MiB/排序单个排序、哈希连接和分组操作的工作区目标。空间不足时会产生临时表空间 I/O。
DBHEAPAUTOMATIC(2614)当前约 10.2 MiB保存数据库级控制块、目录和内部结构。
CATALOGCACHE_SZ300约 1.17 MiB缓存表、索引、权限和包等系统目录信息。
LOGBUFSZ2561 MiB事务日志写入日志文件前的内存缓冲。
UTIL_HEAP_SZ5242882 GiBBACKUP、RESTORE、LOAD、REORG 等工具使用的工具堆上限。小内存机器要特别关注。
BUFFPAGE1000约 3.9 MiB旧式默认缓冲池页数参数。真实缓冲池大小应查询 SYSCAT.BUFFERPOOLS,不能只看这里。
STMTHEAPAUTOMATIC(8192)当前约 32 MiB/语句SQL 编译器和优化器处理单条复杂 SQL 时使用的内存。
APPLHEAPSZAUTOMATIC(256)当前约 1 MiB每个应用的控制信息、游标等使用的应用堆目标。
APPL_MEMORYAUTOMATIC(40000)当前约 156.25 MiB/应用内存集单个应用相关内存消费者的总体预算。
STAT_HEAP_SZAUTOMATIC(4384)当前约 17.1 MiBRUNSTATS 和统计信息处理使用的内存。

八、锁和死锁

参数示例值作用和影响
DLCHKTIME10000 ms每 10 秒检查一次死锁。值越小发现死锁越快,但检测开销会略有增加。
LOCKTIMEOUT-1锁等待没有超时限制,会一直等待锁释放、发生死锁或连接被中断。故障表现经常是 SQL 长时间没有返回。

排查锁问题时可以使用:

# 查看应用连接,重点确认 Application Handle、状态和数据库名
db2 list applications show detail

# 查看锁持有和等待关系
db2pd -db "${DB_NAME}" -locks

九、页面清理、预取和 I/O

参数示例值作用和影响
CHNGPGS_THRESH80缓冲池脏页达到相应阈值时推动异步页面清理。80 较高,可能在检查点或内存压力时集中写盘。
NUM_IOCLEANERSAUTOMATIC(3)异步页面清理线程数,括号内是 DB2 当前自动计算值。
NUM_IOSERVERSAUTOMATIC(3)异步 I/O 和预取服务器数,顺序扫描和预取会使用它们。
INDEXSORTYES创建索引时允许先排序索引键再构建,通常效率更高,但会使用排序内存和临时空间。
SEQDETECTYES自动识别顺序访问并触发预取,减少大范围扫描的同步磁盘等待。
DFT_PREFETCH_SZAUTOMATIC新建表空间未单独设置时,由 DB2 根据容器、extent 和 I/O 环境决定预取页数。
TRACKMODYES跟踪备份后发生修改的页面,为增量和差异备份提供依据,会增加少量跟踪开销。

十、表空间默认值和连接规模

参数示例值作用和影响
Default number of containers1默认表空间使用一个容器,不代表后续所有表空间只能有一个容器。
DFT_EXTENT_SZ32 pages新建表空间未指定 extent 时默认使用 32 页。4K 页数据库中每个 extent 为 128 KiB。
MAXAPPLSAUTOMATIC(40)数据库并发活动应用目标或上限由 DB2 自动管理,括号内不是实时连接数。
AVG_APPLSAUTOMATIC(1)优化器和内存管理对平均活动应用数的估算。
MAXFILOP61440单个应用可打开的数据库文件数量上限,主要影响大量表空间和容器的环境。

十一、活动日志

为避免暴露现场目录,以下使用变量表示路径:

# 按现场规划替换,在线日志和镜像日志最好位于不同故障域
ONLINE_LOG_DIR="/path/to/online-log"
MIRROR_LOG_DIR="/path/to/mirror-log"
参数示例值作用和影响
LOGFILSIZ10000 × 4KB单个日志文件约 39.06 MiB。过小会频繁切换,过大则预分配和恢复扫描更重。
LOGPRIMARY50预先存在的主日志数量,约占 1.91 GiB。镜像目录还会保存一套相同日志。
LOGSECOND100主日志不足时最多动态创建 100 个辅助日志,额外约 3.81 GiB。辅助日志不能代替对长事务的治理。
NEWLOGPATH当前没有等待下一次激活生效的新日志路径变更,不代表实际日志目录为空。
Path to log files<在线日志目录>/NODE0000/当前实际活动日志目录,文章中已脱敏。
OVERFLOWLOGPATH没有配置额外的恢复日志搜索路径。ROLLFORWARD 需要其他位置日志时应显式提供。
MIRRORLOGPATH<镜像日志目录>/NODE0000/每次日志写入同时写入镜像目录。如果两个目录在同一磁盘或逻辑卷上,无法抵御整个存储故障。
First active log fileS0000001.LOG恢复链中最早仍被视为活动的日志文件,会随事务和日志归档推进而变化。
BLK_LOG_DSK_FULNO日志盘满时不让数据库整体无限等待磁盘恢复,相关事务通常会收到日志空间错误。
BLOCKNONLOGGEDNO允许部分非日志或最小日志操作,可能影响完整前滚恢复能力,需要结合 LOAD、NOT LOGGED 等操作判断。
MAX_LOG0不限制单个事务最多占用主日志空间的百分比。
NUM_LOG_SPAN0不限制单个事务跨越的活动日志文件数。
MINCOMMIT1至少一个提交即可触发日志落盘,提交延迟低,但高并发时可能产生更多日志 I/O。
SOFTMAX520软检查点目标大约对应 5.2 个日志文件的恢复窗口。值越大,崩溃恢复可能需要扫描更多日志。
LOGRETAINRECOVERY旧参数形式,表示保留日志支持前滚恢复,与 LOGARCHMETH1=LOGRETAIN 是同一模式的两种显示。
USEREXITOFF不调用旧式用户自定义归档程序。

日志容量应按最坏情况计算:

单套最大日志空间 ≈ LOGFILSIZ × 4 KiB × (LOGPRIMARY + LOGSECOND)
配置镜像日志后,再乘以 2

十二、HADR 高可用

参数示例值作用和影响
HADR database roleSTANDARD当前不是 HADR PRIMARY 或 STANDBY,只是普通数据库。
HADR_LOCAL_HOST未配置本端 HADR 主机名。
HADR_LOCAL_SVC未配置本端 HADR 日志传输服务端口。
HADR_REMOTE_HOST未配置远端 HADR 主机名。
HADR_REMOTE_SVC未配置远端 HADR 日志传输端口。
HADR_REMOTE_INST未配置远端实例名。
HADR_TIMEOUT120启用 HADR 后,通信超过 120 秒无响应会被认为超时。当前 STANDARD 状态下不生效。
HADR_SYNCMODENEARSYNC启用 HADR 后,主库提交等待日志到达备库内存,但通常不等待备库日志落盘。当前不生效。
HADR_PEER_WINDOW0未启用 peer window。当前 STANDARD 状态下不生效。

十三、日志归档

参数示例值作用和影响
LOGARCHMETH1LOGRETAIN开启前滚恢复,但不主动把日志复制到独立归档目录。失活日志继续留在活动日志区域,需要人工搬运和清理。
LOGARCHOPT1第一归档方法没有附加选项。
LOGARCHMETH2OFF没有第二套归档目标。
LOGARCHOPT2第二归档方法没有附加选项。
FAILARCHPATH第一归档目标失败时没有备用归档目录。
NUMARCHRETRY5归档失败时最多重试 5 次。配置 DISK、TSM 或供应商归档后更有意义。
ARCHRETRYDELAY20 秒每次归档重试之间等待 20 秒。
VENDOROPT没有给第三方备份或归档库传递供应商选项。

如果实验环境不要求严格复刻 LOGRETAIN,可以考虑把归档日志写入独立备份卷:

# ARCHIVE_LOG_DIR 必须替换为现场规划的归档目录
ARCHIVE_LOG_DIR="/path/to/db2-archive/SAMPLEDB"
# 下面两个值是脱敏占位值,必须替换为现场 DB2 实例属主和管理组
DB2_INSTANCE_USER="your_db2_instance_user"
DB2_INSTANCE_GROUP="your_db2_instance_group"

mkdir -p "${ARCHIVE_LOG_DIR}"
chown "${DB2_INSTANCE_USER}:${DB2_INSTANCE_GROUP}" "${ARCHIVE_LOG_DIR}"
chmod 750 "${ARCHIVE_LOG_DIR}"

db2 update db cfg for "${DB_NAME}" using LOGARCHMETH1 "DISK:${ARCHIVE_LOG_DIR}"

上面示例中的 DB2_INSTANCE_USERDB2_INSTANCE_GROUPDB_NAMEARCHIVE_LOG_DIR 都是必须按现场替换的变量。改变归档模式后还要确认数据库是否进入 backup pending,并及时做一次完整备份。

十四、崩溃恢复、索引和恢复历史

参数示例值作用和影响
AUTORESTARTON数据库异常终止后,下次激活或连接时自动执行崩溃恢复。
INDEXRECSYSTEM (RESTART)继承系统设置,当前解析为 RESTART;需要重建的无效索引倾向于在数据库重启恢复阶段处理。
LOGINDEXBUILDOFF索引创建和重建不会完整记录索引页内容,可减少日志量;前滚恢复时相关索引可能需要重新构建。
DFT_LOADREC_SES1LOAD 恢复等场景默认使用 1 个恢复会话,资源占用低,但并行恢复能力有限。
NUM_DB_BACKUPS12恢复历史计划保留的数据库备份数量参考值。它本身不会自动删除物理备份。
REC_HIS_RETENTN366 天恢复历史记录默认保留 366 天,主要影响历史元数据。
AUTO_DEL_REC_OBJOFF不自动删除过期备份、归档日志和恢复历史对象,需要人工维护。

十五、TSM 备份参数

参数示例值作用和影响
TSM_MGMTCLASS未指定 IBM Tivoli Storage Manager/Storage Protect 管理类。
TSM_NODENAME未配置 TSM 节点名。
TSM_OWNER未配置 TSM owner。
TSM_PASSWORD未在 DB CFG 中保存 TSM 密码。

这些字段为空时,不能据此判断本地文件系统备份是否存在,只能说明 DB CFG 没有配置对应 TSM 参数。

十六、自动维护

参数示例值作用和影响
AUTO_MAINTON自动维护总开关开启,但各子功能仍由自己的开关决定。
AUTO_DB_BACKUPOFFDB2 不会自动执行数据库备份,需要由人工、cron、脚本或备份平台调度。
AUTO_TBL_MAINTON自动表维护总开关开启。
AUTO_RUNSTATSONDB2 可以自动更新表和索引统计信息,帮助优化器生成合理执行计划。
AUTO_STMT_STATSON收集语句使用信息,帮助自动统计机制判断实际 SQL 需要哪些统计数据。
AUTO_STATS_PROFOFF不自动生成统计 profile。
AUTO_PROF_UPDOFF不自动更新或应用统计 profile。
AUTO_REORGOFF不自动重组表和索引。大量更新或删除后,需要人工执行 REORGCHK 和 REORG。

十七、自动重验证、并发语义和 XML

参数示例值作用和影响
AUTO_REVALDEFERRED对象变更导致包、视图或例程失效时,延迟到下次使用时再尝试重验证。
CUR_COMMITON在 Cursor Stability 等隔离级别下,读取遇到未提交更新时可以读取最近已提交版本,减少读写阻塞。
DEC_TO_CHAR_FMTNEWDECIMAL 转字符采用较新的 DB2 格式规则,兼容旧应用时要关注输出差异。
ENABLE_XMLCHARYES允许 DB2 支持的 XML 与字符类型相关操作和转换。
WLM_COLLECT_INT0不按固定分钟间隔采集 WLM 聚合统计。0 表示关闭周期性采集。

十八、监控数据采集

参数示例值作用和影响
MON_REQ_METRICSBASE采集请求级基础指标,开销低,详细度有限。
MON_ACT_METRICSBASE采集活动和 SQL 执行基础指标。
MON_OBJ_METRICSBASE采集表、索引和缓冲池等对象的基础指标。
MON_UOW_DATANONE不采集完整工作单元事件数据。
MON_LOCKTIMEOUTNONE不生成锁超时事件记录。
MON_DEADLOCKWITHOUT_HIST采集死锁事件,但不附带完整历史活动信息。
MON_LOCKWAITNONE不采集普通锁等待事件。
MON_LW_THRESH5000000锁等待事件阈值约为 5 秒;只有启用锁等待事件采集后才真正发挥作用。
MON_PKGLIST_SZ32监控工作单元事件时最多保留 32 个包列表条目。
MON_LCK_MSG_LVL1锁事件通知级别为 1,提供基础锁消息。

十九、其他可选参数

参数示例值作用和影响
SMTP_SERVER没有配置 SMTP 服务器。
SQL_CCFLAGS没有设置 SQL 条件编译标志。
SECTION_ACTUALSNONE不采集执行计划节点的实际行数等 section actuals 数据,监控开销低,但难以比较估算值与实际值。
CONNECT_PROC用户连接数据库时不自动调用连接过程。

二十、DB CFG 看不到什么

GET DB CFG 只覆盖数据库级参数。下面这些信息必须从其他位置检查:

# 实例级配置:服务端口、认证、最大连接等
db2 get dbm cfg

# DB2 注册表变量:DB2COMM 等
db2set -all

# 实际缓冲池配置
db2 "select bpname, pagesize, npages from syscat.bufferpools"

# 表空间状态
db2 list tablespaces show detail

# 将 0 换成上一步输出的实际数字 ID
TBSP_ID=0
db2 list tablespace containers for "${TBSP_ID}" show detail

# 当前数据库内存使用
db2pd -db "${DB_NAME}" -memsets

# 当前日志使用和恢复链
db2pd -db "${DB_NAME}" -logs

# 当前应用和锁
db2 list applications show detail
db2pd -db "${DB_NAME}" -locks

其中 TBSP_ID=0 只是示例值,执行前必须替换为目标表空间的实际数字 ID。

二十一、建议的巡检顺序

以后拿到一份陌生数据库的 CFG,可以按下面顺序判断:

  1. 先看代码页、页大小和排序序列,确认建库属性是否符合应用要求。
  2. 看 backup pending、rollforward pending 和 restore pending,确认数据库是否处于特殊恢复状态。
  3. 看 DATABASE_MEMORY、缓冲池、排序堆和工具堆,判断内存配置是否与主机资源匹配。
  4. 看 LOCKLIST、MAXLOCKS、LOCKTIMEOUT 和死锁监控,判断阻塞问题是否容易被发现。
  5. 计算 LOGFILSIZ、LOGPRIMARY、LOGSECOND 和镜像日志的最大磁盘占用。
  6. 确认 LOGARCHMETH1 是否有真正的归档目标,以及归档日志由谁清理。
  7. 确认备份是否自动执行、恢复历史保留多久、旧文件是否自动删除。
  8. 最后结合 DBM CFGdb2set、表空间、缓冲池和实时 db2pd 数据判断,不能只凭一份静态 DB CFG 下结论。

二十二、总结

GET DB CFG 的价值不在于保存一份长输出,而在于建立参数之间的联系:

  • 内存参数决定数据库能在内存里完成多少工作。
  • 锁参数决定并发冲突如何等待、升级和暴露。
  • 活动日志决定事务峰值能撑多久。
  • 归档日志和备份共同决定能恢复到什么时间点。
  • 自动维护和监控参数决定问题能否提前发现。

真正做配置迁移时,还要特别区分“固定配置值”和 AUTOMATIC(当前值)。只有配置方式可以复用,当前运行值必须让目标机器重新计算。

Linux DB2 数据库 性能调优 运维 技术分享