创建从 mysql 8.0 的迁移任务失败

【 TiDB 使用环境】测试

【 TiDB 版本】8.1

【遇到的问题:问题现象及影响】

创建 DM 迁移任务,从 mysql 8.0 同步到 TiDB,mysql为mgr集群

创建 task 失败,出现奇怪的问题:

1、sql_require_primary_key: off

在非 mgr mysql 的环境(单机或主从,gtid关闭或撕开),sql_require_primary_key: 0 是ok的。而mgr为上游则必须配置为off,配置为0/1均出错,不支持该值,配置成on会导致无法创建meta相关表

2、Error 1049 (42000): Unknown database ‘xxxx’。上游有对应的 db,且大小写完全符合,账号使用的权限为 ALL ON .

任务配置文件内容:
name: “xxx”
task-mode: all
shard-mode: pessimistic
strict-optimistic-shard-mode: false
meta-schema: dba_dm_meta
case-sensitive: false
online-ddl: true
clean-dump-file: true
collation_compatible: strict

mysql-instances:

  • source-id: “xxx”
    mydumper-thread: 4
    loader-thread: 16
    syncer-thread: 16
    validator-config-name: full
    block-allow-list: do-dbs

target-database:
host: “xxxx”
port: 3306
user: “xxxx”
password: “xxx”
session:
sql_require_primary_key: off
collation_database: utf8mb4_general_ci

validators:
full:
mode: none
worker-count: 4
row-error-delay: 30m

block-allow-list:
do-dbs:
do-dbs: [“infra_fss”, “unified_cache”]

有什么报错或者日志吗?

是 MySQL → MySQL 么?

把完整的报错内容给发一下吧,看到底报什么错

把mysql日志发出来

得看看日志

仔细校对下名字呢,有时候可能会写错

  1. sql_require_primary_key 配置问题
  • 在使用 MySQL Group Replication (MGR) 作为上游数据库时,DM 工具要求 sql_require_primary_key 参数必须显式设置为 OFF。这是因为在 MGR 环境中,由于某些复制的特殊情况,可能存在没有主键的表,DM 需要能够处理这种情况。
  • 如果设置为 01,DM 可能会认为表应该有主键,而当遇到没有主键的表时就会报错。设置为 ON 会导致 DM 在创建元数据表时失败,因为 DM 会期望所有表都有主键。
  1. Unknown database 错误
  • 这个错误表明 DM 尝试访问一个在上游 MySQL 中不存在的数据库。尽管你提到上游确实存在该数据库,且大小写符合,权限为 ALL ON,但仍然需要检查几个方面:
    • 确认数据库名称的大小写是否与 MySQL 的大小写敏感设置匹配。MySQL 8.0 默认情况下是大小写敏感的,除非指定了 lower_case_table_names 参数为 1
    • 检查连接 DM 使用的 MySQL 账号是否真的有访问该数据库的权限。可以尝试手动用该账号连接到 MySQL 并访问数据库,看是否能够成功。
    • 确认 DM 配置文件中的数据库连接信息是否正确,包括主机、端口、用户名、密码等。
  1. 其他可能的问题
  • 检查 DM 版本是否与 MySQL 8.0 和 TiDB 兼容。
  • 确认 DM 配置文件中的其他配置项是否正确,比如 source-id 是否指向正确的 MySQL 实例。
  • 检查 MySQL 的二进制日志是否启用,并且 DM 是否能够正确读取日志。
  1. 解决方案
  • 确保 sql_require_primary_key 设置为 OFF
  • 重新检查并确认数据库名称的大小写,以及 DM 使用的账号权限。
  • 检查 MySQL 的 show variables like 'lower_case_table_names'; 输出,确保其值与你的数据库名称匹配。
  • 检查 DM 的日志文件,获取更详细的错误信息,以便进一步诊断问题。

DM 同步:
mysql->tidb

大小写问题:
库名只有小写字母,配置中也是通过复制取的库名,所以应该不存在大小写的问题

权限验证:
在 dm 服务器(dm为单点集群,master/worker都在同一台服务器上)上,mysql客户端连接验证,下面的查询执行正常(use 的两个库为需要同步的库)
show databases;
use infra_fss;
show tables;
use unified_cache;
show tables;

DM 8.1、mysql 8.0.23,另一套相同版本的mysql同步正常(主从架构,出问题的这套是mgr架构

异常信息 – dmctl start-task config_前面已经给出:
{
“result”: false,
“msg”: “”,
“sources”: [
],
“checkResult”: “[code=26005:class=dm-master:scope=internal:level=medium], Message: fail to check synchronization configuration with type: check was failed, please see detail
detail: {
“results”: [
{
“id”: 12,
“name”: “table structure compatibility check”,
“desc”: “check compatibility of table structure”,
“state”: “fail”,
“errors”: [
{
“severity”: “fail”,
“short_error”: “Error 1049 (42000): Unknown database ‘infra_fss’”
}
]
}
],
“summary”: {
“passed”: false,
“total”: 13,
“successful”: 12,
“failed”: 1,
“warning”: 0
}
}”
}

需要看看日志,定位问题。

task 都没有创建成功,没有日志哦

怀疑是在第一次报 sql_require_primary_key 出错之后,遗留了什么数据信息导致(有试过加 --remove-meta ,没有解决问题)
目前把 TiDB+DM 集群都 destroy 之后重建,问题没有再复现

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