1436 – 线程栈溢出:使用131072字节堆栈的6136字节,需要128000字节。

错误1436对应于mysql 5.1代码中的ER_STACK_OVERRUN_NEED_MORE:

malff@linux-8edv:include> pwd

/home/malff/BZR_TREE/mysql-5.1/include

malff@linux-8edv:include> grep 1436 mysqld_error.h

#define ER_STACK_OVERRUN_NEED_MORE 1436

打印错误的代码是在sql / sql_parse.cc中,

function check_stack_overrun():

bool check_stack_overrun(THD *thd, long margin,

uchar *buf __attribute__((unused)))

{

long stack_used;

DBUG_ASSERT(thd == current_thd);

if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >=

(long) (my_thread_stack_size - margin))

{

char ebuff[MYSQL_ERRMSG_SIZE];

my_snprintf(ebuff, sizeof(ebuff), ER(ER_STACK_OVERRUN_NEED_MORE),

stack_used, my_thread_stack_size, margin);

my_message(ER_STACK_OVERRUN_NEED_MORE, ebuff, MYF(ME_FATALERROR));

从所看到的值,margin为128000,my_thread_stack_size为131072。

只能调用check_stack_overrun()来尝试保留128000个字节来自:

bool

sp_head::execute(THD *thd)

{

/* Use some extra margin for possible SP recursion and functions */

if (check_stack_overrun(thd, 8 * STACK_MIN_SIZE, (uchar*)&old_packet))

DBUG_RETURN(TRUE);

STACK_MIN_SIZE的值为16000:

malff@linux-8edv:sql> pwd

/home/malff/BZR_TREE/mysql-5.1/sql

malff@linux-8edv:sql> grep STACK_MIN_SIZE *.h

mysql_priv.h:#define STACK_MIN_SIZE 16000 // Abort if less stack during eval.

到目前为止,一切都符合服务器的预期:

>代码执行一个触发器,它被实现

sp_head ::执行。

> MySQL运行时检查堆栈中至少有128000个字节

>此检查失败(正确地如此),并且触发器执行以错误结束。

MySQL触发器执行所需的堆栈数量并不取决于触发器复杂性本身或所涉及的表的内容/结构。

真正的问题是,我猜,为什么thread_stack只有128K(131072)。

名为“thread_stack”的服务器变量在C中以“my_thread_stack_size”的形式在sql / mysqld.cc中实现:

{"thread_stack", OPT_THREAD_STACK,

"The stack size for each thread.", &my_thread_stack_size,

&my_thread_stack_size, 0, GET_ULONG, REQUIRED_ARG,DEFAULT_THREAD_STACK,

1024L*128L, ULONG_MAX, 0, 1024, 0},

1024L * 128L是此参数的最小值。

默认值为DEFAULT_THREAD_STACK,它在include / my_pthread.h中定义:

#ifndef DEFAULT_THREAD_STACK

#if SIZEOF_CHARP > 4

/*

MySQL can survive with 32K, but some glibc libraries require > 128K stack

To resolve hostnames. Also recursive stored procedures needs stack.

*/

#define DEFAULT_THREAD_STACK (256*1024L)

#else

#define DEFAULT_THREAD_STACK (192*1024)

#endif

#endif

因此,默认情况下,堆栈大小应为192K(32位)或256K(64位架构)。

首先,检查mysqld二进制文件是如何编译的,看看是什么默认值:

malff@linux-8edv:sql> pwd

/home/malff/BZR_TREE/mysql-5.1/sql

malff@linux-8edv:sql> ./mysqld --no-defaults --verbose --help | grep thread_stack

...

--thread_stack=# The stack size for each thread.

thread_stack 262144

在我的系统上,我在64位平台上得到256K。

如果有不同的值,也许有人使用不同的编译选项构建服务器,例如-DDEFAULT_THREAD_STACK(或只是修改源代码)…我会问这个二进制文件在哪里。

其次,检查my.cnf中的配置文件本身提供的默认值。

将线程设置为thread_stack(并且具有较低值)的行将明确地导致所看到的错误。

最后,检查服务器日志文件是否有这样的错误(请参阅sql / mysqld.cc):

sql_print_warning("Asked for %lu thread stack, but got %ld",

my_thread_stack_size, (long) stack_size);

服务器代码调用:

> pthread_attr_setstacksize()来设置堆栈大小

> pthread_attr_getstacksize()来验证线程真正具有多少堆栈

并在日志中抱怨pthread库使用较少。

长篇小说,出现错误是因为与服务器附带的默认值相比,thread_stack太小了。

这可能发生:

>在做自定义构建服务器时,使用不同的编译

选项

>更改my.cnf文件中的默认值

>如果pthread库本身出现问题(从理论上讲)

阅读代码,我从来没有看过它)。

我希望这回答这个问题。

问候,

– 马克·阿尔夫

更新(2014-03-11),使“如何修复”更明显。

在很可能的情况下,在my.cnf文件中更改了thread_stack文件的默认值。

如何修复它是微不足道的,然后找到thread_stack在my.cnf文件中设置的位置,并删除该设置(相信服务器代码提供一个不错的默认值,所以下次不会再发生)或增加堆栈尺寸。

mysql 1436_MySQL错误1436:线程堆栈溢出,用简单的查询相关推荐

  1. linux线程堆栈溢出检测,GCC栈溢出检测技术

    前一段时间在写ucontext的协程库的时候,遇到了栈空间溢出问题,然后就想到要研究一下堆栈溢出检测的相关技术. 欢迎批评指正,如果对汇编有一个语法问题可以看我之前的一片文章,协程:posix::uc ...

  2. mysql存储过程中as_mysql - 存储过程mySQL语法错误意外“ AS” - 堆栈内存溢出

    我正在编写一个存储过程,如下所示 我得到的错误是在第3行和第4行,这两个错误是第3行是"意外的'发布者'标识符",第4行是"意外的AS(as)",但我不知道我是 ...

  3. python 堆栈溢出_PWN简单堆栈溢出漏洞利用(一) | kTWO-个人博客

    摘要 本文将详细讲述PWN二进制漏洞中简单的堆栈利用,本文将从原理开始讲述,然后层层深入,让读者从理解到动手操作,能够跟着教程完成所有操作. 0x01 环境和程序准备 安装有pwntools的kali ...

  4. mysql打平子表_对于oracle进行简单树查询(递归查询)

    DEPTID PAREDEPTID NAME NUMBER NUMBER CHAR (40 Byte) 部门id 父部门id(所属部门id) 部门名称 通过子节点向根节点追朔. Sql代码 selec ...

  5. MySQL代码错误号大全

    · 错误:1000 SQLSTATE: HY000 (ER_HASHCHK) 消息:hashchk · 错误:1001 SQLSTATE: HY000 (ER_NISAMCHK) 消息:isamchk ...

  6. mysql中创建视图语法错误_mysql - 使用过程MySQL创建视图时出错 - 堆栈内存溢出

    尝试使用过程创建视图时出现问题. 我必须这样做,因为我需要在MySQL中发挥作用,将表的行转换为另一个表的列. 该查询效果很好,但是当我将其放在" CREATE VIEW"语句中时 ...

  7. mysql堆溢出_为什么这个MySQL触发器会导致堆栈溢出?

    我今天遇到了同样的问题,每次触发都会导致堆栈溢出.原来我的Zend社区服务器安装附带了一个默认的my.cnf文件,其中thread_stack大小设置为128K,这导致每个线程中可用于堆栈的13107 ...

  8. 45.JVM调优策略、常见问题:内存泄漏(年老代堆空间被占满、持久代被占满、堆栈溢出、线程堆栈满、系统内存被占满)优化方法:优化目标、优化GC步骤、优化总结;案例分析(公司系统参数、网上给的配置参数)

    45.JVM调优策略 45.1.常见问题 45.1.1.内存泄漏 45.1.1.1.年老代堆空间被占满 45.1.1.2.持久代被占满 45.1.1.3.堆栈溢出 45.1.1.4.线程堆栈满 45. ...

  9. 设置线程堆栈大小_哇擦,传说中的堆栈溢出和快速排序

    stack overflow 堆栈溢出和快速排序这两个概念对开发人员来说并不陌生,但是通知都只是听说过,真正开发过程中却很少会遇到.我也是敲代码好些行后非常有幸撞上了,而且还是两个一起出现的,这其中过 ...

  10. 金山词霸2003导致我的程序堆栈溢出错误

    最近发现金山词霸屏幕取词功能导致连连看在ET内执行的时候堆栈溢出 而连连看单机版则无此问题.郁闷异常,分析金山词霸的取词功能如下: 1 屏幕抓词 屏幕抓词(或者叫动态翻译)是指随着鼠标的移动,软件能够 ...

最新文章

  1. 如何更新mysql数据库字段_如何使用MySQL一个表中的字段更新另一个表中字段
  2. roads 用户体验标准_全球领先技术加持,联发科 天玑1000+刷新5G用户体验新标准...
  3. 电脑ping服务器显示传输失败,Win10系统ping时出现传输失败常见故障解决办法
  4. 1191 消灭兔子(贪心+优先队列)
  5. 深入Pthread(五):线程属性
  6. 环境变量PATH cp命令 mv命令 文档查看cat/more/less/head/tail
  7. 搭建elasticsearch可视化插件
  8. Unix网络编程卷1源代码使用
  9. 如何去掉网页一直点击出现蓝色背景的效果
  10. outlook导入服务器邮件,OUTLOOK怎么导入邮件?
  11. 六面体单元matlab后处理,《有限元基础教程》_【MATLAB算例】基于节点六面体单元的空间块体分析(HexahedralDNode).doc...
  12. 网红神盾七号重疾险再创新高,自带住院津贴,还能赔两次!
  13. 我是歌手黄绮珊(黄妈)彭佳慧,
  14. 大数据学习路线思维导图
  15. 用python做GIF动画,让你的图表动起来!(以正态分布为例)
  16. GraphQL 学习笔记
  17. 接收微信公众号的事件推送并且回复消息
  18. 作为通信人,我们究竟该如何看待AI?
  19. 【SAP PO】X-DOC:SAP PO 接口配置 REST 服务对接填坑记
  20. lettuce MGET性能分析

热门文章

  1. 蓝桥杯 试题 基础练习 圆的面积
  2. PhotoShop 常用技巧记录
  3. python绘制太阳花,Python turtle学习笔记(包含太阳花的绘制,玫瑰花的绘制)
  4. 程序员的百宝箱:提升工作效率的七大神器
  5. 台式计算机和台式机,台式电脑i5和i7的区别_台式机i5和i7的区别有多大
  6. pygame基本实现塔防游戏
  7. “鉴别服务开创者”沦为笑柄?裁判文书曝出得物APP无法鉴别真伪
  8. OCP4.4 部署EFK-使用local-volume持久化
  9. 如何通过IP共享文件
  10. el-upload 上传 照片墙上传照片,上传一张之后,上传框就消失