【问题标题】:Why is a one-line MySQL stored function overflowing the stack?为什么单行 MySQL 存储函数会溢出堆栈?
【发布时间】:2014-01-24 23:10:05
【问题描述】:

我只是在学习 MySQL 的存储函数和过程语法。我硬编码了一个只返回数字 12 的函数,它溢出了堆栈。有人知道这里是什么吗?这是 MySQL 5.5.30。

mysql> DELIMITER //
mysql> CREATE FUNCTION `newItemID`()
    -> RETURNS BIGINT
    -> SQL SECURITY INVOKER
    -> BEGIN
    ->   RETURN 12;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> SELECT newItemID();
ERROR 1436 (HY000): Thread stack overrun:  12288 bytes used of a 131072 byte stack, and 128000 bytes needed.  Use 'mysqld --thread_stack=#' to specify a bigger stack.

【问题讨论】:

  • 嗯,工作在这里@5.5.34,具有相同的默认线程堆栈如果添加DETERMINISTIC 并删除BEGINEND 会发生什么?这是普通的 MySQL 吗?
  • Thread stack overrun: 12288 bytes used of a 131072 byte stack 嗯,看起来你只使用了大约 1/10 的堆栈大小。不知道发生了什么,但这很奇怪。
  • 啊哈,it is a known bug running with 128k thread stack,但它应该已在 5.5.9 中修复。我会说这要么是回归,要么您没有从官方软件包安装 MySQL,而是由其他方维护的软件包?
  • 非常感谢,伙计们。我无法控制服务器;这是一个典型的 LAMP 托管服务。我会和他们一起解决的。

标签: mysql


【解决方案1】:

就像@wrikken 指出的那样,当您运行 128k 线程堆栈时,这是一个已知错误,但是它已在较新版本的 mysql 中修复,并且应该已修复,因此您可能正在运行旧版本或一个非官方的包。

建议使用至少有 192k 的堆栈,因此您可以转到 my-small.cnf 并制作 my-innodb-heavy-4G.cnf:thread_stack = 192k my-small.cnf:thread_stack = 128K

mysql bug report 中提供了所有这些补救措施,但请在修改服务器之前离线测试。确保离线 localhost 具有与您的实时服务器相同的设置和配置,即如果您使用的是实时服务器。基本上制作您的服务器的精确副本并离线测试它,如果修复有效并且不会导致任何问题,请将其置于在线状态。

【讨论】:

  • 谢谢!这是一个 LAMP 托管帐户,所以我必须让提供商解决这个问题。叹息。
  • 主机最终修补了安装,解决了这个问题。再次感谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多