error 1436 (hy000): thread stack overrun 是线程堆栈空间不足所致,需通过修改 my.cnf 中 [mysqld] 段的 thread_stack = 256k 并重启 mysql 生效;注意权限须为 chmod 600,且应优先检查 sql 是否存在过度批量或深层递归等设计问题。

ERROR 1436 (HY000): Thread stack overrun 是 MySQL 线程堆栈空间耗尽的明确信号,不是配置遗漏或权限问题,而是当前语句(尤其是存储过程、深度递归、超长批量插入)所需栈空间超过了 thread_stack 限制。默认值(192KB 或 128KB)在多数场景够用,但一旦触发,必须调大——且无法在线修改。
查清当前 thread_stack 实际值和错误现场细节
先确认你遇到的是哪一类溢出:错误信息末尾一定带两组数字,例如:10368 bytes used of a 131072 byte stack, and 128000 bytes needed。这说明已用 10KB,系统分配了 128KB(即 131072 字节),但实际需要 128KB —— 已经撑满。此时不能只看“用了多少”,关键看“需要多少”。
执行以下命令验证当前设置:
mysql -u root -p -e "SHOW VARIABLES LIKE 'thread_stack';"注意单位:返回值是字节,但配置文件里常用
K(如 256K)或直接写数字(如 262144)。
修改 my.cnf / my.ini 中的 thread_stack 值
配置位置取决于系统:
• Linux/macOS 通常为 /etc/my.cnf 或 /etc/mysql/my.cnf
• Windows 通常是 my.ini(在 MySQL 安装目录下)
• XAMPP/MAMP 用户需找对应环境下的配置文件(如 /Applications/XAMPP/etc/my.cnf)
在 [mysqld] 段落下添加或修改:
thread_stack = 256K不要写成
thread_stack = 256k(大小写敏感),也不要用 MB 单位(MySQL 不识别)。常见安全取值是 256K 或 512K;超过 1M 需谨慎,可能暗示逻辑存在深层递归或不当批量操作。改完必须重启 MySQL 服务:
sudo systemctl restart mysql(Linux systemd)、brew services restart mysql(macOS Homebrew)或通过 XAMPP 控制面板重启。
chmod 600 是硬性要求,不是建议
修改配置文件时若遇到 Permission denied,别急着 chmod 777 —— 这会让 phpMyAdmin、MySQL Shell 等工具拒绝读取配置,报错更隐蔽。
正确做法是:
sudo chmod 600 /etc/my.cnf确保只有文件所有者(通常是
root)可读写,无任何 group/other 权限。MySQL 启动时会校验该权限,不合规则静默忽略配置或启动失败。如果用编辑器(如 vim)保存时报权限错误,请先
sudo chown root:root /etc/my.cnf,再 chmod 600,最后编辑。
避免盲目调大:先检查 SQL 本身是否合理
调大 thread_stack 是快速解法,但掩盖了潜在设计问题:
• 存储过程中存在未设终止条件的递归调用
• 批量插入一次性拼了 2000+ 行(如 MyBatis 的 <foreach></foreach> 无分页)
• 触发器链过深,或嵌套视图 + 函数组合导致栈深度失控
临时验证方式:把出错语句拆成小批次执行(如每 100 行一次 INSERT),看是否还报错。如果拆分后正常,说明问题不在栈大小,而在语句结构本身。
真正健壮的做法是:控制单次事务复杂度,用应用层分批代替巨型 SQL,比依赖调大 thread_stack 更可持续。
[client] 而非 [mysqld])。多看一眼错误日志开头几行,比反复重启更省时间。











