TiDB Binlog Drainer报错

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

  • 【TiDB 版本】:V3.0.5
  • 【问题描述】:TiDB Binlog Drainer报错,Drainer进程自动退出
    集群中共有3个TiDB,对应有3个Pump进行binlog采集,然后使用一个Drainer,将binlog同步到mysql中,但是启动后,drainer报错自动退出。日志显示是Cannot add foreign key constraint, 我在下游 Mysql中SET FOREIGN_KEY_CHECKS=0; 但是仍然不起作用。
    drainer.log (303.2 KB)

这种情况建议把这种表手工在 mysql 建好,让后使用ignore-txn-commit-ts跳过。

1、ignore-txn-commit-ts具体在哪里设置? 2、手动建好表之后,再启动Drainer,会不会重复建表而导致失败?

在 conf/drainer.toml 文件中配置即可。手动建完之后再起来就行 它会跳过去。

按照昨天的建议,我先建好表跳过去之后,在插入数据的过程中,又出现了错误,drainer日志如下。我猜测可能是上下游的sql_mode不一致导致的,下游的mysql使用的阿里的RDS,其sql_mode是STRICT_TRANS_TABLES,global.sql_mode为空,而TiDB的会话和全局的sql_mode都是ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,我将TiDB的sql_mode改为和RDS的一致,但是启动之后还是报错,请大佬帮忙排查一下,到底是不是这个sql_mode的原因,应该怎么样修改?
drainer0.log (1.5 MB)

我看最后的日志是 Cannot add or update a child row: a foreign key constraint fails (hivemeta.sds, CONSTRAINT SDS_FK1 FOREIGN KEY (SERDE_ID) REFERENCES serdes (SERDE_ID) ON DELETE NO ACTION ON UPDATE NO ACTION)"] [errorVerbose="Error 1452: Cannot add or update a child row: a foreign key constraint fails (hivemeta.sds, CONSTRAINT SDS_FK1 FOREIGN KEY (SERDE_ID) REFERENCES serdes (SERDE_ID) ON DELETE NO ACTION ON UPDATE NO ACTION) 不是很建议 tidb 使用外建约束

tidb并没有使用外键约束,会话的foreign_key_checks和global.foreign_key_checks都是OFF状态,但是下游RDS Mysql的默认是开启的,而且RDS默认至允许修改单个会话连接的foreign_key_checks=0,不允许set global.foreign_key_checks。请问drainer_mysql_drainer.toml这个文件里面怎么添加配置项,让drainer在连接下游数据库之后set foreign_key_checks=0。 另外,每次drainer_mysql_drainer.toml之后,直接启动drainer就可以使得配置生效了吧,需不需要再重新depoly drainer?

  1. set foreign_key_checks=0 没有办法放到配置文件中
  2. 如果要在 drainer_mysql_drainer.toml 添加配置项,直接编辑文件并重启就会生效

好的。另外再请教一个问题,我使用tidb-enterprise-tools-latest-linux-amd64里面的dumper将TiDB的全量数据做下备份,现在想导入mysql中,但是使用loader的时候发生了错误,这个loader支持从TiDB到Mysql吗,loader前需要事先在下游mysql中新建tidb_loader的库吗?

参考这里

我就是参考这个文档操作的,但是没有成功

从错误信息来看,是 loader 没有连上数据库,你先检查一下

之前的问题已经解决了,是下游没有创建tidb_loader库的权限导致的。现在在loader的过程中又出现了其他的错误,应该还是foreign_key_checks的原因,但是下游RDS无法设置global.foreign_key_checks,set foreign_key_checks=0 也没有办法放到配置文件中,这样的话是不是无解了?

下游不能设置,其实放配置文件中也没有用处,建议问一下下游有没有什么解决方案

下游是可以设置单次会话的,set foreign_key_checks=0是可以的,但是不能设置global.foreign_key_checks,每一次loader连接都是一次新的会话,我的想法是在loader连接成功后就设置本次会话的foreign_key_checks=0,然后再进程load,但是配置文件目前不支持

loader的源码开源了吗?找了一圈没有找到,只看到了myloader的代码

下游是mysql吗? 是否每个新建的链接都需要设置set foreign_key_checks=0才可以,如果是这样,是否可以尝试使用触发器,设置每次链接的时候先set foreign_key_checks=0?

常规的mysql触发器都是对表的增删改的,好像有没有针对新连接的吧? loader的源码暂时是没有开源的是吗? 要是开源了,简单修改一下,每次新建连接都set一下应该就可以了

您好: 请看一下https://github.com/pingcap/tidb-binlog 满足要求吗?

抱歉,忘了回复了。我修改了tidb-binlog 中的drainer代码,重新编译运行了一下,现在问题已经解决了。

1 个赞