Canal配置connector.subscribe和canal.instance.filter.regex遇到的坑

Canal配置connector.subscribe和canal.instance.filter.regex遇到的坑

背景介绍:

使用java连接canal获取mysql数据库binlog日志 传送门

从上篇文章可以看到canal的连接样例,
 

try {
            this.batchSize = canalProperties.getBatchSize();
            CanalConnector connector = CanalConnectors
                    .newSingleConnector(new InetSocketAddress(
                                    canalProperties.getIp(), Integer.valueOf(canalProperties.getPort())),
                            canalProperties.getDestinations(), "", "");
            connector.connect();
            connector.subscribe(".*\\..*"); //所有库所有表
            connector.rollback();
            CustomizationLogger.info(LOGGER, "canal connect success ...");
            this.connector = connector;
            this.runnable = true;
        } catch (CanalClientException e) {
            CustomizationLogger.info(LOGGER, "canal connect fail ...");
            canalContext.getCommonUtil().sendErrorReport(e);
        }

这里制定了消费订阅 所有表所有库connector.subscribe(".*\\..*"); 如果我想只订阅一个库或者几个单独的库单独的表要怎么操作呢?

方法一:修改canal deploy conf下example Instance.properties配置的过滤正则

canal.instance.filter.regex=.*\\..*

示例:

全库全表canal.instance.filter.regex

.*\\..*

.*\\..*

指定库全表

canal.instance.filter.regex


库名\..*  

test\..*
单表

canal.instance.filter.regex

库名.表名test.user
多规则组合使用

canal.instance.filter.regex

库名1\..*,库名2.表名1,库名3.表名2 (逗号分隔)

test\..*,test2.user1,test3.user2 (逗号分隔)

 

方法二:修改java程序下connector.subscribe配置的过滤正则

 

全库全表
connector.subscribe(".*\\..*")
指定库全表
connector.subscribe("test\\..*")

单表

connector.subscribe("test.user")

多规则组合使用

connector.subscribe("test\\..*,test2.user1,test3.user2")

注意:

如果修改了canal配置的instance文件,一定不要在客户端调用CanalConnector.subscribe(".*\\..*"),不然等于没设置canal.instance.filter.regex。配置根据CanalConnector.subscribe(”表达式“)里的正则表达式进行过滤

客户端配置后example的log日志:

            connector.subscribe("compatible_hrdata_deep\\..*"); 

如果 设置了canal.instance.filter.regex。 可以设置 connector.subscribe(); 不填写任何配置。

 

(如果一定要调用CanalConnector.subscribe(".*\\..*"),那么可以设置instance.properties的canal.instance.filter.black.regex参数添加黑名单,过滤非关注库表。

# table regex 设置白名单,如果在instance.properties配置文件中进行该项配置,则在代码中不应该再配置

# connector.subscribe(".*\\..*");,如果还在代码中配置,则配置文件将会失效!!!

canal.instance.filter.regex = .*\\..*

# table black regex 设置黑名单

canal.instance.filter.black.regex =

此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)

备注:

制定了正则过滤还会出现的能获取到其他库的变动情况,但是仅能获取到事务,不能获取到rowdata具体信息。

如果您使用的是 Canal 1.x 版本,可以按照以下步骤配置 Canal 支持事务: 1.Canal Server 的配置文件 `conf/canal.properties` 中,配置 `canal.instance.enableDdlSync=true`,表示开启 DDL 同步功能。 2.Canal Client 的配置文件 `conf/example/instance.properties` 中,配置 `canal.instance.filter.regex=.*`,表示同步所有的表。 3.Canal Client 的配置文件 `conf/example/instance.properties` 中,配置 `canal.instance.transactionSize=1000`,表示每次事务同步的最大条数为 1000。 4.Canal Client 的启动代码中,使用 `CanalConnector` 的 `connect()` 方法建立连接,并使用 `subscribe()` 方法订阅需要同步的数据库表。 5.Canal Client 的启动代码中,使用 `start()` 方法启动监听,然后使用 `while` 循环不断读取数据,直到程序停止。 如果您使用的是 Canal 2.x 版本,可以按照以下步骤配置 Canal 支持事务: 1.Canal Server 的配置文件 `conf/canal.properties` 中,配置 `canal.instance.enableDdlSync=true`,表示开启 DDL 同步功能。 2.Canal Client 的配置文件 `conf/canal.yaml` 中,配置 `destination: example`,表示指定同步的目标为 `example`。 3.Canal Client 的配置文件 `conf/canal.yaml` 中,配置 `filter: .*`,表示同步所有的表。 4.Canal Client 的配置文件 `conf/canal.yaml` 中,配置 `group: example`,表示使用 `example` 分组。 5.Canal Client 的启动代码中,使用 `CanalConnector` 的 `connect()` 方法建立连接,并使用 `subscribe()` 方法订阅需要同步的数据库表。 6.Canal Client 的启动代码中,使用 `start()` 方法启动监听,然后使用 `while` 循环不断读取数据,直到程序停止。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值