简述 {#简述}
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_LIMIT | CDC 表数据保留时间,单位:分钟 如果CD表未按正常条件进行裁剪,则可以设置一个备用的清理时间。 | 1 - | | TRACE_LIMIT | CDC 程序日志信息的保留时间,单位:分钟 | 1 - | | MONITOR_LIMIT | CDC 监视器线程信息的保留时间,单位:分钟 | 1 - | | MONITOR_INTERVAL | CDC 监视器线程增加一行到 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 问题欢迎在评论区讨论交流。