1

我在 Mac 上使用 brew 安装更新的 MySQL。为了简化本地数据库的创建,我取消了本地 root 用户的密码(我知道,我知道),并且在创建一个新的 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在 a 上使用新定义的文件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: 

Runningmysqladmin variables列出了正确的套接字文件位置,mysql --help. 我重新启动了 MySQL 服务器,甚至重新创建了 Rails 应用程序。

所以我的问题是:还有什么可以将套接字文件默认为/tmp/mysql.sock,或者是否有一个替代的,最好是全局的配置文件,我可以在其中指定 rake 任务将遵循的位置?rake 任务是否可以调用使用不同配置文件的不同命令行 MySQL 工具?

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

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

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: myapp_development
  pool: 5
  username: root
  password:
  host: localhost
4

1 回答 1

2

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

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

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

我认为连接是通过您设置的套接字文件建立的host: localhost。如果将其更改为127.0.0.1则应通过 TCP/IP 建立连接

我发现了相当旧的信息(mysql 适配器的真正旧版本和 2007 年的博客条目),这意味着MYSQL_UNIX_ADDR环境变量用于解析套接字。另请参阅Ruby/MySQL 的开发人员在 GitHub 上的此评论MYSQL_UNIX_PORT,其中他说要设置变量。Ruby/MySQLMYSQL_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

我不知道这些变量是否会在此过程中的某个地方得到评估。不过,您可以尝试一下。

现在,railsmysql_adapter.rb表示socket已使用已配置且默认为/tmp/mysql.sock(set in app_generator.rb)。似乎没有其他位置得到检查。我没有在Ruby/MySQLrails 使用的默认适配器中找到任何其他内容。

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

于 2012-07-14T12:45:49.523 回答