select * from tbl; 全表查询 sql 报 [Err] Out of memory,tidb 日志中存在 expensive_query

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

  • 【TiDB 版本】:TiDB-v3.1.0
  • 【问题描述】:select语句查询时报[Err] Out of memory
    我的服务器的性能:四台服务器,配置一样,都是16C,内存256g,硬盘是SSD,四块,容量是960G*4。一台复用TIDB-server和PD,一台复用PD和TIKV,剩下两台纯TIKV。每个TIKV上是2个实例,共6个实例。我安装的时候配置的每个TIKV的capacity: “64GB”。
    若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

sql 执行消耗的内存太大,oom 了,分页查询看下,tidb-server 会将查询的结果都缓存在内存中的

看了一下这个表1个多g,还好吧

我的 SQL 的内存使用阈值为32GB

看下当时 tidb.log ,可以上传下


帮忙看一下,谢谢

https://github.com/pingcap/tidb/blob/297acf7e824dccf010e4f6e03460d4df4280e1b5/config/config.toml.example#L34

可以修改下 mem-quota-query = 1073741824,在日志中 mem_max 大概到了 968M+

image
我原本的就是32个g,足够了啊

看下 tidb 监控中

此两项的值,
另外请问当前有多少个 tidb-server 呢?是如何修改这个参数的呢?

image
image
一个tidb_server

目前是通过什么方式部署的呢,看着像是参数并没有生效,请问是如何修改参数的呢

TiDB Ansible部署的,这个参数我没修改,我是TiDB-v3.1.0版本,默认就是32g的

这个只是改时间,和sql执行的内存没关系吧。我现在的问题是,sql执行out of memory,但是这个执行的过程占用的内存才接近1G,我sql内存的阈值是32g,为啥会溢出呢?

该 log 会记录运行超时、或使用内存超过阈值的 SQL。

先调整下,执行此 sql 看是否还是会出现这个问题。

PS:建议将集群升级到 v4.0.2,v3.1 的功能在 4.x 有很好的优化。

好的,我先试下

ok,有问题可以继续跟帖我们看下

image
image
改过了,问题依然存在,请帮忙看一下,谢谢。

另外还有个问题请教一下,我用DM同步mysql-tidb的数据时,两边同是lantin-1的字符集编码,为什么同步后显示的却不一样:
mysql的:
image
image
tidb的:
image
image

image
建议更改下上游 mysql 中的字符集类型为 utf8mb4/utf8
否则到下游会乱码。

请反馈下执行 select 时间点的 tidb.log 上下文 20 行。