为什么单行MySQL存储函数溢出堆栈?

Osc*_*car 9 mysql

我只是在学习MySQL的存储函数和-procedure语法.我硬编码了一个只返回数字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.
Run Code Online (Sandbox Code Playgroud)

use*_*596 2

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

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

所有这些补救措施都可以在mysql 错误报告中找到,但请在修改服务器之前进行离线测试。确保离线本地主机具有与实时服务器相同的设置和配置,即如果您使用实时服务器。基本上,复制您的服务器并对其进行离线测试,如果修复有效并且不会导致任何问题,请将其上线。