Canal配置connector.subscribe和canal.instance.filter.regex遇到的坑
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具体信息。
更多推荐




所有评论(0)