Dm同步数据配置文件新加同步表后,新增的任务表不同步

dm的配置文件最初使用正则表达式只同步t开头表,后来想同步所有表,修改配置文件为同步全部表。修改完配置文件后重启任务,但是非t开头的表没有同步。什么原因? 使用命令关闭重启: stop-task single start-task task.yaml 修改前:

# 任务名,多个同时运行的任务不能重名。
name: "syncer"
# 全量+增量 (all) 同步模式。
task-mode: "all"
# 下游 TiDB 配置信息。
target-database:
  host: "192.168.10.111"
  port: 4000
  user: "root"
  password: "SYUDS9UPfUnc2jSCZ6vya0B+SVgPhNvWQP0="

# 当前数据同步任务需要的全部上游 MySQL 实例配置。
mysql-instances:
-
  # 上游实例或者复制组 ID,参考 `inventory.ini` 的 `source_id` 或者 `dm-master.toml` 的 `source-id 配置`。
  source-id: "mysql"
  # 需要同步的库名或表名的黑白名单的配置项名称,用于引用全局的黑白名单配置,全局配置见下面的 `black-white-list` 的配置。
  black-white-list: "global"
  # mydumper 的配置项名称,用于引用全局的 mydumper 配置。
  mydumper-config-name: "global"
  loader-config-name: "global"
  syncer-config-name: "global"

# 黑白名单全局配置,各实例通过配置项名引用。
black-white-list:
  global:
    do-tables:                        # 需要同步的上游表的白名单。
    - db-name: "hydee"              # 需要同步的表的库名。
      tbl-name: "~^t.*"
# mydumper 全局配置,各实例通过配置项名引用。
mydumpers:
  global:
    mydumper-path: "./bin/mydumper"   # mydumper 二进制文件的路径。
    extra-args: "-B hydee --regex=t.*" 

loaders:
  global:
    pool-size: 16
    dir: "./dumped_data"

syncers:                                            # syncer 处理单元运行配置参数。
  global:
    worker-count: 5                                # syncer 并发同步 binlog event 的线程数量。
    batch: 5                                     # syncer 同步到下游数据库的一个事务批次 SQL 语句数。
    max-retry: 10 

修改后:

# 任务名,多个同时运行的任务不能重名。
name: "single"
# 全量+增量 (all) 同步模式。
task-mode: "all"
# 下游 TiDB 配置信息。
target-database:
  host: "192.168.10.111"
  port: 4000
  user: "root"
  password: "SYUDS9UPfUnc2jSCZ6vya0B+SVgPhNvWQP0="

# 当前数据同步任务需要的全部上游 MySQL 实例配置。
mysql-instances:
-
  # 上游实例或者复制组 ID,参考 `inventory.ini` 的 `source_id` 或者 `dm-master.toml` 的 `source-id 配置`。
  source-id: "mysql1"
  # 需要同步的库名或表名的黑白名单的配置项名称,用于引用全局的黑白名单配置,全局配置见下面的 `black-white-list` 的配置。
  black-white-list: "global"
  # mydumper 的配置项名称,用于引用全局的 mydumper 配置。
  mydumper-config-name: "global"
  loader-config-name: "global"
  syncer-config-name: "global"

# 黑白名单全局配置,各实例通过配置项名引用。
black-white-list:
  global:
    do-tables:                        # 需要同步的上游表的白名单。
    - db-name: "~.*"              # 需要同步的表的库名。
      tbl-name: "~.*"
# mydumper 全局配置,各实例通过配置项名引用。
mydumpers:
  global:
    mydumper-path: "./bin/mydumper"   # mydumper 二进制文件的路径。
    extra-args: "" 

loaders:
  global:
    pool-size: 16
    dir: "./dumped_data"

syncers:                                            # syncer 处理单元运行配置参数。
  global:
    worker-count: 5                                # syncer 并发同步 binlog event 的线程数量。
    batch: 5                                     # syncer 同步到下游数据库的一个事务批次 SQL 语句数。
    max-retry: 10 

还有一个问题:
有几次数据同步完之后,关闭数据库,关闭任务。然后重启数据库,重启任务,但是任务重启后重新同步,导致插入主键冲突暂停,怎么避免?

同步所有库所有表时,可以不配置黑白名单过滤规则

同步某个库下所有表时,可以只写

do-dbs: ["~^test.*"]   

详细内容可以参考官方文档:https://pingcap.com/docs-cn/v3.0/reference/tools/data-migration/features/overview/#black-white-table-lists

疑问点:关闭数据库,是指上游数据库还是下游数据库?

另外,DM 中启动前 5 分钟为了可重入行,开启 safe mode 模式。五分钟后关闭 safe mode。safe mode 转换如下,不会出现主键冲突的问题。

  • insert event 转化为 replace statement
  • update event 转化为 delete + replace statement (时序为 delete -> replace )
  • delete event 转化为 delete statement

关闭下游数据库

只写do-dbs: ["~^test.*"] 所有表都不同步了。
我把dm生成的库dm-meta删了,然后重启dm的任务,重新同步了所有的表。
这样的话有一个问题,如果我是生产环境,数据量很大,第一批只同步了部分表,后续想加入另一部分表,如果第一批已经同步的表需要重新同步,这样很浪费时间的,不能让后续的使用追加的方式加入吗?

第一批数据仍继续同步,后续想加入另一部分表,需要启动一个新的 task 任务来同步剩余部分表数据就可以。修改原 task 内容会影响当前同步任务。

哦哦,好的,谢谢