作者:魔幻之翼
【是否原创】是\ 【首发渠道】TiDB 社区
【目录】\ DM 过滤可用的方案整理
- 标准的按照库或者表执行过滤
- DDL 出错 handle-error 跳过
- Binlog event filter 支持比表更细的粒度
【正文】\ 整个故事的开端和来源: dm 如何过滤表整理语句
目前从上游同步的方案有以下几种:
-
采用Mysql 相关的第三方订阅binlog的服务
-
阿里的 Canal
- Maxwell
- mysql_streamer
- debezium
-
flink (对 debezium进行进一步的封装达成一些特性需求)
-
官方生态工具DM
这里主要描述下官方的生态工具DM,DM在运行和实践过程中,总会遇到一些问题:
- DDL 造成的同步失败\ 如果是DDL 造成的同步失败,可以采用 handle-error 跳过
``` 启用 dmctl 运行 handle-error test skip ,查看运行结果 运行 query-status test , 查看运行结果
其中 test 是当前的任务名称 ```
\ 主要参考文档:\ https://docs.pingcap.com/zh/tidb-data-migration/dev/handle-failed-ddl-statements#handle-error
-
同步过程中,发现有一些 语句需要跳过
-
可以通过库名和表名,以及相关的动作进行过滤\ 以下是官方提供的配置示例:
``` 定义全局的数据源操作过滤规则
filters: # 定义过滤数据源特定操作的规则,可以定义多个规则 filter-rule-1: # 规则名称 schema-pattern: "test_" # 匹配数据源的库名,支持通配符 "" 和 "?" table-pattern: "t_" # 匹配数据源的表名,支持通配符 "" 和 "?" events: ["truncate table", "drop table"] # 匹配上 schema-pattern 和 table-pattern 的库或者表的操作类型 action: Ignore # 迁移(Do)还是忽略(Ignore) filter-rule-2: schema-pattern: "test" events: ["all dml"] action: Do
在数据源配置中引用数据源操作过滤规则,过滤该数据源的指定库或表的指定操作
mysql-instances: - source-id: "mysql-replica-01" # 从 source-id = mysql-replica-01 的数据源迁移数据 block-allow-list: "bw-rule-1" # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list filter-rules: ["filter-rule-1"] # 过滤数据源特定操作的规则,可以配置多个过滤规则 - source-id: "mysql-replica-02" # 从 source-id = mysql-replica-02 的数据源迁移数据 block-allow-list: "bw-rule-2" # 黑白名单配置名称,如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white-list filter-rules: ["filter-rule-2"] # 过滤数据源特定操作的规则,可以配置多个过滤规则 ```
主要参考文档:\ https://docs.pingcap.com/zh/tidb-data-migration/stable/task-configuration-guide#配置需要过滤的操作
- 需要更细的粒度,直接通过binlog 进行过滤
```
过滤分库分表的所有删除操作
需要设置下面两个 Binlog event filter rule 来过滤掉所有的删除操作:
filter-table-rule过滤掉所有匹配到 patterntest_*.t_*的 table 的turncate table、drop table、delete statement操作。filter-schema-rule过滤掉所有匹配到 patterntest_*的 schema 的drop database操作。
filters: filter-table-rule: schema-pattern: "test_" table-pattern: "t_" events: ["truncate table", "drop table", "delete"] action: Ignore filter-schema-rule: schema-pattern: "test_*" events: ["drop database"] action: Ignore ```
主要参考文档:\ https://docs.pingcap.com/zh/tidb-data-migration/stable/key-features#binlog-event-filter
过滤可以参考的表达式:https://github.com/google/re2/wiki/Syntax
以上整理的实践过程,希望能帮助大家,如果有遗漏或者补充的地方,欢迎回贴!共同完善!





