Dam1029
(Dam1029)
2019 年12 月 2 日 09:05
1
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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跳过。
Dam1029
(Dam1029)
2019 年12 月 2 日 09:19
3
1、ignore-txn-commit-ts具体在哪里设置?
2、手动建好表之后,再启动Drainer,会不会重复建表而导致失败?
在 conf/drainer.toml 文件中配置即可。手动建完之后再起来就行 它会跳过去。
Dam1029
(Dam1029)
2019 年12 月 3 日 03:07
5
按照昨天的建议,我先建好表跳过去之后,在插入数据的过程中,又出现了错误,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)
Dam1029:
按照昨天的建议,我先建好表跳过去之后,在插入数据的过程中,又出现了错误,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 使用外建约束
Dam1029
(Dam1029)
2019 年12 月 3 日 06:09
7
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?
Dam1029
(Dam1029)
2019 年12 月 3 日 08:41
9
好的。另外再请教一个问题,我使用tidb-enterprise-tools-latest-linux-amd64里面的dumper将TiDB的全量数据做下备份,现在想导入mysql中,但是使用loader的时候发生了错误,这个loader支持从TiDB到Mysql吗,loader前需要事先在下游mysql中新建tidb_loader的库吗?
从错误信息来看,是 loader 没有连上数据库,你先检查一下
Dam1029
(Dam1029)
2019 年12 月 3 日 12:16
13
之前的问题已经解决了,是下游没有创建tidb_loader库的权限导致的。现在在loader的过程中又出现了其他的错误,应该还是foreign_key_checks的原因,但是下游RDS无法设置global.foreign_key_checks,set foreign_key_checks=0 也没有办法放到配置文件中,这样的话是不是无解了?
下游不能设置,其实放配置文件中也没有用处,建议问一下下游有没有什么解决方案
Dam1029
(Dam1029)
2019 年12 月 3 日 13:46
15
下游是可以设置单次会话的,set foreign_key_checks=0是可以的,但是不能设置global.foreign_key_checks,每一次loader连接都是一次新的会话,我的想法是在loader连接成功后就设置本次会话的foreign_key_checks=0,然后再进程load,但是配置文件目前不支持
Dam1029
(Dam1029)
2019 年12 月 4 日 02:20
16
loader的源码开源了吗?找了一圈没有找到,只看到了myloader的代码
yilong
(yi888long)
2019 年12 月 4 日 02:34
17
下游是mysql吗? 是否每个新建的链接都需要设置set foreign_key_checks=0才可以,如果是这样,是否可以尝试使用触发器,设置每次链接的时候先set foreign_key_checks=0?
Dam1029
(Dam1029)
2019 年12 月 4 日 02:54
19
常规的mysql触发器都是对表的增删改的,好像有没有针对新连接的吧? loader的源码暂时是没有开源的是吗? 要是开源了,简单修改一下,每次新建连接都set一下应该就可以了
yilong
(yi888long)
2019 年12 月 4 日 03:32
20
您好:
请看一下https://github.com/pingcap/tidb-binlog 满足要求吗?
Dam1029
(Dam1029)
2019 年12 月 6 日 11:03
21
抱歉,忘了回复了。我修改了tidb-binlog 中的drainer代码,重新编译运行了一下,现在问题已经解决了。
1 个赞