Ruby on Rails 3 Не удается подключиться к локальному серверу MySQL через сокет '/tmp/mysql.sock' в OSX


85

У меня стандартная среда 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

Нет, ни того, ни другого не существует. Я попробую создать такой.
Джейми Бьюкенен,

суть проблемы или на уровне ОС ..
RGB

Ответы:


212

Во-первых, чтобы найти файл сокета:

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 variables | grep socket», где xxxx - ваш пароль root
Эйб Петрилло,

Я не понимаю, как это работает; где / как вы вводите первую перечисленную команду? Когда я ввожу это в терминал, он сообщает:mysqladmin: command not found
CodeBiker

2
Вы можете ввести команду в любой папке. Command not foundуказывает, что у вас не установлен mysql.
Magne

2
Несмотря на то, что у меня не было пароля, мне все равно пришлось указать пользователя как root: mysqladmin -u root variables | grep socket
bkunzi01

1
@CodeBiker К вашему сведению: оболочки Linux, как правило, не выполняют неквалифицированные имена программ из рабочего каталога (если это явно не указано в PATH) - вы должны быть явными, например ./program_name .... Это означает, что фактическая выполняемая программа обычно не зависит от того, откуда вы пытаетесь ее запустить.
mwfearnley

87

Нашел!

Измените host: localhostconfig / database.yml, чтобы host: 127.0.0.1рельсы подключались через 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

2
В чем преимущество использования сокета по TCP / IP? Извините - я новичок в Rails и Unix
Джейми Бьюкенен

5
Сокеты Unix имеют меньше накладных расходов, чем сокеты TCP / IP.
Тобиас Коэн,

1
Спасибо! Я столкнулся с этой проблемой вне Rails (используя mysql gem), и это решение сработало. У меня нет корневого доступа, поэтому я не могу изменить драгоценный камень, чтобы использовать другое место для файла сокета. Этот трюк избавил меня от головной боли.
Sojoodi

2
Этот ответ помог мне по-другому. Я запускаю свое приложение rails против докеризованного экземпляра mysql с открытым localhost 3306. Одним из побочных эффектов этой настройки является то, что даже если вы можете подключаться через localhost, вы можете подключать только мысленный TCP, поскольку mysql работает на виртуальной машине, а не на том же компьютере, поэтому подключение к сокету отсутствует. Вместо этого, обязательное использование TCP в Rails является здесь ответом, потому что, к сожалению, лучшего варианта я не нашел.
Брайан

11

Ваш сервер mysql может не работать. Ниже объясняется, как запустить сервер. Это отрывок из файла README, который поставляется вместе с загрузкой mysql.

После установки вы можете запустить 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 TMPDIRи 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 07

Возможно, сервис перестанет работать, это определенно первое, что нужно проверить.
ТАСС

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: похоже, у вас есть 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 

Я получаю эту ошибку, потому что я установил XAMPP в своем приложении OS X версии 10.9.5 для PHP. Выберите здесь одно из мест расположения сокетов по умолчанию.

Я выбираю для приложений рельсов по умолчанию:

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

Для MySQL в комплекте с Mac OS X Server:

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

"/tmp/mysql.sock" будет создан автоматически при запуске сервера MySQL. Так что не забудьте сделать это перед запуском сервера rails.


3

С моей установкой MAMP на OSX сокет 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 отличается в зависимости от выбранного вами типа установки.

Расположение сокетов MySQL Unix в Mac OS X по типу установки

  • Установщик пакетов из MySQL ------------------ / tmp / mysql.sock

  • Tarball из MySQL ------------------------------- / tmp / mysql.sock

  • MySQL в комплекте с Mac OS X Server ------- / var / mysql / mysql.sock

Так что просто изменить database.yml в socket: /tmp/mysql.sockк точке в нужном месте в зависимости от того, какого операционной системы и типа установки вы используете



1

У меня была такая же проблема, но ни один из ответов не дал подробного описания того, что мне нужно было сделать. Эта ошибка возникает из-за того, что ваш файл сокета еще не создан. Все, что вам нужно сделать, это:

  1. Запустите сервер mysql, чтобы /tmp/mysql.sockон был создан, для этого вы запустите: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

Если вы используете MYSQL через XAMPP:

  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

У вас такая проблема: не удается подключиться к локальному серверу MySQL через сокет '/var/run/mysqld/mysqld.sock'

Ответ: $ sudo service mysql start


0

На моей машине служба mysqld остановилась, поэтому у меня возникла та же проблема.

1: - Зайдите в терминал и введите

sudo service mysqld restart

Это перезапустит службу mysqld и создаст новый файл sock в нужном месте.


-1

Если вы используете MYSQL через XAMPP или LAMPP в Ubuntu или другом Linux, попробуйте:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.