49

我和我的几位同事最近在我们的 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

有什么想法可能导致这种情况吗?

谢谢!朱丽叶

4

8 回答 8

74

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

修复 MySQL 5.6 的三个选项:

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

    [mysqld]
    innodb_file_per_table = OFF
    

并重新启动 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 错误报告!

于 2014-03-31T23:06:22.773 回答
11

我们遇到了同样的问题。这为我们解决了

project-root$ mysql.server stop
project-root$ gem uninstall mysql2
project-root$ bundle install
project-root$ mysql.server start
于 2014-02-12T13:34:06.817 回答
4

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

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

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

brew versions mysql将为您提供您必须在 /usr/local 中签出才能安装旧版本的 sha

   cd /usr/local
   git checkout 336c976
   brew info mysql

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

   brew install mysql

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

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

希望有帮助。

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

于 2013-07-25T07:28:11.823 回答
0

我用 mysql 5.6.16 解决了这个问题,通过 Homebrew 在 Mavericks 上新安装,以及 rbenv 和 rails 等。

决定在此处解决其他解决方案之前重新启动。问题解决了!

因此,如果您在安装 mysql 等后还没有重新启动,我建议您在完成此处的答案之前重新启动。

于 2014-03-15T23:54:25.613 回答
0

我在相同的配置(mysql 5.6.12)上遇到了同样的问题。我刚刚用自制软件将 mysql 升级到 5.6.13 版,问题就消失了。

于 2013-10-23T12:51:02.983 回答
0

我们发现使用以下解决方案为我们解决了这个问题:

brew install mysql --use-llvm

这是在 OSX 10.8 的 rbenv 中 REE (1.8.7) 之上的 rails 2.3。YMMV

于 2013-09-19T15:47:08.733 回答
0

我发现有效的是设置table_open_cache为不高于 1000 的值

table_open_cache=1000

我在错误页面上找到了这个,最后一条评论https://bugs.mysql.com/bug.php?id=71960

于 2020-04-25T04:13:50.760 回答
-1

在小牛队,这对我有用:

mysql.server stop
brew install mysql
mysql.server start
gem remove mysql2
gem install mysql2

升级到 Mavericks 后,我重新安装了 Homebrew。Homebrew 安装了 MySQL 5.6.13 的瓶装版本。

于 2013-11-01T17:39:30.957 回答