Ruby on Rails 3 Não é possível conectar ao servidor MySQL local através do soquete '/tmp/mysql.sock' no OSX

85

Eu tenho um ambiente Rails3 padrão, 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

O erro que recebo ao executar rake db:migratea criação do banco de dados é:

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

config / database.yml tem

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

com certeza é algo simples que estou perdendo.

Jamie Buchanan
fonte
1
O arquivo de soquete está presente? Talvez esteja presente em outro lugar (/var/lib/mysql/mysql.sock)?
Eimantas
Não, nem existe. Vou tentar criar um.
Jamie Buchanan,
o núcleo desses problemas ou no nível do sistema operacional ..
RGB

Respostas:

212

Primeiro, para encontrar seu arquivo de soquete:

mysqladmin variables | grep socket

Para mim, isso dá:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Em seguida, adicione uma linha ao seu config/database.yml:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /tmp/mysql.sock
Tobias Cohen
fonte
17
Se você tiver uma senha de root, faça: "mysqladmin -pxxxx variables | grep socket" onde xxxx é sua senha de root
Abe Petrillo
Estou confuso sobre como isso funciona; onde / como você insere o primeiro comando listado? Quando eu entro no terminal, ele informa:mysqladmin: command not found
CodeBiker
2
Você pode inserir o comando em qualquer pasta. Command not foundindica que você não tem o mysql instalado.
Magne
2
Mesmo que eu não tivesse nenhuma senha, ainda tive que especificar o usuário como root: mysqladmin -u root variables | grep socket
bkunzi01
1
@CodeBiker FYI: Os shells do Linux tendem a não executar nomes de programas não qualificados do diretório de trabalho (a menos que esteja explicitamente no PATH) - você deve ser explícito, por exemplo ./program_name .... Isso significa que o programa real executado tende a ser independente de onde você tenta executá-lo.
mwfearnley
87

Encontrei!

Altere host: localhostem config / database.yml para host: 127.0.0.1fazer com que os trilhos se conectem sobre TCP / IP em vez de soquete local.

development:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx
Jamie Buchanan
fonte
7
Seria melhor encontrar a localização do arquivo mysql.sock e adicionar esta linha a config / database.yml: "socket: /path/to/mysql.sock"
gparis
2
Qual é a vantagem de usar um soquete sobre TCP / IP? Desculpe - sou muito novo em Rails e Unix
Jamie Buchanan
5
Os soquetes Unix têm menos sobrecarga do que os soquetes TCP / IP.
Tobias Cohen de
1
Obrigado! Corri para este problema fora do Rails (usando mysql gem) e esta solução funcionou. Não tenho acesso root, então não posso modificar a gema para usar outro local para o arquivo de socket. Esse truque me salvou de dores de cabeça.
Sojoodi
2
Essa resposta me ajudou de uma maneira diferente. Estou executando meu aplicativo rails em uma instância do mysql dockerized, com localhost 3306 exposto. Um efeito colateral desta configuração é que mesmo que você possa se conectar através do localhost, você só pode conectar através do TCP, já que o mysql está rodando em uma VM, ao invés da mesma máquina - então nenhuma conexão de socket. Em vez disso, obrigar o Rails a usar TCP é a resposta aqui, porque infelizmente não parece haver uma opção melhor que eu encontrei.
Brian de
11

Seu servidor mysql pode não estar funcionando. Abaixo explica como iniciar o servidor. Este é um trecho do arquivo README que vem com o download do mysql.

Após a instalação, você pode iniciar o MySQL executando os seguintes comandos em uma janela de terminal. Você deve ter privilégios de administrador para executar esta tarefa.

Se você instalou o item de inicialização, 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)

Se você não usar o item de inicialização, digite a seguinte sequência de comando:

 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
fonte
Esta resposta me ajudou a corrigir esse problema no meu MAC ... não tenho certeza por que este comentário não tem classificação superior. Quando você instala o mysql, algumas notas são exibidas no console. Tive que executar os seguintes comandos. unset TMPDIRe 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
É possível que o serviço pare de funcionar, esta é definitivamente a primeira coisa a verificar.
Tass
8

Estas são as opções para corrigir esse problema:

Opção 1: mude seu host para 127.0.0.1

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

Opção 2: Parece que você tem 2 conexões em seu servidor MySql. Para encontrar a localização do arquivo de soquete, faça o seguinte:

mysqladmin variables | grep socket

para mim dá:

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!

ou

mysql --help 

Recebo este erro porque instalei o XAMPP em meu OS X Versão 10.9.5 para aplicativo PHP. Escolha um dos locais de soquete padrão aqui.

Eu escolho os aplicativos de trilhos padrão:

socket: /tmp/mysql.sock

Para meus aplicativos PHP, eu instalo o XAMPP, então defino meu soquete aqui:

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

OUTROS Localização do soquete no OS X

Para MAMPP:

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

Para instalador de pacotes do MySQL:

socket: /tmp/mysql.sock

Para MySQL incluído no Mac OS X Server:

socket: /var/mysql/mysql.sock

Para Ubuntu:

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

Opção 3: se todas essas configurações não funcionarem, você pode remover o local do soquete:

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

Espero que isso lhe ajude.

Akbarbin
fonte
Boa explicação este comando: socket: /var/run/mysqld/mysql.sockfuncionou para mim
Yonela Nuba
6

"/tmp/mysql.sock" será criado automaticamente quando você iniciar o servidor MySQL. Portanto, lembre-se de fazer isso antes de iniciar o servidor Rails.

Magne
fonte
3

Com a minha instalação do MAMP no OSX, o socket MySQL está localizado em /Applications/MAMP/tmp/mysql/mysql.sock. Eu costumava locate mysql.sockencontrar o local do meu soquete MySQL.

Então, meu se config/database.ymlparece com:

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

Se você estiver no Mac OSX,

A localização padrão para o soquete MySQL Unix é diferente no Mac OS X e Mac OS X Server dependendo do tipo de instalação que você escolheu

Localizações de soquete MySQL Unix no Mac OS X por tipo de instalação

  • Instalador de pacote do MySQL ------------------ / tmp / mysql.sock

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

  • MySQL incluído no Mac OS X Server ------- / var / mysql / mysql.sock

Então, basta mudar o seu database.yml no socket: /tmp/mysql.sockpara apontar para o lugar certo, dependendo de qual sistema operacional e tipo de instalação que você está usando

Musili
fonte
2

O local padrão para o soquete MySQL no Mac OS X é /var/mysql/mysql.sock.

morgant
fonte
1

Eu tive o mesmo problema, mas nenhuma das respostas deu um passo a passo do que eu precisava fazer. Este erro ocorre porque seu arquivo de socket ainda não foi criado. Tudo o que tem a fazer é:

  1. Inicie seu servidor mysql, para que /tmp/mysql.sockseja criado, para fazer isso, execute:mysql server start
  2. Depois de fazer isso, vá para o diretório do aplicativo, edite o config/database.ymlarquivo e adicione / edite a socket: /tmp/mysql.sockentrada
  3. Corra rake:dbmigratemais uma vez e tudo deve funcionar bem
luizParreira
fonte
rake db:migrate*
Victor
0

Descobri que o problema é que só tenho um ambiente de produção. Não tenho um ambiente de desenvolvimento ou teste.

Adicionando 'RAILS_ENV = produção' para dar o comando

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

funcionou

Paul Taylor
fonte
0

Se você estiver executando MYSQL por meio do XAMPP:

  1. Abra o arquivo de configuração mysql XAMPP (no OSX):

    /Applications/XAMPP/etc/my.cnf

  2. Copie o caminho do soquete:

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

  3. Arquivo de configuração do banco de dados do projeto Open Rails: myproject / config / database.yml

  4. Adicione a configuração do soquete à configuração do banco de dados de desenvolvimento:

->

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. Reinicie o servidor Rails

Apreciar :)

mpinvidio
fonte
0

Você tem problemas como este: Não é possível conectar ao servidor MySQL local através do soquete '/var/run/mysqld/mysqld.sock'

Resposta: $ sudo service mysql start

Binni Bharadiya
fonte
0

Na minha máquina o serviço mysqld parou por isso estava me dando o mesmo problema.

1: - Vá para o terminal e digite

sudo service mysqld restart

Isso irá reiniciar o serviço mysqld e criar um novo arquivo sock no local requerido.

Nikhil Mohadikar
fonte
-1

Se você estiver executando MYSQL por meio de XAMPP ou LAMPP no Ubuntu ou outro Linux, tente:

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

Ahmad Kholil
fonte