Ruby on Rails 3 Impossible de se connecter au serveur MySQL local via le socket '/tmp/mysql.sock' sur OSX

84

J'ai un environnement standard 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

L'erreur que j'obtiens lors de l'exécution rake db:migratepour créer une base de données est:

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

config / database.yml a

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

bien sûr, c'est quelque chose de simple qui me manque.

Jamie Buchanan
la source
1
Le fichier socket est-il présent? Peut-être est-il présent ailleurs (/var/lib/mysql/mysql.sock)?
Eimantas
Non, aucun n'existe. Je vais essayer d'en créer un.
Jamie Buchanan
au cœur de ces problèmes ou au niveau du système d'exploitation ..
RVB

Réponses:

211

Tout d'abord, pour trouver votre fichier socket:

mysqladmin variables | grep socket

Pour moi, cela donne:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Ensuite, ajoutez une ligne à votre config/database.yml:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /tmp/mysql.sock
Tobias Cohen
la source
17
Si vous avez un mot de passe root, faites: "mysqladmin -pxxxx variables | grep socket" où xxxx est votre mot de passe root
Abe Petrillo
Je ne sais pas comment cela fonctionne; où / comment entrez-vous dans la première commande que vous avez listée? Quand j'entre cela dans le terminal, il signale:mysqladmin: command not found
CodeBiker
2
Vous pouvez entrer la commande dans n'importe quel dossier. Command not foundindique que vous n'avez pas installé mysql.
Magne
2
Même si je n'avais pas de mot de passe, je devais quand même spécifier l'utilisateur en tant que root: mysqladmin -u root variables | grep socket
bkunzi01
1
@CodeBiker FYI: les shells Linux ont tendance à ne pas exécuter de noms de programme non qualifiés à partir du répertoire de travail (sauf si c'est explicitement dans le PATH) - vous devez être explicite, par exemple ./program_name .... Cela signifie que le programme réellement exécuté a tendance à être indépendant de l'endroit où vous essayez de l'exécuter.
mwfearnley
87

Trouvé!

Remplacez host: localhostconfig / database.yml par host: 127.0.0.1pour que les rails se connectent via TCP / IP au lieu du socket local.

development:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx
Jamie Buchanan
la source
7
Il serait préférable de trouver l'emplacement du fichier mysql.sock et d'ajouter cette ligne à config / database.yml: "socket: /path/to/mysql.sock"
gparis
2
Quel est l'avantage d'utiliser une socket sur TCP / IP? Désolé - Je suis assez nouveau sur Rails et Unix
Jamie Buchanan
5
Les sockets Unix ont moins de surcharge que les sockets TCP / IP.
Tobias Cohen
1
Merci! J'ai rencontré ce problème en dehors de Rails (en utilisant mysql gem) et cette solution a fonctionné. Je n'ai pas d'accès root donc je ne peux pas modifier le gem pour utiliser un autre emplacement pour le fichier socket. Cette astuce m'a évité des maux de tête.
Sojoodi
2
Cette réponse m'a aidé d'une manière différente. J'exécute mon application rails sur une instance mysql dockerisée, avec localhost 3306 exposé. Un effet secondaire de cette configuration est que même si vous pouvez vous connecter via localhost, vous ne pouvez vous connecter que via TCP puisque mysql s'exécute dans une VM, plutôt que sur la même machine - donc pas de connexion socket. Au lieu de cela, obliger Rails à utiliser TCP est la réponse ici, car malheureusement, il ne semble pas y avoir de meilleure option que j'ai trouvée.
Brian
11

Votre serveur mysql n'est peut-être pas en cours d'exécution. Ci-dessous explique comment démarrer le serveur. Ceci est un extrait du fichier README fourni avec le téléchargement mysql.

Après l'installation, vous pouvez démarrer MySQL en exécutant les commandes suivantes dans une fenêtre de terminal. Vous devez disposer des privilèges d'administrateur pour effectuer cette tâche.

Si vous avez installé l'élément de démarrage, utilisez cette commande:

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

Si vous n'utilisez pas l'élément de démarrage, entrez la séquence de commandes suivante:

 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
la source
Cette réponse m'a aidé à résoudre ce problème sur mon MAC ... je ne sais pas pourquoi ce commentaire n'est pas classé plus haut. Lorsque vous installez mysql, certaines notes sont affichées dans la console. J'ai dû exécuter les commandes suivantes. unset TMPDIRet 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
Il est possible que le service cesse de fonctionner, c'est certainement la première chose à vérifier.
Tass
8

Voici des options pour résoudre ce problème:

Option 1: changez votre hôte en 127.0.0.1

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

Option 2: Il semble que vous ayez 2 connexions dans votre serveur MySql. Pour trouver l'emplacement de votre fichier socket, procédez comme suit:

mysqladmin variables | grep socket

pour moi donne:

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 

J'obtiens cette erreur car j'ai installé XAMPP dans ma version OS X 10.9.5 pour l'application PHP. Choisissez ici l'un des emplacements de socket par défaut.

Je choisis pour les applications de rails par défaut:

socket: /tmp/mysql.sock

Pour mes applications PHP, j'installe XAMPP donc je configure ma socket ici:

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

OTHERS Emplacement du socket sous OS X

Pour MAMPP:

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

Pour l'installateur de package de MySQL:

socket: /tmp/mysql.sock

Pour MySQL fourni avec Mac OS X Server:

socket: /var/mysql/mysql.sock

Pour Ubuntu:

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

Option 3: Si tous ces paramètres ne fonctionnent pas, vous pouvez supprimer l'emplacement de votre socket:

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

J'espère que cela vous aidera.

akbarbin
la source
Belle explication cette commande: a socket: /var/run/mysqld/mysql.sockfonctionné pour moi
Yonela Nuba
6

"/tmp/mysql.sock" sera créé automatiquement lorsque vous démarrez le serveur MySQL. N'oubliez donc pas de le faire avant de démarrer le serveur rails.

Magne
la source
3

Avec mon installation de MAMP sur OSX, le socket MySQL se trouve à /Applications/MAMP/tmp/mysql/mysql.sock. J'avais l'habitude locate mysql.sockde trouver l'emplacement de mon socket MySQL.

Donc mon config/database.ymlressemble à:

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

Si vous utilisez Mac OSX,

L'emplacement par défaut du socket MySQL Unix est différent sur Mac OS X et Mac OS X Server en fonction du type d'installation que vous avez choisi

Emplacements des sockets MySQL Unix sur Mac OS X par type d'installation

  • Installateur de package de MySQL ------------------ / tmp / mysql.sock

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

  • MySQL fourni avec Mac OS X Server ------- / var / mysql / mysql.sock

Il suffit donc de changer votre database.yml dans socket: /tmp/mysql.sockle point au bon endroit en fonction du type système d' exploitation et l' installation que vous utilisez

Musili
la source
2

L'emplacement par défaut du socket MySQL sur Mac OS X est /var/mysql/mysql.sock.

morgant
la source
1

J'ai eu le même problème, mais aucune des réponses n'a donné une étape par étape de ce que je devais faire. Cette erreur se produit car votre fichier socket n'a pas encore été créé. Tout ce que tu dois faire est:

  1. Démarrez votre serveur mysql, ainsi votre /tmp/mysql.sockest créé, pour ce faire, exécutez:mysql server start
  2. Une fois que cela est fait, accédez au répertoire de votre application, éditez le config/database.ymlfichier et ajoutez / modifiez l' socket: /tmp/mysql.sockentrée
  3. Courez rake:dbmigrateà nouveau et tout devrait bien fonctionner
luizParreira
la source
rake db:migrate*
Victor le
0

J'ai trouvé que le problème est que je n'ai qu'un environnement de production. Je n'ai pas d'environnement de développement ou de test.

En ajoutant 'RAILS_ENV = production' pour donner la commande

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

ça a marché

Paul Taylor
la source
0

Si vous exécutez MYSQL via XAMPP:

  1. Ouvrez le fichier de configuration mysql de XAMPP (sous OSX):

    /Applications/XAMPP/etc/my.cnf

  2. Copiez le chemin du socket:

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

  3. Fichier de configuration de la base de données du projet Open rails: myproject / config / database.yml

  4. Ajoutez la configuration du socket à la configuration de la base de données de développement:

->

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. Redémarrez le serveur de rails

Prendre plaisir :)

mpinvidio
la source
0

Vous rencontrez un problème comme celui-ci: impossible de vous connecter au serveur MySQL local via le socket '/var/run/mysqld/mysqld.sock'

Ans: $ sudo service mysql start

Binni Bharadiya
la source
0

Sur ma machine, le service mysqld s'est arrêté, c'est pourquoi il me posait le même problème.

1: - Allez au terminal et tapez

sudo service mysqld restart

Cela redémarrera le service mysqld et créera un nouveau fichier chaussette à l'emplacement requis.

Nikhil Mohadikar
la source
-1

Si vous exécutez MYSQL via XAMPP ou LAMPP sur Ubuntu ou autre Linux, essayez:

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

Ahmad Kholil
la source