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)
suga_shane
источник
Этот ответ помог мне исправить эту проблему на моем 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.

Magne
источник
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к точке в нужном месте в зависимости от того, какого операционной системы и типа установки вы используете

Musili
источник
2

Расположение по умолчанию для сокета MySQL в Mac OS X - /var/mysql/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

Наслаждаться :)

mpinvidio
источник
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

Ахмад Холил
источник