searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

DB2的CDC原理

2024-11-08 09:21:24
20
0

一、Db2 SQL复制原理

Capture 程序运行在源端的系统上。Capture 程序读取 Db2 的恢复日志来获取已更改的源端数据并将己落实的更改数据保存到CDC表。

 

Apply 程序从登台表中抓取 Capture 捕获的数据并将这些数据传递至目标端。

 

 

 

这个代理程序是DB2提供的asncap

 

 

另外,代理程序需要一系列的系统表,具体可参考:

 

 

这些系统表非常重要,并且需要自己创建,比如IBMSNAP_CAPTRACE,这个表记录了代理程序的运行日志,如果发现代理程序出现异常了,DB2的错误日志里并不会出现任何相关信息,这些信息只会记录在IBMSNAP_CAPTRACE表!!!

 

IBMSNAP_CAPPARMSCDC 运行参数)

IBMSNAP_PRUNCNTLCDC 需要裁剪的表信息)

IBMSNAP_PRUNE_SETCDC 裁剪表集合的位点信息)

IBMSNAP_REGISTERCDC 所订阅表的信息)

 

二、debezium db2 connector

1、前提

SQL 复制的 ASN Capture/Apply 代理

必须将要捕获更改的表置于捕获模式

 

 

2、工作原理

 

3、实验

为了方便测试 Debezium 提供了DB2用户定义函数 (UDF),编译后用于执行以下管理任务(也可以使用 Db2 命令)DB2UDF支持CC#Java等语言。

 

(1) 下载 Debezium管理用的UDF

 

(2) Db2服务器主机上使用Db2提供的bldrtn命令编译Debezium管理UDF

# UDF包拷贝到DB2数据库的容器中

docker cp  debezium-examples-main/tutorial/debezium-db2-init/db2server/ mydb2:/

 

# 进入容器,先切换用户,切换用户,切换用户,中间那个 - 不要忘了

su  -  db2inst1

 

# 按照步骤创建目录

mkdir -p asncdctools/src

mv /debezium-examples-main/tutorial/debezium-db2-init/db2server/* asncdctools/src/

 

# 这一步非常重要,如果不执行,编译时会提示找不到头文件

export PATH=$PATH:/opt/ibm/db2/V11.5/samples/c/

 

cd asncdctools/src/

 

# 编译

bldrtn asncdc

 

 

 

(3) 元数据绑定和数据备份

cd ../../sqllib/bnd/

 

# 元数据绑定

db2 connect to testdb

db2 bind db2schema.bnd blocking all grant public sqlerror continue

 

# 确保数据库最近进行过备份。ASN代理必须有一个最近的起始点进行读取。如果需要执行备份,请运行以下命令,这些命令会删除数据,以便只保留最新版本。如果不需要保留旧版本的数据,请指定dev/null作为备份位置。

db2 force application all

db2 backup db testdb to /dev/null

 

db2 restart db testdb

 

 

(4) 安装Debezium管理UDF

db2 connect to testdb

cd ../../

cp asncdctools/src/asncdc sqllib/function/

chmod 777 sqllib/function/

 

db2 -tvmf asncdctools/src/asncdc_UDF.sql

 

 

 

(5) 创建ASN控制表

db2 -tvmf asncdctools/src/asncdctables.sql

 

 

(6) 创建存储过程,将表添加到捕获模式以及从捕获模式中删除表

db2 -tvmf asncdctools/src/asncdcaddremove.sql

 

(7) 将表添加到捕捉模式中

# 必须开启Db2 for LUW数据库的归档日志,先检查

db2 get db cfg for testdb|grep LOGARCHMETH1

 

# 如果没有开启,则修改配置,然后重启DB2数据库

db2 update db cfg for testdb using LOGARCHMETH1 disk:/data/dbarc

db2stop force

db2start

 

# db2中增加设置表test.t1置于捕获模式,设置后ASN存储过程会自动在asncdc创建个表cdc_test_t1用来记录表变化的操作,这里需要注意,需要大写!

db2 "CALL ASNCDC.ADDTABLE('TEST', 'T1');"

 

(8) 启动或者重新初始化ASN代理服务

# 如果未启动,直接start

db2 "VALUES ASNCDC.ASNCDCSERVICES('start','asncdc');"

 

# 如果已经启动,reinit

db2 "VALUES ASNCDC.ASNCDCSERVICES('reinit','asncdc');"

 

# 查看状态

db2 "VALUES ASNCDC.ASNCDCSERVICES('status','asncdc');"

 

(9) DML操作,然后查看对应的CDC

Insert

 

 

Update:将name111修改为222,出现两条数据,先删除后insert

 

 

Delete

 

 

4、问题

db2的增量,数据类型方面有些问题:


1、不支持LONG VARCHAR,BINARY,VARBINARY,否则asn代理都无法启动;

 

2、xml类型,asn代理在写入cdc表时出现错误,原因未明;

 

3、lob类型,不会写cdc表

 

0条评论
作者已关闭评论
廖****兴
5文章数
0粉丝数
廖****兴
5 文章 | 0 粉丝
廖****兴
5文章数
0粉丝数
廖****兴
5 文章 | 0 粉丝
原创

DB2的CDC原理

2024-11-08 09:21:24
20
0

一、Db2 SQL复制原理

Capture 程序运行在源端的系统上。Capture 程序读取 Db2 的恢复日志来获取已更改的源端数据并将己落实的更改数据保存到CDC表。

 

Apply 程序从登台表中抓取 Capture 捕获的数据并将这些数据传递至目标端。

 

 

 

这个代理程序是DB2提供的asncap

 

 

另外,代理程序需要一系列的系统表,具体可参考:

 

 

这些系统表非常重要,并且需要自己创建,比如IBMSNAP_CAPTRACE,这个表记录了代理程序的运行日志,如果发现代理程序出现异常了,DB2的错误日志里并不会出现任何相关信息,这些信息只会记录在IBMSNAP_CAPTRACE表!!!

 

IBMSNAP_CAPPARMSCDC 运行参数)

IBMSNAP_PRUNCNTLCDC 需要裁剪的表信息)

IBMSNAP_PRUNE_SETCDC 裁剪表集合的位点信息)

IBMSNAP_REGISTERCDC 所订阅表的信息)

 

二、debezium db2 connector

1、前提

SQL 复制的 ASN Capture/Apply 代理

必须将要捕获更改的表置于捕获模式

 

 

2、工作原理

 

3、实验

为了方便测试 Debezium 提供了DB2用户定义函数 (UDF),编译后用于执行以下管理任务(也可以使用 Db2 命令)DB2UDF支持CC#Java等语言。

 

(1) 下载 Debezium管理用的UDF

 

(2) Db2服务器主机上使用Db2提供的bldrtn命令编译Debezium管理UDF

# UDF包拷贝到DB2数据库的容器中

docker cp  debezium-examples-main/tutorial/debezium-db2-init/db2server/ mydb2:/

 

# 进入容器,先切换用户,切换用户,切换用户,中间那个 - 不要忘了

su  -  db2inst1

 

# 按照步骤创建目录

mkdir -p asncdctools/src

mv /debezium-examples-main/tutorial/debezium-db2-init/db2server/* asncdctools/src/

 

# 这一步非常重要,如果不执行,编译时会提示找不到头文件

export PATH=$PATH:/opt/ibm/db2/V11.5/samples/c/

 

cd asncdctools/src/

 

# 编译

bldrtn asncdc

 

 

 

(3) 元数据绑定和数据备份

cd ../../sqllib/bnd/

 

# 元数据绑定

db2 connect to testdb

db2 bind db2schema.bnd blocking all grant public sqlerror continue

 

# 确保数据库最近进行过备份。ASN代理必须有一个最近的起始点进行读取。如果需要执行备份,请运行以下命令,这些命令会删除数据,以便只保留最新版本。如果不需要保留旧版本的数据,请指定dev/null作为备份位置。

db2 force application all

db2 backup db testdb to /dev/null

 

db2 restart db testdb

 

 

(4) 安装Debezium管理UDF

db2 connect to testdb

cd ../../

cp asncdctools/src/asncdc sqllib/function/

chmod 777 sqllib/function/

 

db2 -tvmf asncdctools/src/asncdc_UDF.sql

 

 

 

(5) 创建ASN控制表

db2 -tvmf asncdctools/src/asncdctables.sql

 

 

(6) 创建存储过程,将表添加到捕获模式以及从捕获模式中删除表

db2 -tvmf asncdctools/src/asncdcaddremove.sql

 

(7) 将表添加到捕捉模式中

# 必须开启Db2 for LUW数据库的归档日志,先检查

db2 get db cfg for testdb|grep LOGARCHMETH1

 

# 如果没有开启,则修改配置,然后重启DB2数据库

db2 update db cfg for testdb using LOGARCHMETH1 disk:/data/dbarc

db2stop force

db2start

 

# db2中增加设置表test.t1置于捕获模式,设置后ASN存储过程会自动在asncdc创建个表cdc_test_t1用来记录表变化的操作,这里需要注意,需要大写!

db2 "CALL ASNCDC.ADDTABLE('TEST', 'T1');"

 

(8) 启动或者重新初始化ASN代理服务

# 如果未启动,直接start

db2 "VALUES ASNCDC.ASNCDCSERVICES('start','asncdc');"

 

# 如果已经启动,reinit

db2 "VALUES ASNCDC.ASNCDCSERVICES('reinit','asncdc');"

 

# 查看状态

db2 "VALUES ASNCDC.ASNCDCSERVICES('status','asncdc');"

 

(9) DML操作,然后查看对应的CDC

Insert

 

 

Update:将name111修改为222,出现两条数据,先删除后insert

 

 

Delete

 

 

4、问题

db2的增量,数据类型方面有些问题:


1、不支持LONG VARCHAR,BINARY,VARBINARY,否则asn代理都无法启动;

 

2、xml类型,asn代理在写入cdc表时出现错误,原因未明;

 

3、lob类型,不会写cdc表

 

文章来自个人专栏
jvm知识
5 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0