如何让tidb运行sql不报错?

【 TiDB 使用环境】生产环境
【 TiDB 版本】7.1.0
【复现路径】做过哪些操作出现的问题
通过navciat将oracle190万(150mb)的数据进行数据传输到tidb,运行一会就报内存不够,修改参数,我把内存调整了到100GB任然报错,win服务器,内存128GB,设置了tidb_mem_quota_query = 100,如何让tidb能不报错,在该机器上我也安装了mysql,传输到mysql,传输到oracle都挺正常的,朝tidb导入就报错,使用tidb最大的感受就是容易报错,tidb能不能配置成像oracle那样不经常报错的?
具体错误就是:
Your query has been cancelled due to exceeding the allowed memory limit for a single SQL query. Please try narrowing your query scope or increase the tidb_mem_quota_query limit

【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
image

信息内容太少 windows 无法运行tidb 把架构图贴出来

1 个赞

你的查询超过了单条SQL最大可用内存限制,TiDB为了保证系统稳定性,避免OOM,对一条SQL的可用最大内存有限制。

报错说的很明白了,要么添加条件缩小查询的数据量,要么调大这个限制值,直接用SQL调大即可

set global tidb_mem_quota_query limit = 10 << 30;
改global的


“使用事务”不能勾选,数据量大就会OOM

1 个赞

TIDB默认限制了单个session最大使用内存为1G。

TiDB 6.5 之后的 OOM 问题已经得到了很大的改善,但是当遇到大量突发 SQL 性能问题时还是可能会影响到业务,这时可以结合 SQL Binding 和资源组,临时限制某个 SQL 的资源消耗。

以一个简单的笛卡尔积的 SQL 为例

1.直接执行 SQL

MySQL [cctest1]> select * from sbtest1 join sbtest2; ERROR 1105 (HY000): probeWorker[2] meets error: Your query has been cancelled due to exceeding the allowed memory limit for a single SQL query. Please try narrowing your query scope or increase the tidb_mem_quota_query limit and try again.[conn=7537998832357871515]

等待一段时间后 SQL 超出了 tidb_mem_quota_query 的限制被终止

2.创建一个资源组分很小的 RU

CREATE RESOURCE GROUP IF NOT EXISTS cc3 RU_PER_SEC = 1;

3.创建 SQL Binding

CREATE GLOBAL BINDING FOR SELECT * FROM sbtest1,sbtest2 USING SELECT /*+ RESOURCE_GROUP(cc3) */ * FROM sbtest1,sbtest2;

4.新建 SESSION 执行 SQL

MySQL [cctest1]> select * from sbtest1,sbtest2; ERROR 8252 (HY000): Exceeded resource group quota limitation

SQL 由于资源组的限制被终止,达到了临时限制某个 SQL 资源消耗的目的

navciat迁移时小表直接迁移,大表要做成条件过滤分段提交,这样就没问题了,我使用navciat迁移过各种国产数据库,各种情况都遇到过

我觉得应该是楼上说的,勾选了使用事务导致的。去掉试一下。

2 个赞

勾掉那个事务选项,你一次传输几亿条数据都不会有问题。
我测过oracle到tidb ,1.2亿条数据1个半小时跑完

Navicat熟练到这种程度么? :joy:

刚研究几天,我在寻找oracle到tidb数据迁移方案,发现最好用的是navicat的数据传输,速度很快,因为可以多表并发。
我测试的每秒能传2万条数据

如果数据量大,从oracle导出sql,然后去tidb执行会不会更快?

不会,导出到csv这一步都没传输过去快

不会吧,csv应该更快 :joy:

你有什么办法能快速导出大量csv吗,我没找到合适的工具

你去服务器上expdp本地导出啊肯定比navicat快

expdp能导出csv?,我要迁移到tidb的

从oracle导出csv用sqluldr2

也可以用datax,kettle,这种不落地也嗷嗷快