Ruby on Rails 3无法通过OSX上的套接字'/tmp/mysql.sock'连接到本地MySQL服务器


84

我有一个标准的Rails3环境,RVM 1.2.9,Rails 3.0.5,Ruby 1.9.2p180,MySQL2 Gem 0.2.7,mysql-5.5.10-osx10.6-x86_64

运行rake db:migrate创建数据库时出现的错误是:

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

config / database.yml有

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx

确保这是我所缺少的简单事物。


1
套接字文件存在吗?也许它存在于其他地方(/var/lib/mysql/mysql.sock)?
Eimantas 2011年

不,都不存在。我将尝试创建一个。
Jamie Buchanan

这个问题还是在操作系统层面的核心..
RGB

Answers:


211

首先,找到您的套接字文件:

mysqladmin variables | grep socket

对我来说,这给出了:

| socket                                            | /tmp/mysql.sock                                                                                                        |

然后,在您的添加一行config/database.yml

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /tmp/mysql.sock

17
如果您具有root用户密码,请执行以下操作:“ mysqladmin -pxxxx变量| grep套接字”,其中xxxx是您的root用户密码
Abe Petrillo 2012年

我对这是如何工作感到困惑;您在哪里/如何输入列出的第一个命令?当我将其输入终端时,它报告:mysqladmin: command not found
CodeBiker

2
您可以在任何文件夹中输入命令。Command not found表示您没有安装mysql。
Magne 2014年

2
即使我没有密码,我仍然必须将用户指定为root:mysqladmin -u root variables | grep套接字
bkunzi01

1
@CodeBiker仅供参考:Linux shell往往不会从工作目录中执行不合格的程序名称(除非它在中显式PATH)-您必须明确,例如./program_name ...。这意味着实际执行的程序往往与尝试从何处运行无关。
mwfearnley'7

87

找到了!

host: localhost在config / database.yml中进行更改,host: 127.0.0.1以使Rails通过TCP / IP而不是本地套接字进行连接。

development:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx

7
最好找到mysql.sock文件位置,并将此行添加到config / database.yml中:“ socket:/path/to/mysql.sock”
gparis 2011年

2
在TCP / IP上使用套接字有什么好处?对不起-我敢新的Rails和Unix
杰米·布坎南

5
Unix套接字的开销小于TCP / IP套接字。
Tobias Cohen

1
谢谢!我在Rails之外遇到了这个问题(使用mysql gem),并且此解决方案有效。我没有root用户访问权限,因此无法修改gem以将套接字文件使用其他位置。这个把戏使我头疼。
Sojoodi 2011年

2
这个答案以不同的方式帮助了我。我在暴露了本地主机3306的dockerized mysql实例上运行Rails应用程序。这种设置的副作用是,即使您可以通过本地主机连接,也只能通过TCP连接,因为mysql是在VM中运行的,而不是在同一台计算机上运行的-因此没有套接字连接。代替此,在这里强制Rails使用TCP是答案,因为可悲的是,似乎没有找到更好的选择。
布赖恩

11

您的mysql服务器可能未运行。下面说明了如何启动服务器。这是mysql下载随附的README文件的摘录。

安装后,可以通过在终端窗口中运行以下命令来启动MySQL。您必须具有管理员权限才能执行此任务。

如果已安装启动项,请使用以下命令:

 shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
 (ENTER YOUR PASSWORD, IF NECESSARY)
 (PRESS CONTROL-D OR ENTER "EXIT" TO EXIT THE SHELL)

如果您不使用启动项,请输入以下命令序列:

 shell> cd /usr/local/mysql
 shell> sudo ./bin/mysqld_safe
 (ENTER YOUR PASSWORD, IF NECESSARY)
 (PRESS CONTROL-Z)
 shell> bg
 (PRESS CONTROL-D OR ENTER "EXIT" TO EXIT THE SHELL)

这个答案帮助我在MAC上解决了这个问题...不确定为什么此评论的排名不高。当您安装mysql时,控制台中会显示一些注释。我必须运行以下命令。unset TMPDIRmysql_install_db --verbose --user=whoami` --basedir =“ $(brew --prefix mysql)” --datadir = / usr / local / var / mysql --tmpdir = / tmp ....then I had to start the server mysql.server start`
dmillion

服务可能会停止工作,这绝对是第一件事。
塔斯(Tass)2013年

8

这些是解决此问题的选项:

选项1:将您的主机更改为127.0.0.1

staging:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx
  socket: your-location-socket

选项2:看来您的服务器MySql中有2个连接。要找到您的套接字文件位置,请执行以下操作:

mysqladmin variables | grep socket

对我来说:

mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' exists!

要么

mysql --help 

我收到此错误是因为我在OS X版本10.9.5中为PHP应用程序安装了XAMPP。在此处选择默认的套接字位置之一。

我选择默认的Rails应用程序:

socket: /tmp/mysql.sock

对于我的PHP应用程序,我安装了XAMPP,所以在这里设置了我的套接字:

socket: /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

OS X中的OTHERS套接字位置

对于MAMPP:

socket: /Applications/MAMP/tmp/mysql/mysql.sock

对于MySQL的软件包安装程序:

socket: /tmp/mysql.sock

对于与Mac OS X Server捆绑在一起的MySQL:

socket: /var/mysql/mysql.sock

对于Ubuntu:

socket: /var/run/mysqld/mysql.sock

选项3:如果所有这些设置都不起作用,则可以删除套接字位置:

staging:
  # socket: /var/run/mysqld/mysql.sock

希望对您有帮助。


这个命令很好的解释:socket: /var/run/mysqld/mysql.sock对我
有用

6

启动MySQL服务器时,将自动创建“ /tmp/mysql.sock”。因此,请记住在启动Rails服务器之前执行此操作。


3

在OSX上安装MAMP后,MySQL套接字位于/Applications/MAMP/tmp/mysql/mysql.sock。我曾经locate mysql.sock找到我的MySQL套接字位置。

所以我config/database.yml看起来像:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /Applications/MAMP/tmp/mysql/mysql.sock

3

如果您使用的是Mac OSX,

MySQL Unix套接字的默认位置在Mac OS X和Mac OS X Server上有所不同,具体取决于您选择的安装类型

按安装类型在Mac OS X上的MySQL Unix套接字位置

  • 来自MySQL的软件包安装程序------------------ / tmp / mysql.sock

  • MySQL的Tarball ------------------------------- / tmp / mysql.sock

  • 与Mac OS X Server捆绑在一起的MySQL ------- / var / mysql / mysql.sock

因此,只要改变你的database.ymlsocket: /tmp/mysql.sock以指向正确的地方这取决于操作系统和安装类型您正在使用


2

Mac OS X上MySQL套接字的默认位置是/var/mysql/mysql.sock


1

我遇到了同样的问题,但是没有一个答案能逐步说明我需要做的事情。发生此错误的原因是尚未创建您的套接字文件。您要做的就是:

  1. 启动您的mysql服务器,/tmp/mysql.sock创建您的MySQL服务器,然后执行以下操作:mysql server start
  2. 完成后,转到您的应用目录结束,编辑config/database.yml文件并添加/编辑socket: /tmp/mysql.sock条目
  3. rake:dbmigrate再次运行,一切都应该很好地进行

rake db:migrate*
胜者

0

我发现问题是我只有生产环境。我没有开发或测试环境。

通过添加“ RAILS_ENV = production”来给出命令

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

有效


0

如果通过XAMPP运行MYSQL:

  1. 打开XAMPP mysql配置文件(在OSX上):

    /Applications/XAMPP/etc/my.cnf

  2. 复制套接字路径:

    套接字= /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

  3. 打开Rails项目的数据库配置文件:myproject / config / database.yml

  4. 将套接字配置添加到开发数据库配置中:

->

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: difiuri_falcioni
  pool: 5
  username: root
  password:
  host: localhost
  socket: /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock
  1. 重新启动Rails服务器

请享用 :)



0

在我的机器上,mysqld服务停止了,因此它给了我同样的问题。

1:-转到终端并输入

sudo service mysqld restart

这将重新启动mysqld服务,并在所需位置创建一个新的sock文件。


-1

如果您正在Ubuntu或其他Linux上通过XAMPP或LAMPP运行MYSQL,请尝试:

socket: /opt/lampp/var/mysql/mysql.sock

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.