2014-01-24 33 views
9

我只是在學習MySQL的存儲函數和過程語法。我硬編碼了一個返回數字12的函數,它溢出了堆棧。有人知道這裏有什麼嗎?這是MySQL 5.5.30。爲什麼單行MySQL存儲函數溢出堆棧?

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. 
+0

Hm,在這裏工作@ 5.5.34,使用相同的默認線程堆棧如果添加'DETERMINISTIC'&放下'BEGIN'和'END'會發生什麼?這是香草MySQL嗎? – Wrikken

+0

'線程堆棧溢出:12288字節用於131072字節堆棧'嗯,看起來你只用了大約1/10的堆棧大小。不知道發生了什麼,但這是一個奇怪的。 – Taylor

+2

[MySQL錯誤1436:線程堆棧溢出,使用簡單查詢]的可能重複(http://stackoverflow.com/questions/8821575/mysql-error-1436-thread-stack-overrun-with-simple-query) –

回答

2

像@wrikken指出,這是當你運行一個128K線程堆棧一個已知的錯誤,但它是固定在MySQL的新版本,它應該是固定的,所以也許你正在運行舊版本或非官方軟件包。

建議使用至少有192k的堆棧,所以你可以去你的my-small.cnf並製作my-innodb-heavy-4G.cnf:thread_stack = 192k my-small.cnf:thread_stack = 128K

所有這些補救措施都可在mysql bug report中找到,但請在修改服務器之前進行脫機測試。確保離線本地主機具有與您的實時服務器相同的設置和配置,也就是說,如果您使用的是實時服務器。基本上做一個你的服務器的完全重複和離線測試,如果修復工作,並沒有引起任何問題,把它放在網上。

+0

謝謝!這是一個LAMP託管帳戶,所以我必須讓提供商解決這個問題。嘆。 – Oscar

+0

主機最終修補了安裝,解決了這個問題。再次感謝大家。 – Oscar