暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

TiDB DM filter 实践整理

魔幻之翼 2021-07-30
321

作者:魔幻之翼

原文来源:https://tidb.net/blog/5ad1c8e9

【是否原创】是\ 【首发渠道】TiDB 社区

【目录】\ DM 过滤可用的方案整理

  1. 标准的按照库或者表执行过滤
  2. DDL 出错 handle-error 跳过
  3. Binlog event filter 支持比表更细的粒度

【正文】\ 整个故事的开端和来源: dm 如何过滤表整理语句

目前从上游同步的方案有以下几种:

  1. 采用Mysql 相关的第三方订阅binlog的服务

  2. 阿里的 Canal

  3. Maxwell
  4. mysql_streamer
  5. debezium
  6. flink (对 debezium进行进一步的封装达成一些特性需求)

  7. 官方生态工具DM

这里主要描述下官方的生态工具DM,DM在运行和实践过程中,总会遇到一些问题:

  • DDL 造成的同步失败\ 如果是DDL 造成的同步失败,可以采用 handle-error 跳过

``` 启用 dmctl 运行 handle-error test skip ,查看运行结果 运行 query-status test , 查看运行结果

其中 test 是当前的任务名称 ```

image

\ 主要参考文档:\ 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 tabledrop tabledelete 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

以上整理的实践过程,希望能帮助大家,如果有遗漏或者补充的地方,欢迎回贴!共同完善!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论