Mac OSX上的Mysql 5.6令人头疼

时间:2013-07-23 14:50:48

标签: mysql ruby-on-rails-3 mysql2

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

任何可能导致此问题的想法?

谢谢! 朱莉

8 个答案:

答案 0 :(得分:67)

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

修复MySQL 5.6的三个选项:

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

    [mysqld]
    innodb_file_per_table = OFF
    
  2. 并重启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/

    3. 为什么会出现这种错误?

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

      感谢我的同事Thomas L.发现MySQL bug report暗示了这个解决方案!

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

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

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

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

brew versions mysql会为您提供在/ usr / local结帐以便能够安装旧版本的沙子

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

这将显示5.5.29作为mysql版本。然后,您可以根据这些instructions卸载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版本命令甚至为您提供了检查mysql公式的命令,但我认为除了检查sha的整个存储库然后在安装旧的mysql版本后返回master之后,它没有任何优势。 / p>

答案 3 :(得分:0)

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

brew install mysql --use-llvm

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

因此,如果您在安装mysql之后没有重新启动,我建议您在重复此处之前重新启动。

答案 6 :(得分:0)

我发现可以将table_open_cache设置为不大于1000的值

table_open_cache=1000

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

答案 7 :(得分:-1)

On Mavericks,这对我有用:

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

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