【问题标题】:Ruby on Rails 3 Can't connect to local MySQL server through socket '/tmp/mysql.sock' on OSXRuby on Rails 3 无法通过 OSX 上的套接字“/tmp/mysql.sock”连接到本地 MySQL 服务器
【发布时间】:2011-07-26 19:44:46
【问题描述】:

我有一个标准的 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

确定这是我缺少的一些简单的东西。

【问题讨论】:

  • 套接字文件是否存在?也许它存在于其他地方(/var/lib/mysql/mysql.sock)?
  • 不,都不存在。我会尝试创建一个。
  • 这个问题的核心还是在操作系统级别..

标签: mysql ruby-on-rails-3 macos


【解决方案1】:

首先,找到你的socket文件:

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

【讨论】:

  • 如果您有 root 密码,请执行以下操作:“mysqladmin -pxxxx variables | grep socket” 其中 xxxx 是您的 root 密码
  • 我对它的工作原理感到困惑;您在哪里/如何输入您列出的第一个命令?当我将其输入终端时,它会报告:mysqladmin: command not found
  • 您可以在任何文件夹中输入命令。 Command not found 表示你没有安装mysql。
  • 即使我没有密码,我仍然必须将用户指定为 root:mysqladmin -u root variables | grep 套接字
  • @CodeBiker 仅供参考:Linux shell 往往不会从工作目录执行不合格的程序名称(除非它明确在 PATH 中) - 你必须明确,例如./program_name ...。这意味着实际执行的程序往往与您尝试从哪里运行它无关。
【解决方案2】:

找到了!

将 config/database.yml 中的 host: localhost 更改为 host: 127.0.0.1 以使 rails 通过 TCP/IP 而不是本地套接字连接。

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

【讨论】:

  • 最好找到mysql.sock文件位置,并将这一行添加到config/database.yml: "socket: /path/to/mysql.sock"
  • 在 TCP/IP 上使用套接字有什么好处?抱歉 - 我对 Rails 和 Unix 还很陌生
  • Unix 套接字的开销比 TCP/IP 套接字少。
  • 谢谢!我在 Rails 之外遇到了这个问题(使用 mysql gem),这个解决方案有效。我没有 root 访问权限,所以我无法修改 gem 以使用另一个位置来存放套接字文件。这个技巧让我头疼。
  • 这个答案以不同的方式帮助了我。我正在针对 dockerized mysql 实例运行我的 rails 应用程序,暴露了 localhost 3306。此设置的一个副作用是,即使您可以通过 localhost 进行连接,您也只能通过 TCP 连接,因为 mysql 在 VM 中运行,而不是在同一台机器上 - 所以没有套接字连接。取而代之的是,强制 Rails 使用 TCP 是这里的答案,因为遗憾的是,我似乎没有找到更好的选择。
【解决方案3】:

您的 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`
  • 服务有可能停止工作,这绝对是首先要检查的。
【解决方案4】:

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

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

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

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

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 中的其他套接字位置

对于 MAMPP:

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

对于来自 MySQL 的包安装程序:

socket: /tmp/mysql.sock

对于与 Mac OS X 服务器捆绑的 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 为我工作
【解决方案5】:

“/tmp/mysql.sock”会在你启动 MySQL 服务器时自动创建。所以请记住在启动 Rails 服务器之前这样做。

【讨论】:

    【解决方案6】:

    在 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
    

    【讨论】:

      【解决方案7】:

      如果您使用的是 Mac OSX,

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

      MySQL Unix Socket Locations on Mac OS X by Installation Type

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

      • 来自 MySQL 的压缩包 -------------------------------/tmp/mysql.sock

      • MySQL 与 Mac OS X 服务器捆绑在一起 -------/var/mysql/mysql.sock

      因此,只需根据您使用的操作系统和安装类型,将 socket: /tmp/mysql.sock 中的 database.yml 更改为指向正确的位置

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          我也遇到过同样的问题,但没有一个答案能一步一步地说明我需要做什么。发生此错误是因为您的套接字文件尚未创建。您所要做的就是:

          1. 启动你的mysql服务器,所以你的/tmp/mysql.sock被创建,你运行:mysql server start
          2. 完成后,转到您的应用目录末尾编辑config/database.yml 文件并添加/编辑socket: /tmp/mysql.sock 条目
          3. 再次运行rake:dbmigrate,一切都会正常运行

          【讨论】:

          • rake db:migrate *
          【解决方案10】:

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

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

          bundle exec rake redmine:plugins:migrate RAILS_ENV=production
          

          成功了

          【讨论】:

            【解决方案11】:

            如果你是通过 XAMPP 运行 MYSQL:

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

              /Applications/XAMPP/etc/my.cnf

            2. 复制套接字路径:

              socket = /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 服务器

            享受:)

            【讨论】:

              【解决方案12】:

              你有这样的问题:Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

              Ans: $ sudo service mysql start

              【讨论】:

                【解决方案13】:

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

                1:- 转到终端并输入

                sudo service mysqld restart
                

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

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 2012-07-20
                    • 2011-11-10
                    • 2011-12-12
                    • 2013-01-27
                    • 2019-02-28
                    • 2014-01-10
                    • 1970-01-01
                    相关资源
                    最近更新 更多