mac 上 MySQL system error 32 解决方案

不知为何,在升级了 macOS 系统之后,Rails 连接 MySQL 经常性会报 Mysql2::Error: Lost connection to MySQL server at 'sending authentication information', system error: 32 的错误。重启 MySQL 就好了,过段时间又会报错,烦不胜烦。下定决心解决下。

参考了这个帖子后,大致看到有两种解决方法。一种是调大系统 ulimit -n 的值,另一种是调小 table_open_cache 的值。
从帖子的回复以及 ulimit -n 表示系统的文件句柄限制来看,个人认为调节 ulimit -n 的值是一个治标不治本的方法。本机的值已经 4k+,应该足够了。

正巧有次出现问题时,MySQL 还连接着。查了下当时的 status,发现 open_tables 不过几十,而 open_files 却几千。
执行 flush tables 清除缓存后就可以重新连接了。确实和 table_open_cache 有一定的关系。

查看了下 table_open_cache 的值,默认值是 2000。通过在 my.cnf 中添加 table_open_cache = 500,MySQL 这几天就没有闹别扭,希望能一直安稳下去。

MySQL 相关命令

1
2
show status like '%open_files%'; # 查看 open_files 的值,open_tables 同理
show variables like '%table_open_cache%'; # 查看 table_open_cache 的值

参考