DM binlog缓存机制咨询

【 DM 使用环境】
v2.0.6

【场景概述】
N天前:添加了上游数据源A,并且使用A数据源启动同步任务a,同步部分表
现在:在之前基础上,新增任务,使用A数据源启动同步任务b,同步部分表

旧任务无异常
新添加的任务报错:get binlog event error: ERROR 1236 (HY000): Could not find first log file name in binary log index file

【问题】
我想要了解下DM的数据源管理机制。
1、对于同一个数据源A,若添加多个任务,那么会重复拉取多次binlog吗?
还是说配置的一个数据源A来负责拉取binlog和全量数据,其他任务都是由数据源A来分发
2、这个获取get binlog event error,是指的上游mysql的binlog删除了,还是数据源A缓存的资源被删除了导致获取不到?
3、如果用一个数据源A,我配置了多个,例如10个以上的任务,是否会导致上游mysql压力过大?

2赞

参考 DM同步时报错TCPReader get relay event with error: ERROR 1236 (HY000): Could not find first log file name in binary log index file , 可以尝试开启 dm relay log

v2.0.2 及之后的版本中,通过 start-relay 启动 relay log
https://docs.pingcap.com/zh/tidb-data-migration/stable/relay-log

2赞

你好,我已经阅读了该文档,但是疑问仍未解决

例如,对于同一个数据源,时间点A已运行10个sync任务,若后续时间点B中途加入新的sync任务,那么新任务默认全量+增量同步的位置,是从A点处开始,还是从B处开始。

如果是从B处开始的话,那么无法拉取到binlog这一异常不应该存在,这似乎不是relay log的问题。

还是说,对于配置的同一上游数据源,即使未开启dm relay log,添加多个任务时依旧会尝试从relay log拉取binlog,导致错误?

我认为正常情况,如果未开启relay log,dm的每个任务应该都会独立作为一个slave去拉取binlog?

2赞

新增同步任务b的步骤是什么样的,新增其他任务这个报错还能不能复现

2赞

DM工具均为默认配置,未主动操作开启relay log

详细操作步骤:
1、添加数据源A到DM
2、为数据源A开启同步任务a,过滤条件为mysql_tidb_test_db库,100张student_tab_xxx分表。目标为下游TiDB集群tidb_test_db库的student_tab表
3、等待N日
4、为数据源A开启同步任务b,过滤条件为mysql_tidb_test_db库,t1表。目标为下游TiDB集群tidb_test_db库的t1表。
开启任务后,a任务一直正常运行,b任务报错get binlog event error: ERROR 1236 (HY000): Could not find first log file name in binary log index file。
可复现

1赞

可以在日志或者 query-status 确认当前 task 报错的 binlog 位置,然后检查上游 mysql 对应的 binlog 及在 binlog.index 中是否存在

1赞

dm配置中,一个task中可以配置一个或者多个数据源,一个数据源对应一个worker,一个worker在上游mysql实例就是一个伪装的slave实例(show processlist 查看),每个伪装slave单独去拉取binlog,可以得出不同task中binlog不会共享,因为不同的task指定的数据源即便相同,在上游也有几个伪装slave。

1赞

你好,经过测试,我发现问题在于,我的这个任务并不会读取最新binlog,而是读取很久以前的binlog,该binlog已经上游数据源被删除。而新增的其他任务,则可以获取到最新binlog

我尝试过如下措施,依旧失败,我不知道为何该任务依旧尝试读旧binlog。我认为他此时应该存量同步最新数据,再拉取最新binlog:
1、stop-task停止任务
2、检查relaylog,发现relaylog未开启,故不作清理
3、清理TiDB相关表数据
4、start-task开启任务

配置如下

---
name: testdm
task-mode: all

target-database:
  host: "xxx"
  port: xxx
  user: "xxx"
  password: "xxx"

mysql-instances:
  - source-id: "mysql-test-01"
    block-allow-list:  "ba-rule1"

block-allow-list:
  ba-rule1:
    do-tables: 
    - db-name: "recon_tidb_test_db"
      tbl-name: "t1"

报错

"subTaskStatus": [
  {
      "name": "testdm",
      "stage": "Paused",
      "unit": "Sync",
      "result": {
          "isCanceled": false,
          "errors": [
              {
                  "ErrCode": 36069,
                  "ErrClass": "sync-unit",
                  "ErrScope": "upstream",
                  "ErrLevel": "high",
                  "Message": "get binlog event error: ERROR 1236 (HY000): Could not find first log file name in binary log index file",
                  "RawCause": "",
                  "Workaround": "Please check if the binlog file could be parsed by `mysqlbinlog`."
              }
          ],
          "detail": null
      },
      "unresolvedDDLLockID": "",
      "sync": {
          "totalEvents": "0",
          "totalTps": "0",
          "recentTps": "0",
          "masterBinlog": "(mysql-bin.007306, 698340072)",
          "masterBinlogGtid": "369ad544-3750-11ea-8dbe-924bb9f1abfb:558974463-558988345:558988347-1429798087,3fac809d-dd86-11eb-b746-82833076e3c1:1-1368006336",
          "syncerBinlog": "(mysql-bin.005558, 99468277)",
          "syncerBinlogGtid": "",
          "blockingDDLs": [
          ],
          "unresolvedGroups": [
          ],
          "synced": false,
          "binlogType": "remote",
          "secondsBehindMaster": "0"
      }
  }
]
1赞

上面记录 syncerBinlog 可能有点问题,这个表示 DM 已经处理完成的 binlog event 对应的 binlog 和 position,检查下游 {dm_meta} 库中的 {task-name}_syncer_checkpoint 记录的 binlog 是不是正确,在做完全量数据导入后这个表有没有更新过

1赞

你好,我发现dm_meta表中,无论我stop-task和start-task多少次,testdm_loader_checkpoint,testdm_syncer_checkpoint没有任何数据更新,依旧停留在很久以前的数据记录上。

在我删除这两张表后再次start-task,任务就正常了

1赞

可能是之前这个表的同名任务遗留的 meta 信息,start-task 重置任务时可以指定 remove-meta 清理
https://docs.pingcap.com/zh/tidb-data-migration/stable/faq#如何重置数据迁移任务