我在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
答案 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 adapter和blog 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或使用的默认适配器进行评估。