Data Migration Task更改mysql data source來源方法且不漏資料?(ex: 來源mysql掛掉)

【TiDB 版本】: v5.0.0-rc

【Data Migration 版本】: v2.0.1

【问题描述】: 因線上Slave掛掉,需更改DM的source mysql(5.7),是否有標準的SOP?

原來源mysql: prd-c8-backup 172.31.2.4
新來源mysql: c8-db-dm 172.31.2.6
(皆有開啟GTID)

目前自己擬定的SOP如下: (若有錯再請顧問指正)
1. 修改conf/source-mysql-c8.yaml的server-id、source-id、host
#MySQL database: c8 Configuration.
server-id: 100522 => 100523
source-id: “prd-c8-backup” => “c8-db-dm”

#是否开启 GTID
enable-gtid: true

from:
host: “172.31.2.4” => “172.31.2.6”
user: “dm_repl”
password: “IVVprBI54LODorXTIbo6FkAelqrP0H1vPEtRxTR0ZW69”
port: 3306

2.修改conf/task_c8_replication.yaml
修改其中的source-id:c8-db-dm
mysql-instances:

source-id: "prd-c8-backup" => "c8-db-dm"

3. 移除掉原本的Data Source
bin/dmctl --master-addr=172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 operate-source stop source-mysql-c8

4.重新註冊Data Source
bin/dmctl --master-addr=172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 operate-source create conf/source-mysql-c8.yaml

5. 啟動Task: task_c8_replication.yaml
bin/dmctl -master-addr 172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 start-task conf/task_c8_replication.yaml

6.重啟此Task綁定的dm-worker(若是dm-worker1:172.31.13.107:8262)
bin/dmctl -master-addr 172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 query-status conf/task_c8_replication.yaml


tiup dm restart dm --node 172.31.13.107:8262

7. 重建Task
bin/dmctl -master-addr 172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 start-task conf/task_c8_replication.yaml

8.查看Task狀態
bin/dmctl -master-addr 172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 query-status conf/task_c8_replication.yaml

你好,看描述要求是变更上游 mysql 地址,可以参考官网


https://docs.pingcap.com/zh/tidb-data-migration/stable/usage-scenario-master-slave-switch#变更-dm-worker-连接的上游-mysql-实例地址

1 个赞

顧問好,

按照上述步驟執行,task卻重新做mydumper導出資料。

我的執行步驟如下:
1.停止task_c8_replication 紀錄syncerBinlogGtid
bin/dmctl -master-addr 172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 pause-task task_c8_replication

“syncerBinlogGtid”: “b5ac7bfd-6c32-11e7-af37-025b2e377831:1-629351209,aa990e65-990d-11ea-b941-026f542d2e08:1-376287”
2. 至新的來源mysql 查詢gtid_purged ( gtid-P) & gtid_executed(gtid-E)
gtid-P=“aa990e65-990d-11ea-b941-026f542d2e08:1-314691,
b5ac7bfd-6c32-11e7-af37-025b2e377831:1-628297403”

gtid-E=“aa990e65-990d-11ea-b941-026f542d2e08:1-314691,
b5ac7bfd-6c32-11e7-af37-025b2e377831:1-629982071”

dba@localhost:mysql.sock:[c8]> SELECT @@GLOBAL.gtid_purged;
±------------------------------------------------------------------------------------------------+
| @@GLOBAL.gtid_purged |
±------------------------------------------------------------------------------------------------+
| aa990e65-990d-11ea-b941-026f542d2e08:1-314691,
b5ac7bfd-6c32-11e7-af37-025b2e377831:1-628297403 |
±------------------------------------------------------------------------------------------------+

dba@localhost:mysql.sock:[c8]> SELECT @@GLOBAL.gtid_executed;
±------------------------------------------------------------------------------------------------+
| @@GLOBAL.gtid_executed |
±------------------------------------------------------------------------------------------------+
| aa990e65-990d-11ea-b941-026f542d2e08:1-314691,
b5ac7bfd-6c32-11e7-af37-025b2e377831:1-629982071 |
±------------------------------------------------------------------------------------------------+
3. stop-task
bin/dmctl -master-addr 172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 stop-task conf/task_c8_replication.yaml
4. stop data-source
bin/dmctl --master-addr=172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 operate-source stop conf/source-mysql-c8.yaml
5. 修改data source
#MySQL database: c8 Configuration.
server-id: 100522 => 100523
source-id: “prd-c8-backup” => “c8-db-dm”

#是否开启 GTID
enable-gtid: true

from:
host: “172.31.2.4” => “172.31.2.6”
user: “dm_repl”
password: “IVVprBI54LODorXTIbo6FkAelqrP0H1vPEtRxTR0ZW69”
port: 3306

6. create new data-source
bin/dmctl --master-addr=172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 operate-source create conf/source-mysql-c8.yaml

7.修改task_c8_replication.yaml
source-id: “prd-c8-backup” => “c8-db-dm”
8. 啟動task
bin/dmctl -master-addr 172.31.13.107:8261,172.31.13.108:8261,172.31.13.109:8261 start-task conf/task_c8_replication.yaml
{
“result”: true,
“msg”: “”,
“sources”: [
{
“result”: false,
“msg”: “[code=38032:class=dm-master:scope=internal:level=high], Message: some error occurs in dm-worker: ErrCode:36035 ErrClass:"sync-unit" ErrScope:"internal" ErrLevel:"medium" Message:"fail to initial unit Sync of subtask task_c8_replication : heartbeat config is different from previous used: serverID not equal, self: 100522, other: 100523" Workaround:"Please check heartbeat config in task configuration file." , Workaround: Please execute query-status to check status.”,
“source”: “c8-db-dm”,
“worker”: “dm-worker1”
}
]
}
9. 更新來源的server-id
dba@localhost:mysql.sock:[DM_HEARTBEAT]> SELECT * FROM HEARTBEAT;
±---------------------------±----------+
| ts | server_id |
±---------------------------±----------+
| 2021-01-24 19:22:45.798830 | 100522 |
±---------------------------±----------+
1 row in set (0.00 sec)

dba@localhost:mysql.sock:[DM_HEARTBEAT]> update HEARTBEAT set server_id=‘100523’ where server_id=‘100522’;
10. 重啟此dm-worker

11.查看task 狀態 (重新做dump … QQ)

重新 dump 看起来是有问题的,看起来这边操作过程中,是没有修改过 task_name
麻烦确认下:

  • 1.第二次操作前,当前任务是处于 dump / load /sync 哪个阶段?

  • 2.下游 tidb 数据库中 dm_meta 中 task_c8_replication_loader_checkpoint 以及 task_c8_replication_syncer_checkpoint 表是否存在,以及创建时间;

  • 3.是否有删除过下游的 dm_meta 中的位点信息或者配置 remove-meta,如果没有,辛苦提供下 dm-worker 的日志我们看下。

想询问一下,更换 mysql source 时候修改 server-id 和 source-id 的原因是什么?

因為前端的mysql有做更換,而其 server-id 不一樣 ,因此才去調整source-id & server-id。

这里使用上容易造成误解。我们需要对 DM 的一些概念进行澄清

source id 表示一个 replication group,replication group 包含多个主从实例,所以切换同一复制组的实例不需要更换 source id
server id 是 dm worker 伪装成一个 mysql slave 时自身的 server id,在和 mysql master 进行交互时候需要传递的值。

这两个值都不应该修改,我们产品和文档会为此进行调整优化

2 个赞

顧問好,

  1. 任務是處於在load階段
  2. 這兩個表目前皆存在
    創建時間如下:
    Timezone: UTC

    兩個表的dump file:
    task_c8_replication_loader_checkpoint.sql (280.8 KB)
    task_c8_replication_syncer_checkpoint.sql (940.2 KB)
  3. 沒有
    dm-worker log如下:
    dm-worker-log.tar.gz (2.5 MB)

IAN,

感謝告知此重要的information

1.麻烦确认下 clean-dump-files=true 是否为 true,如果没有更改过,默认值为 true。根据上面 loader 表中的 offset 信息,怀疑触发了这个 bug,会存在 load 数据丢失的情况,2.0.1 版本也有该问题,预计下一个版本会修复 https://github.com/pingcap/dm/issues/1377

临时解决方案:配置 clean-dump-files=false,重新导入数据。这样需要在 load 结束后手动清理 dump files
image

2.根据日志确认了下,上述第 10 步重启 task 前,处于 sync 阶段,重启 dm-worker 后,初始化 fail to initial unit Sync of subtask task_c8_replication 失败,后续有一些 --read-only 的报错,上游从库可能配置了只读参数,如果可以的话,辛苦提供下 dm-master leader 的日志,我们在看下。

[2021/01/26 10:29:49.195 +08:00] [ERROR] [subtask.go:310] [“unit process error”] [subtask=task_c8_replication] [unit=Sync]

image

3.如果是测试环境,建议按照上述 IANTHEREAL 的回复,不需要调整 source-id 和 server-id 在测试下 更改 mysql data source 的方式,如官网有问题,我们及时更新。感谢。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。