Ruby on Rails 3 No se puede conectar al servidor MySQL local a través del socket '/tmp/mysql.sock' en OSX

84

Tengo un entorno Rails3 estándar, 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

El error que obtengo al ejecutar rake db:migratepara crear una base de datos es:

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

config / database.yml tiene

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

seguro que es algo simple que me falta.

Jamie Buchanan
fuente
1
¿Está presente el archivo de socket? ¿Quizás esté presente en otro lugar (/var/lib/mysql/mysql.sock)?
Eimantas
No, ninguno existe. Intentaré crear uno.
Jamie Buchanan
el núcleo de estos problemas o en el nivel del sistema operativo ..
RGB

Respuestas:

211

Primero, para encontrar su archivo de socket:

mysqladmin variables | grep socket

Para mí, esto da:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Luego, agregue una línea a su config/database.yml:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /tmp/mysql.sock
Tobias Cohen
fuente
17
Si tiene una contraseña en la raíz, haga: "mysqladmin -pxxxx variables | grep socket" donde xxxx es su contraseña de root
Abe Petrillo
Estoy confundido acerca de cómo funciona esto; ¿Dónde / cómo ingresa el primer comando que enumeró? Cuando ingreso eso en la terminal, informa:mysqladmin: command not found
CodeBiker
2
Puede ingresar el comando en cualquier carpeta. Command not foundindica que no tienes instalado mysql.
Magne
2
Aunque no tenía contraseña, todavía tenía que especificar el usuario como root: mysqladmin -u root variables | conector grep
bkunzi01
1
@CodeBiker FYI: Los shells de Linux tienden a no ejecutar nombres de programas no calificados desde el directorio de trabajo (a menos que esté explícitamente en PATH); debe ser explícito, por ejemplo ./program_name .... Esto significa que el programa real ejecutado tiende a ser independiente de desde dónde intente ejecutarlo.
mwfearnley
87

¡Lo encontré!

Cambie host: localhostconfig / database.yml para host: 127.0.0.1hacer que los rieles se conecten a través de TCP / IP en lugar de un socket local.

development:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx
Jamie Buchanan
fuente
7
Sería mejor encontrar la ubicación del archivo mysql.sock y agregar esta línea a config / database.yml: "socket: /path/to/mysql.sock"
gparis
2
¿Cuál es el beneficio de usar un socket sobre TCP / IP? Lo siento, soy bastante nuevo en Rails y Unix
Jamie Buchanan
5
Los sockets Unix tienen menos sobrecarga que los sockets TCP / IP.
Tobias Cohen
1
¡Gracias! Me encontré con este problema fuera de Rails (usando mysql gem) y esta solución funcionó. No tengo acceso de root, así que no puedo modificar la gema para usar otra ubicación para el archivo de socket. Este truco me salvó dolores de cabeza.
Sojoodi
2
Esta respuesta me ha ayudado de otra manera. Estoy ejecutando mi aplicación rails contra una instancia de mysql acoplada, con localhost 3306 expuesto. Un efecto secundario de esta configuración es que, aunque puede conectarse a través de localhost, solo puede conectarse mediante TCP, ya que mysql se ejecuta en una máquina virtual, en lugar de en la misma máquina, por lo que no hay conexión de socket. En lugar de esto, exigir que Rails use TCP es la respuesta aquí, porque lamentablemente no parece haber una mejor opción que he encontrado.
Brian
11

Es posible que su servidor mysql no se esté ejecutando. A continuación se explica cómo iniciar el servidor. Este es un extracto del archivo README que viene con la descarga de mysql.

Después de la instalación, puede iniciar MySQL ejecutando los siguientes comandos en una ventana de terminal. Debe tener privilegios de administrador para realizar esta tarea.

Si ha instalado el elemento de inicio, use este comando:

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

Si no usa el elemento de inicio, ingrese la siguiente secuencia de comandos:

 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)
suga_shane
fuente
Esta respuesta me ayudó a solucionar este problema en mi MAC ... no estoy seguro de por qué este comentario no está mejor clasificado. Cuando instala mysql, se muestran algunas notas en la consola. Tuve que ejecutar los siguientes comandos. unset TMPDIRy mysql_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
Es posible que el servicio deje de funcionar, esto es definitivamente lo primero que hay que comprobar.
Tass
8

Estas son las opciones para solucionar este problema:

Opción 1: cambie su host a 127.0.0.1

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

Opción 2: Parece que tiene 2 conexiones en su servidor MySql. Para encontrar la ubicación de su archivo de socket, haga esto:

mysqladmin variables | grep socket

para mi da:

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!

o

mysql --help 

Recibo este error porque instalé XAMPP en mi OS X Versión 10.9.5 para la aplicación PHP. Elija una de las ubicaciones de socket predeterminadas aquí.

Elijo las aplicaciones de rieles predeterminadas:

socket: /tmp/mysql.sock

Para mis aplicaciones PHP, instalo XAMPP, así que configuro mi socket aquí:

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

OTROS Ubicación del socket en OS X

Para MAMPP:

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

Para el instalador de paquetes de MySQL:

socket: /tmp/mysql.sock

Para MySQL incluido con Mac OS X Server:

socket: /var/mysql/mysql.sock

Para Ubuntu:

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

Opción 3: si todas esas configuraciones no funcionan, puede eliminar la ubicación de su socket:

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

Espero que esto te ayude.

Akbarbin
fuente
Buena explicación de este comando: socket: /var/run/mysqld/mysql.sockfuncionó para mí
Yonela Nuba
6

"/tmp/mysql.sock" se creará automáticamente cuando inicie el servidor MySQL. Así que recuerde hacerlo antes de iniciar el servidor de rails.

Magne
fuente
3

Con mi instalación de MAMP en OSX, el socket MySQL se encuentra en /Applications/MAMP/tmp/mysql/mysql.sock. Solía locate mysql.sockencontrar la ubicación de mi socket MySQL.

Entonces mi config/database.ymlparece:

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

Si está en Mac OSX,

La ubicación predeterminada para el socket Unix de MySQL es diferente en Mac OS X y Mac OS X Server, según el tipo de instalación que elija

Ubicaciones de MySQL Unix Socket en Mac OS X por tipo de instalación

  • Instalador de paquetes de MySQL ------------------ / tmp / mysql.sock

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

  • MySQL incluido con Mac OS X Server ------- / var / mysql / mysql.sock

Así que acaba de cambiar su database.yml en socket: /tmp/mysql.sockel punto en el lugar adecuado dependiendo de qué sistema operativo y el tipo de instalación que está utilizando

Musili
fuente
2

La ubicación predeterminada para el socket MySQL en Mac OS X es /var/mysql/mysql.sock.

morgant
fuente
1

He tenido el mismo problema, pero ninguna de las respuestas dio un paso a paso de lo que tenía que hacer. Este error ocurre porque su archivo de socket aún no se ha creado. Todo lo que tienes que hacer es:

  1. Inicie su servidor mysql, para que /tmp/mysql.sockse cree su, para hacer eso, ejecute:mysql server start
  2. Una vez hecho esto, vaya al directorio de su aplicación, edite el config/database.ymlarchivo y agregue / edite la socket: /tmp/mysql.sockentrada
  3. Corre rake:dbmigrateuna vez más y todo debería funcionar bien
luizParreira
fuente
rake db:migrate*
Víctor
0

Descubrí que el problema es que solo tengo un entorno de producción. No tengo un entorno de desarrollo o de prueba.

Al agregar 'RAILS_ENV = producción' para dar el comando

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

funcionó

Paul Taylor
fuente
0

Si está ejecutando MYSQL a través de XAMPP:

  1. Abra el archivo de configuración mysql de XAMPP (en OSX):

    /Applications/XAMPP/etc/my.cnf

  2. Copie la ruta del socket:

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

  3. Abra el archivo de configuración de la base de datos del proyecto rails: myproject / config / database.yml

  4. Agregue la configuración del socket a la configuración de la base de datos de desarrollo:

->

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. Reiniciar el servidor de rails

Disfruta :)

mpinvidio
fuente
0

Tiene un problema con esto: no se puede conectar al servidor MySQL local a través del socket '/var/run/mysqld/mysqld.sock'

Respuesta: $ sudo service mysql start

Binni Bharadiya
fuente
0

En mi máquina, el servicio mysqld se detuvo, por eso me estaba dando el mismo problema.

1: - Vaya a la terminal y escriba

sudo service mysqld restart

Esto reiniciará el servicio mysqld y creará un nuevo archivo sock en la ubicación requerida.

Nikhil Mohadikar
fuente
-1

Si está ejecutando MYSQL a través de XAMPP o LAMPP en Ubuntu u otro Linux, intente:

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

Ahmad Kholil
fuente