DM filter 实践整理

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

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

  1. 标准的按照库或者表执行过滤

  2. DDL 出错 handle-error 跳过

  3. Binlog event filter 支持比表更细的粒度

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

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

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

    • 阿里的 Canal

    • Maxwell

    • mysql_streamer

    • debezium

    • flink (对 debezium进行进一步的封装达成一些特性需求)

  2. 官方生态工具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

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

6赞

前排围观~

前排围观

前排围观

前排围观

前排围观

:horse:

来晚了,后排围观~