我在Mac上,用brew安装了一个更新的MySQL。为了简化本地数据库的创建,我从本地根用户(我知道,我知道)那里取下了密码,在创建了一个新的Rails应用程序(rails new myapp -d mysql
)之后,应该可以运行rake db:create
,对吧?
但是,尽管设置了/etc/my.cnf
来定义标准mysql.sock位置。。。
[mysqld]
socket=/usr/local/var/mysql/mysql.sock
[client]
socket=/usr/local/var/mysql/mysql.sock
... Rails仍然不会在
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 --help
一样。我重新启动了MySQL服务器,甚至重新创建了Rails应用程序。所以我的问题是:还有什么可以将套接字文件默认为
/tmp/mysql.sock
,或者是否有一个备用的、最好是全局的配置文件,在其中我可以指定rake任务将遵循的位置?rake任务是否可以调用使用不同配置文件的不同命令行MySQL工具?显然,我可以创建一个从
/tmp
位置到实际位置的符号链接,或者编辑database.yml
文件来引用它。我知道如何让Rails正确地与DB服务器对话,但关键是要设置一次正确的默认值,因此我在本地创建的任何未来Rails应用程序都可以不进行额外的编辑(/tmp/mysql.sock在重新启动时被清除)。事实上,我甚至不知道它为什么要尝试通过socket文件连接,因为我的
database.yml
文件告诉它使用主机名:development:
adapter: mysql2
encoding: utf8
reconnect: false
database: myapp_development
pool: 5
username: root
password:
host: localhost
最佳答案
正如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。我发现了相当旧的信息(areally old version of the mysql adapter和ablog 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或使用的默认适配器进行评估。
关于mysql - 尽管有my.cnf设置,Rake db:create仍继续使用/tmp/mysql.sock,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11483816/