dm 全量导入数据到tidb后,tidb的表没有收集统计信息

请问下各位老师,利用dm 把从mysql的数据导入到tidb,将mysql的数据全量导入出来,然后全量导入到tidb后,发现tidb的表没有收集统计信息,这点很困惑,请问下是什么原因?
dm 导入全量数据到tidb的时候用的是lightning 的tidb模式,会不会跟这个有关?

我直接用lightning 导入healthy 也是0 ,我都是手工analyze table 处理的

tidb和mysql的统计信息是不太一样的吧,导入这个动作应该是不会自动收集统计信息的,需要你手动收集吧?

这个可能的确是和lightning 的tidb模式 有关系。dm 从v6后就默认使用lightning 的tidb模式来导入全量的数据且 lightning 的tidb模式 默认的参数是optional ,是不收集统计信息的。
[post-restore]
# 配置是否在导入完成后对每一个表执行 ADMIN CHECKSUM TABLE <table> 操作来验证数据的完整性。
# 可选的配置项:
# - “required”(默认)。在导入完成后执行 CHECKSUM 检查,如果 CHECKSUM 检查失败,则会报错退出。
# - “optional”。在导入完成后执行 CHECKSUM 检查,如果报错,会输出一条 WARN 日志并忽略错误。
# - “off”。导入结束后不执行 CHECKSUM 检查。
# 默认值为 “required”。从 v4.0.8 开始,checksum 的默认值由此前的 “true” 改为 “required”。
#
# 注意:
# 1. Checksum 对比失败通常表示导入异常(数据丢失或数据不一致),因此建议总是开启 Checksum。
# 2. 考虑到与旧版本的兼容性,依然可以在本配置项设置 truefalse 两个布尔值,其效果与 requiredoff 相同。
checksum = “required”
# 配置是否在 CHECKSUM 结束后对所有表逐个执行 ANALYZE TABLE <table> 操作。
# 此配置的可选配置项与 checksum 相同,但默认值为 “optional”。
analyze = “optional”

1 个赞

我是将mysql的数据导入到了tidb,按理来说,导入的过程中就是在tidb上执行sql,按理来说,tidb的统计信息应该更新才对

跟这个没啥关系,这个是说lightning导入完成后,是否 对所有表逐个执行 ANALYZE TABLE <table> 操作。

统计信息在导入数据过程中应该是要默认触发去更新的

你用的是tidb模式吗

tidb是有自动收集统计信息的机制,但是并不是在你在对表进行操作后就一定触发的,要看你对应analyze的参数呀。


你导入数据不选逐个analyze的话,就得等自动收集,而且如果一次性导入太多太大的表,自动收集未必都能够完成。

在导入数据到tidb的时候(利用lighting的tidb模,执行replace sql语句导数),tidb的表数据量是不断增加的,按理来说,是要触发统计信息的

触发自动收集统计信息有两个条件,1是表更改阈值达到我上面发的第一个参数,2是时间在自动收集统计信息区间范围之内

我觉得肯定是达到了,表不停的插入数据,不太可能达不到

show stats_healthy看看

应该是找到原因磊


假设是否存在这样1个情况,全量导入数据的过程中,表不停在插入数据,导致统计信息不会自动收集,
然后增量同步的时候,增量同步的数据量比较少,达不到触发统计信息的触发阈值(0.5),然后表的统计信息就一直没有自动收集过
然后再加上表数据量本身比较大,同步数据量过少,达不到触发自动收集的条件
应该就是这个原因了
https://docs.pingcap.com/zh/tidb/v6.1/sql-faq

自动analyze 有问题,慢

这个问题吃过亏,夜里迁移数据lightning导入tidb,第二天上午一堆慢sql,紧急analyze table :joy:

表数据1分钟之内没有写入,才会触发统计信息,感觉这个设计还是有点粗糙, 不知道其它数据库会怎么样?会不会有这种类似的机制

还是建议导入以后马上手工analyze 一下