跳到主要内容

Db2 开启 CDC 表数据裁剪

简述

Db2 若开启了 CDC 数据捕获程序,对于所订阅的表的 CDC 变更都会记录到 CDC 表中,但为了避免 CDC 表的无限膨胀,CDC 捕获程序可以设置 CDC 表的裁剪机制来避免这个问题。

前置操作

首先需要变更日志模式为归档模式、开启 CDC 捕获程序、订阅所需要的表等。具体参见:Db2 开启 CDC 捕获程序

裁剪原理

在了解裁剪原理之前需要了解一些相关的 CDC 程序的表

  • IBMSNAP_CAPPARMS(CDC 运行参数)
  • IBMSNAP_PRUNCNTL(CDC 需要裁剪的表信息)
  • IBMSNAP_PRUNE_SET(CDC 裁剪表集合的位点信息)
  • IBMSNAP_REGISTER(CDC 所订阅表的信息)

CDC 裁剪是通过 PruneThread 裁剪线程对 CDC 表中的数据进行裁剪的。具体裁剪原理如下:

  • 首先,裁剪线程会读取 IBMSNAP_PRUNCNTL 表中需要裁剪的表以及它们的订阅集。
  • 接着,裁剪线程会根据 IBMSNAP_PRUNE_SET 中的 SYNC_POINT 来进行比较。
  • 裁剪线程会查找 IBMSNAP_REGISTER 订阅表的 CD_OLD_SYNCHPOINT 记录,并进行比较。
  • 只有当 CD_OLD_SYNCHPOINT 小于 SYNC_POINT 时,才会裁剪掉 SYNC_POINT 之前的 CDC 记录。
  • 裁剪成功后,会更新 IBMSNAP_REGISTER 表中的 CD_OLD_SYNCHPOINT 记录。

注意:此流程的目的是裁剪掉不再需要的 CDC 记录,以减少存储空间和提高性能。

裁剪相关配置参数

具体 CDC 运行参数解释,参见:IBMSNAP_CAPPARMS 表 - IBM 文档

参数含义
AUTOPRUNE是否开启自动裁剪。Y / N
PRUNE_INTERVAL裁剪的间隔时间,单位:分钟。1 -
RETENTION_LIMITCDC 表数据保留时间,单位:分钟
如果CD表未按正常条件进行裁剪,则可以设置一个备用的清理时间。
1 -
TRACE_LIMITCDC 程序日志信息的保留时间,单位:分钟1 -
MONITOR_LIMITCDC 监视器线程信息的保留时间,单位:分钟1 -
MONITOR_INTERVALCDC 监视器线程增加一行到 IBMSNAP_CAPMON 的频率,单位:秒1 -

操作步骤

初始化 CDC 捕获程序后,CDC 裁剪线程会根据上方相应的参数来决定裁剪相关的动作,当通过运行

CALL ASNCDC.ADDTABLE('<schema>', '<table>', '<prune_set_name>')

来订阅某个表时,IBMSNAP_REGISTER,IBMSNAP_PRUNCNTL 和 IBMSNAP_PRUNE_SET 里表的相关数据会被初始化, 之后你需要修改 IBMSNAP_REGISTER 里的 CD_OLD_SYNCHPOINT,可以设置为 0x00000000000000000000000000000000

此时,你只需要修改 IBMSNAP_PRUNE_SET 里对应记录的 SYNC_POINT;当到达裁剪周期时,SYNC_POINT 之前的所有 CDC 记录都会被裁剪掉。

注意:默认初始化的 AUTOPRUNE 设置为 N,也就是不会自动裁剪,需要执行下方的命令来实现手动裁剪。

VALUES ASNCDC.ASNCDCSERVICES('prune', 'asncdc')

同样,你可以将 AUTOPRUNE 设置为 Y,裁剪线程就会根据 PRUNE_INTERVAL 的频率来进行裁剪。

总结

本文介绍了 Db2 CDC 程序如何开启 CDC 表的自动清理功能,避免了 CDC 表的无线膨胀的问题。

其他 Db2 CDC 问题欢迎在评论区讨论交流。