Mac OSX上的Mysql 5.6令人头疼

Jul*_*lie 48 mysql mysql2 ruby-on-rails-3

我和我的几位同事最近在我们的Mac上使用自制程序从MySQL 5.5升级到MySQL 5.6,在升级服务器之前在本地进行测试.自从这次升级以来,我们在运行rails代码时都遇到了间歇性的MySQL错误:

Lost connection to MySQL server at 'sending authentication information', system error: 32

我们已经尝试在我们的数据库中重新创建用户名和密码,并提高连接超时,但都没有解决问题.错误日志没有提到问题.当我们遇到问题时,我们发现的唯一解决方法是杀死mysql并重新启动它.我最近mysql -u root -p在命令行上使用过这个错误.似乎一旦我开始收到此错误,无论我使用什么用户名,我都无法超过当前的连接数.如果我关闭连接,那么我可以重新打开一个连接.

我们有以下环境:

  • 我们中的一些人:Rails 3.2,Ruby 2,mysql2 0.3.13,MySQL 5.6.12,Mac OSX 10.8.4
  • 我们其他人:Rails 3.2,Ruby 1.9,mysql2 0.3.13,MySQL 5.6.10,Mac OSX 10.8.4

可能导致这种情况的任何想法?

谢谢!朱丽叶

Ale*_*vik 67

这里的答案都没有帮助我,但最后我得到了MySQL 5.6.

修复MySQL 5.6的三个选项:

  1. (已确认)编辑/etc/my.cnf(如果不存在则创建)并添加:

    [mysqld]
    innodb_file_per_table = OFF
    
    Run Code Online (Sandbox Code Playgroud)

并重启MySQL.然后为此工作,您需要将数据库转储到SQL文件(mysqldump),然后删除并重新创建数据库,然后重新加载数据.

  1. 更改OSX的默认ulimit值(由Github用户sodabrew建议):https://superuser.com/questions/261023/how-to-change-default-ulimit-values-in-mac-os-x-10-6

  2. 将以下选项添加到my.cnf的[mysqld]部分:table_open_cache = 250.默认情况下,它设置为2000,高于OSX的默认ulimit.也不建议使用此解决方案,因为它会损害MySQL的性能 - 如果您有超过250个表,它会强制MySQL经常重新打开表:https://mariadb.com/kb/en/optimizing-table_open_cache/

为什么会出现这种错误?

由于MySQL 5.6 innodb_file_per_table选项默认为ON,这意味着每个表的数据都存储在自己的文件中.OSX默认限制的打开文件数为每个进程256个.通常这不是问题,但在我的情况下,我正在并行运行单元测试,这会创建8个数据库,每个数据库有405个表.OSX对每个进程的打开文件句柄数量有限制.这个StackOverflow答案表明这个限制是256,这完全解释了我的问题:在MySQL 5.6之前,来自所有这8个数据库的所有数据都在一个文件中.

感谢我的同事Thomas L.发现了一个MySQL错误报告,暗示了这个解决方案!

  • 这是迄今为止我找到的最好的最佳答案。它解决了我所有关于连接丢失的问题。这个答案仍然与OSX Mojave和MySQL 5.7有关。 (2认同)

小智 7

我们遇到了同样的问题.这为我们修好了

project-root$ mysql.server stop
project-root$ gem uninstall mysql2
project-root$ bundle install
project-root$ mysql.server start
Run Code Online (Sandbox Code Playgroud)

  • 刚重启mysql服务器对我有用.仅供参考. (8认同)

Mic*_*ein 4

这是通过自制程序安装的最新 mysql 版本的问题。

5.6.x 产生了问题。降级到 5.5.x 解决了我的问题。

您可以使用自制程序轻松安装旧的公式版本:

brew versions mysql会给你 sha,你必须在 /usr/local 中签出才能安装旧版本

   cd /usr/local
   git checkout 336c976
   brew info mysql
Run Code Online (Sandbox Code Playgroud)

这将显示 5.5.29 作为 mysql 版本。然后,您可以根据这些说明卸载 mysql ,然后只需运行以下命令即可重新安装

   brew install mysql
Run Code Online (Sandbox Code Playgroud)

并使用自制程序运行正常的安装过程:

  unset TMPDIR
  mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

再次安装旧版本的mysql后,您可以在/usr/local中查看master。brew versions 命令甚至为您提供了仅检查 mysql 公式的命令,但我认为这与仅检查 sha 的整个存储库然后在安装旧 mysql 版本后返回 master 相比没有任何优势。