MySQL:MySQL客户端缓存结果导致OOM


这个问题很简单,稍微看看mysql客户端的代码上下文即可


一、问题相关

有返回了笛卡尔积数据,导致mysql客户端吃光了内存


image.png

这种这个mysql客户端线程将会oom导致kill。

二、问题分析

对于select语句来讲,对于mysql客户端而言是交互式模式而不是batch模式。

#9  0x000000000041b2ed in cli_read_rows (mysql=0xaf4760 <mysql>, mysql_fields=0x1e4bf60, fields=26) at ../../mysql-8.0.20/sql-common/client.cc:3013
#10 0x000000000041f615 in mysql_store_result (mysql=mysql@entry=0xaf4760 <mysql>) at ../../mysql-8.0.20/sql-common/client.cc:7333
#11 0x000000000040e1a8 in mysql_store_result_for_lazy (result=0x7ffc05aaf8f8) at ../../mysql-8.0.20/client/mysql.cc:3055
#12 0x0000000000410f3c in com_go (buffer=buffer@entry=0xaf4680 <glob_buffer>, line=line@entry=0x0) at ../../mysql-8.0.20/client/mysql.cc:3299
#13 0x0000000000412cee in add_line (buffer=..., truncated=false, ml_comment=<synthetic pointer>, in_string=<synthetic pointer>, line_length=<optimized out>, line=0x1e41d70 "select * from city,country,countrylanguage,user;") at ../../mysql-8.0.20/client/mysql.cc:2532
#14 read_and_execute(bool) () at ../../mysql-8.0.20/client/mysql.cc:2287
#15 0x0000000000409ccf in main () at ../../mysql-8.0.20/client/mysql.cc:1432
#16 0x00007f70cd61f505 in __libc_start_main () from /lib64/libc.so.6
#17 0x000000000040a730 in _start () at ../../mysql-8.0.20/include/my_alloc.h:86

com_go函数会实际的执行sql语句。然后翻开这个函数可以看到如下代码:

if (quick) {
      if (!(result = mysql_use_result(&mysql)) && mysql_field_count(&mysql)) {
        error = put_error(&mysql);
        goto end;
      }
    } else {
      error = mysql_store_result_for_lazy(&result);
      if (error) goto end;
    }

说明如果quick为ture那么可以不走mysql_store_result_for_lazy分支,那么看看mysql -q的含义:

  -q, --quick         Don't cache result, print it row by row. This may slow
                      down the server if the output is suspended. Doesn't use
                      history file.

因此我们在mysql 命令加上-q 就可以解决由于大数据集缓存导致的OOM问题。



喜欢的朋友记得点赞、收藏、关注哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值