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


84

У мене є стандартне середовище 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

Відповіді:


211

По-перше, щоб знайти файл сокета:

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
Abe Petrillo

Я збентежений тим, як це працює; де / як ви вводите в першій перерахованій вами команді? Коли я вводжу це в термінал, він повідомляє:mysqladmin: command not found
CodeBiker

2
Ви можете ввести команду в будь-якій папці. Command not foundозначає, що у вас не встановлено mysql.
Magne

2
Незважаючи на те, що у мене не було пароля, мені все одно довелося вказати користувача як root: mysqladmin -u кореневі змінні | grep socket
bkunzi01

1
@CodeBiker FYI: оболонки Linux, як правило, не виконують некваліфіковані імена програм з робочого каталогу (якщо це прямо не вказано в PATH) - ви повинні бути явними, наприклад ./program_name .... Це означає, що фактично виконана програма, як правило, не залежить від того, звідки ви намагаєтеся її запустити.
mwfearnley

87

Знайшов це!

Змініть host: localhostу config / 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

2
У чому перевага використання сокета через TCP / IP? Вибачте - я досить новачок у Rails та Unix
Джеймі Бьюкенен

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

1
Дякую! Я зіткнувся з цією проблемою поза Rails (використовуючи коштовний камінь mysql), і це рішення спрацювало. У мене немає кореневого доступу, тому я не можу змінити дорогоцінний камінь, щоб використовувати інше місце для файлу сокета. Цей фокус врятував мені головні болі.
Sojoodi

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

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 TMPDIRand 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

Служба може перестати працювати, це, безумовно, перше, що слід перевірити.
Тасс

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:

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. Тому не забудьте зробити це перед запуском сервера рейок.


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 Socket у Mac OS X за типом встановлення

  • Інсталятор пакетів з MySQL ------------------ / tmp / mysql.sock

  • Tarball від MySQL ------------------------------ / tmp / mysql.sock

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

Так що просто змінити database.yml в socket: /tmp/mysql.sockдо точки в потрібному місці в залежності від того, якого операційної системи і типу установки ви використовуєте


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. Скопіюйте шлях до сокета:

    socket = /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. Перезапустіть сервер рейок

Насолоджуйтесь :)


0

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

Відповідь: Служба $ sudo 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.