TiDB lightning 部分数据导入失败

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.5
  • 【问题描述】:从 v3.0.7 导出的全量数据导入时部分报错

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

麻烦上传下这个表的表结构,多谢。

Create Table: CREATE TABLE `org_memberfunction` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `function_id` varchar(50) COLLATE utf8_general_ci DEFAULT NULL,
  `member_id` varchar(50) COLLATE utf8_general_ci DEFAULT NULL,
  `member_type` int(11) DEFAULT NULL,
  `perm_value` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_functionmem_id_type` (`function_id`,`member_id`,`member_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=60263

这个表结构使我们修改过的,之前所有的表结构是

DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

我们修改了排序规则.
备份的语句是

/data01/mydumper-0.9.1/mydumper -h xxx.xxx.xxx.xxx -P 4000 -u root -p "" -B edoc2v5  -t 32 -F 256 --skip-tz-utc  -o /data01/edoc2v5

日志报错意思为执行 “alter table edoc2v5.org_memebrfunction auto_increment=60262;” 因为该表的这列的数据类型属性异常,需要确认一下是否可以手动执行。

另外为了快速导入,建议使用 importer 方式,会比 tidb backbone 要快。

下午排查看到很多表都有 auto_increment=n 这个参数配置,怀疑是因为这个配置导致部分数据写入失败。
于是就删除了所有表的 auto_increment=n 这个配置。不知道这个参数是否会造成数据写入失败?

我们是用的 local 导入方式
详细配置如下

[lightning]

# 转换数据的并发数,默认为逻辑 CPU 数量,不需要配置。
# 混合部署的情况下可以配置为逻辑 CPU 的 75% 大小。
# region-concurrency =

# 日志
level = "info"
file = "tidb-lightning.log"

[checkpoint]
# 是否启用断点续传。
# 导入数据时,TiDB Lightning 会记录当前表导入的进度。
# 所以即使 Lightning 或其他组件异常退出,在重启时也可以避免重复再导入已完成的数据。
enable = true
# 存储断点的数据库名称。
schema = "tidb_lightning_checkpoint"
# 存储断点的方式。
#  - file:存放在本地文件系统。
#  - mysql:存放在兼容 MySQL 的数据库服务器。
driver = "file"

[tikv-importer]
# backend 设置为 local 模式
backend = "local"
# 设置本地临时存储路径
sorted-kv-dir = "/home/tidb/backup/tmpdir"

[mydumper]
# Mydumper 源数据目录。
data-source-dir = "/tidb-backup/tidb-backup/backup"
filter = ['edoc2v5.*','!*.rpt_fileoperationcount']

[tidb]
# 目标集群的信息。tidb-server 的监听地址,填一个即可。
host = "127.0.0.1"
port = 4000
user = "root"
password = ""
# 表架构信息在从 TiDB 的“状态端口”获取。
status-port = 10080

去掉以后可以正常导入么?还是没有验证 ?

目前正在导入,暂时看不出结果。我们有个表有 2 亿多条数据。 表的 schema.sql 中的有个设置AUTO_INCREMENT=202776199 , 表的自增 id 只到202776200 就没有数据了。其他有相关配置的表情况类似。

应该和这个配置有关系,因为目前 TIDB 导入时默认会分批获取 3000 的 auto_increment 的字段,如果重复导入,会在新建的 tidb server 中获取新的一批的 cache 数值来随机填充,可能会触发获取最大 AUTO_INCREMENT=60263 的问题,还是建议在导入失败时候,手动先尝试创建一下,看看是否也是会有预期的执行失败报错。

好的,我观察一下导入程序,看下这次最终结果会不会缺少数据。到时候再反馈结果到这里。
非常感谢:heart:~

:call_me_hand:

您好,不好意思这么久回复
之前丢失数据的原因找到了。是因为备份时候没有设置 gc life time , 导致备份出来的数据本身就是不完整的。
感谢~

辛苦,如有其他问题,麻烦开新帖。

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