【是否原创】是
【首发渠道】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` 过滤掉所有匹配到 pattern `test_*` . `t_*` 的 table 的 `turncate table` 、 `drop table` 、 `delete statement` 操作。
* `filter-schema-rule` 过滤掉所有匹配到 pattern `test_*` 的 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
以上整理的实践过程,希望能帮助大家,如果有遗漏或者补充的地方,欢迎回贴!共同完善!