在Mac OSX上使用Mysql 5.6的困扰

49

我和我的一些同事最近使用homebrew在我们的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

有什么想法是什么导致这个问题的吗?

谢谢! 朱莉


1
与通过DMG安装的Mysql 5.6.14相同: $ mysql ERROR 2013 (HY000): 在“发送身份验证信息”时丢失到MySQL服务器的连接,系统错误:32 - temper
1
简单地停止并重新启动MySQL实例对我来说行得通。5.6.14 - Eben Geer
在OSX 10.9.2上使用Percona Server 5.6时遇到了相同的错误:特别是在并行运行单元测试时 - 使用8个连接。唉。 - Alex Kovshovik
刚找到了终极解决方案,已在下面发布了答案。 - Alex Kovshovik
请查看此链接:http://stackoverflow.com/questions/38459373/mysql-5-6-is-not-working-in-mac-os/38459414#38459414,它能够完美地解决问题。 - Sk. Irfan
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的性能 - 它会经常强制MySQL重新打开表,如果您有超过250个表:https://mariadb.com/kb/en/optimizing-table_open_cache/

为什么会出现这个错误?

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

感谢我的同事Thomas L.找到了一个MySQL bug报告,提示了这个解决方案!


如果无法连接到数据库,如何进行mysqldump? - Imme22009
很好的发现 @AlexKovshovik,希望 MySql 能尽快解决这个问题。 - Mark Kadlec
我不知道设置必须在配置文件的[mysqld]部分。有用的信息。 - Paul Chernoch
3
这是我迄今为止找到的最佳答案。它解决了我在失去连接方面的所有问题。这个答案对于OSX Mojave和MySQL 5.7仍然适用。 - andoke
对于选项1,您可以运行“mysql --help | grep -B 1 cnf”以查看mysql加载“my.cnf”文件的所有位置。在我的情况下,我发现最好编辑“usr/local/etc/my.cnf”。 - Kelsey Hannan
显示剩余2条评论

11

我们有同样的问题,这个方法解决了它。

project-root$ mysql.server stop
project-root$ gem uninstall mysql2
project-root$ bundle install
project-root$ mysql.server start

8
仅仅重新启动mysql服务器就解决了我的问题。供您参考。 - Artem Kalinchuk

4

这是使用Homebrew安装的最新版mysql版本的问题。

5.6.x版本存在问题。将版本降级至5.5.x可以解决此问题。

您可以使用Homebrew轻松安装旧版软件:

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

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

这将显示mysql版本为5.5.29。您可以根据这些说明卸载mysql并通过运行相应命令重新安装。

   brew install mysql

通过homebrew运行正常的安装过程:

  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即可。

有趣。你是否向Homebrew报告了这个错误,或尝试了非Homebrew安装?我们希望升级到5.6的一些新功能,因此不想回到5.5。 - Julie
没有,我还没有报告过这个问题。不过这似乎不是一个Homebrew的问题。我在Google上搜索了一下,发现有些人抱怨5.6.x版本的MySQL安装出现了这个问题,所以我进行了降级处理。 - Michael Klein
这对我们很有效,但由于性能问题,现在我们必须在生产环境中升级到5.6,因此也希望在本地升级。仍在寻找解决方案。 - Alex Kovshovik
当我现在尝试使用brew versions mysql时,我会得到错误:未知命令:versions - Kelsey Hannan

0

我在相同的配置上遇到了同样的问题(mysql 5.6.12)。我刚刚使用homebrew升级了mysql到版本5.6.13,问题已经解决了。


0
我们发现使用以下方法可以解决这个问题:
brew install mysql --use-llvm

这是在 OSX 10.8 上使用 rbenv 和 REE (1.8.7) 的 Rails 2.3。可能会有所不同。


0
我在 Mavericks 上使用 Homebrew 安装了 mysql 5.6.16,以及 rbenv 和 rails 等工具,遇到了这个问题。
在尝试其他解决方案之前,决定重新启动。问题得到解决!
因此,如果您自安装 mysql 等以来没有重新启动过计算机,请先重启再尝试其他答案。

0
我发现有效的方法是将table_open_cache设置为不超过1000的值。
table_open_cache=1000

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


-1
在Mavericks上,这对我有效:
mysql.server stop
brew install mysql
mysql.server start
gem remove mysql2
gem install mysql2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接