Rake db:尽管my.cnf设置,create仍继续使用/tmp/mysql.sock

时间:2012-07-14 12:39:52

标签: mysql ruby-on-rails

我在Mac上并使用brew来安装更新的MySQL。为了简化我的本地数据库创建,我从我的本地root用户那里取了密码(我知道,我知道),并且在创建新的Rails应用程序(rails new myapp -d mysql)后,应该能够运行{{ 1}},对吧?

但是,尽管设置了rake db:create来定义标准的mysql.sock位置......

/etc/my.cnf

... Rails仍然不会在[mysqld] socket=/usr/local/var/mysql/mysql.sock [client] socket=/usr/local/var/mysql/mysql.sock 上使用新定义的mysql.sock文件:

rake db:create

运行rake db:create Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "reconnect"=>false, "database"=>"delayed_jobs_development", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost"}, charset: , collation: 列出了正确的套接字文件位置,mysqladmin variables也是如此。我重新启动了MySQL服务器,甚至重新创建了Rails应用程序。

所以我的问题:还有什么可以将套接字文件默认为mysql --help,还是有一个备用的,最好是全局的配置文件,我可以在其中指定rake任务将遵循的位置? rake任务可以调用另一个使用不同配置文件的命令行MySQL工具吗?

显然,我可以创建一个从/tmp/mysql.sock位置到我的真实位置的符号链接,或者编辑我的/tmp文件来引用它。我理解如何让Rails正确地与数据库服务器通信,但关键是要设置一次正确的默认值,因此我在本地创建的任何未来的Rails应用程序都可以在没有额外编辑的情况下使用(/tmp/mysql.sock获取)重启时清除。)

事实上,我甚至不确定为什么它会尝试通过套接字文件进行连接,因为我的database.yml文件告诉它使用主机名:

database.yml

1 个答案:

答案 0 :(得分:2)

正如MySQL文档所说,/tmp/mysql.sock是套接字文件的默认位置。这也是rails默认的(更多信息如下)。

正如您所提到的,您始终可以在database.yml文件中明确设置套接字(您配置的套接字和由mysqladmin variables返回的套接字):

socket: /usr/local/var/mysql/mysql.sock

我认为在设置host: localhost时通过套接字文件建立连接。如果您将其更改为127.0.0.1,则connection should by made over TCP/IP

我发现了相当旧的信息(really old version of the mysql adapterblog entry from 2007),这意味着MYSQL_UNIX_ADDR环境变量用于解析套接字。另请参阅Ruby / MySQL开发人员的comment on GitHub,其中他说要设置MYSQL_UNIX_PORT变量。第三个env变量是source of the Ruby/MySQL连接器中提到的MYSQL_SOCKET

export MYSQL_UNIX_ADDR=/usr/local/var/mysql/mysql.sock
export MYSQL_UNIX_PORT=/usr/local/var/mysql/mysql.sock
export MYSQL_SOCKET=/usr/local/var/mysql/mysql.sock

我不知道这些变量是否会在某个地方进行评估。不过,你可以尝试一下。

目前,rails mysql_adapter.rb表示已使用配置的socket,默认为/tmp/mysql.sock(在app_generator.rb中设置)。似乎没有其他位置被检查。我没有在rails使用的默认Ruby/MySQL适配器中找到任何其他内容。

所以基本上 - 不是这个主题的专家 - 我不认为有办法设置MySQL套接字文件的全局默认位置,由rails或使用的默认适配器进行评估。