这个问题很简单,稍微看看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问题。
©
著作权归作者所有,转载或内容合作请联系作者

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