我在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

我不知道这些变量是否在某个过程中得到了评估。不过,你还是可以试试。
现在,railsmysql_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/

10-11 03:51
查看更多