一、Db2 的SQL复制原理
Capture 程序运行在源端的系统上。Capture 程序读取 Db2 的恢复日志来获取已更改的源端数据并将己落实的更改数据保存到CDC表。
Apply 程序从登台表中抓取 Capture 捕获的数据并将这些数据传递至目标端。
这个代理程序是DB2提供的asncap。
另外,代理程序需要一系列的系统表,具体可参考:
这些系统表非常重要,并且需要自己创建,比如IBMSNAP_CAPTRACE,这个表记录了代理程序的运行日志,如果发现代理程序出现异常了,DB2的错误日志里并不会出现任何相关信息,这些信息只会记录在IBMSNAP_CAPTRACE表!!!
IBMSNAP_CAPPARMS(CDC 运行参数)
IBMSNAP_PRUNCNTL(CDC 需要裁剪的表信息)
IBMSNAP_PRUNE_SET(CDC 裁剪表集合的位点信息)
IBMSNAP_REGISTER(CDC 所订阅表的信息)
二、debezium db2 connector
1、前提
l 启动SQL 复制的 ASN Capture/Apply 代理;
l 必须将要捕获更改的表置于捕获模式;
2、工作原理
3、实验
为了方便测试, Debezium 提供了DB2的用户定义函数 (UDF),编译后用于执行以下管理任务(也可以使用 Db2 命令)。DB2的UDF支持C、C#和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:将name从111修改为222,出现两条数据,先删除后insert
Delete:
4、问题
db2的增量,数据类型方面有些问题:
1、不支持LONG VARCHAR,BINARY,VARBINARY,否则asn代理都无法启动;
2、xml类型,asn代理在写入cdc表时出现错误,原因未明;
3、lob类型,不会写cdc表