MySQL не може підключитися через "localhost", лише 127.0.0.1


27

це дещо загадка для мене. Єдиний спосіб, коли я можу підключитися до MySQL - це, якщо я називаю його через "127.0.0.1" ... наприклад, мій сценарій підключення PHP НЕ буде працювати з localhost

Я запускаю Mac OS X Lion, вбудований apache2, MySQL, PHP, phpMyAdmin

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

1
Це, мабуть, більше для помилок сервера, але переконайтеся, що у файлу хостів є псевдонім localhost.
Метт

127.0.0.1 localhost - у моєму файлі хостів.
dcolumbus

Відкрийте командний рядок і введіть ping localhostі подивіться, що він говорить.
Стів Роббінс

64 байт з 127.0.0.1: icmp_seq = 0 ttl = 64 час = 0.100 мс 64 байт від 127.0.0.1: icmp_seq = 1 ttl = 64 час = 0.102 мс 64 байт від 127.0.0.1: icmp_seq = 2 ttl = 64 час = 0,096 ms
dcolumbus

Відповіді:


26

MySQL спробує підключитися до unix-сокета, якщо ви скажете йому підключитися до "localhost". Якщо ви скажете йому підключитися до 127.0.0.1, ви змусите його підключитися до мережевого сокета. Отже, можливо, у вас MySQL налаштований на прослуховування лише мережевого сокета, а не сокета файлової системи.

Що саме не так з вашим розеткою unix, важко сказати. Але я рекомендую вам прочитати цю сторінку в довідковому посібнику MySQL. Це повинно вам допомогти.

ОНОВЛЕННЯ: Виходячи з оновленого питання: Параметр "socket" повинен бути приблизно таким: "/var/lib/mysql/mysql.sock". На цій сторінці в Довідковому посібнику є додаткова інформація.

Тут у вас початок мого /etc/my.cnf файлу:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Ваш файл має бути подібним. Тоді ваша проблема повинна бути вирішена. Не забудьте перезапустити MySQL-сервер перед його тестуванням.


1
Нічого собі: "Файл сокет Unix використовується, якщо ви не вказали ім'я хоста або якщо ви вказали спеціальне ім'я хоста localhost." Це здається ... неінтуїтивним. Звідси і всі інші відповіді.
Марк Вагнер

Це добре знати +1
Метт

Я ціную теорію ... просто не знаю, на що відповідь.
dcolumbus

@dcolumbus: Як я вже писав, важко сказати. Що я можу вам порекомендувати - це відкрити консоль і просто написати команду "mysql". Можливо, тоді ви отримаєте більше інформації. Інша справа - заглянути в файл журналу. Шахта знаходиться в каталозі / var / log / і називається mysql.log. У вас може бути інше ім’я чи інше місцеположення. Якщо ви можете надати нам більше інформації, ми, можливо, можемо вам краще допомогти.
Раффаель Лютігер

2
php.ini має посилання на "/var/mysql/mysql.sock" (3 місця, щоб бути точним), які потрібно змінити на "/tmp/mysql.sock" ... Дякую за допомогу!
dcolumbus

8

Можливо, у вас включений IPv6, його дуже можливий localhost вирішується на ipv6 localhost, що не визначено у вашій конфігурації msql.

У Ive також була проблема, коли мені довелося додати "localhost" замість "127.0.0.1" до дозволених підмереж для цього користувача, не розумію, чому (я використовував ipv4, і це був деякий час тому), але варто спробувати.


Ви можете перевірити це, побачивши, чи повертається "host localhost" у командному рядку :: 1, а також 127.0.0.1. Якщо так, ви можете або видалити :: 1-зіставлення з / private / etc / hosts, або перенастроїти MySQL для прослуховування на IPv6 :: 1 адресу, а також 127.0.0.1
David North

Я думаю, я пам’ятаю, що десь читав, що IPv6 у Mac OS X увімкнено за замовчуванням ... це так?
dcolumbus

ipv6 увімкнено майже для всіх сучасних ОС в наші дні, на osx10.6 і його включено за замовчуванням.
Silverfire

неправильно. Localhost має особливе значення для клієнтів mysql - перевірити serverfault.com/a/295300/67675
poige

5

Для мене вбудований php OSX налаштований на використання іншого Unix-сокета, ніж mysql домашнього мовлення. Таким чином, він не може підключитися через localhost, який використовує цей сокет.

Я виправив це за допомогою швидкого злому, посилаючись на налаштований шлях до сокета php, щоб вказати на той, який фактично використовує mysql.

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Наступні діагностичні команди були дуже корисними.

Перевірте стандартні шляхи socket, використовувані php та mysql:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

Підключіться за допомогою вказаного сокета:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

Визначте, який тип socket mysql клієнт використовує для підключення:

lsof | egrep '^mysql .*(IPv|unix)'

2

Не могли б ви перевірити mysql/conf/my.conf(структура каталогів має бути майже однаковою для OSx), щоб побачити, чи skip-networkingне коментується це? Якщо це так, додайте #перед рядком і перезапустіть mysql-сервер.

Насправді у мене був подібний випуск певного часу (хоча цього не було в OSx), тому я подумав, що це варто зробити.


1
Чому це було знято? Пояснення було б корисним.
karllindmark

Я вас не проголосував, але ваша відповідь насправді протилежна тому, що задає ОП. Але я підтримав вас, бо боровся з протилежною умовою - з'єднався б через сокет, а НЕ через мережу. До речі, Я НЕ МОЖУ виправити це через my.conf; Мені довелося поставити його в командному рядку: "mysqlf --skip_networking = 0 ..."
Ян Штейнман

2

PHP все ще намагається використовувати розташування сокета за замовчуванням. Ця проблема може з’явитися, якщо ви перемістили папку MariaDB / MySQL з / var / lib / mysql в інше місце. Для вирішення проблеми вам потрібно визначити місце нового сокета у файлі /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Будьте уважні , залежно від того, яким драйвером ви користуєтесь, можливо, доведеться вказати pdo_mysql.default_socket = !

Щоб перевірити поточний каталог, запустіть таку команду в mysql:

select @@datadir;

1

Чи визначено localhost у вашому /private/etc/hostsфайлі?


127.0.0.1 localhost - у моєму файлі хостів.
dcolumbus

4
/private? Ніколи не бачив цього раніше
TheLQ

@TheLQ: Це справа для Mac. У той час як це символічна посилання з / і т.д. в / приватних / і т.д., з якої - то причини Apple , як правило , радить використовувати «істинний» шлях: support.apple.com/kb/TA27291
Джастін ᚅᚔᚈᚄᚒᚔ

1

Я зміг відтворити ваші ті самі симптоми на моїй тестовій коробці, сподіваюся, це допоможе.

У MySQL користувачі визначаються двома частинами (ім'я та хост). За замовчуванням MySQL матиме 3 кореневих користувача:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

Поле пароля буде порожнім (без пароля) або зберігається хеш. Якщо встановити пароль для одного конкретного користувача, він автоматично не оновлюватиме всіх, оскільки MySQL сприймає їх як різних користувачів.

Наприклад:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

оновить пароль для 'root'@'127.0.0.1', але ні 'root'@'localhost'або'root'@'localhost.localdomain'

Погляньте на skip_name_resolveзмінну:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

За замовчуванням skip_name_resolveє OFF, і намагатиметься вирішити всі адреси IP-адреси до імен хостів. Наприклад, якщо ви підключите як 'root'@'127.0.0.1', MySQL змінить з'єднати вас як 'root'@'localhost'.

Якщо це так ON, MySQL буде бачити та підключатись 'root'@'127.0.0.1'та 'root'@'localhost'бути окремими користувачами. І вони можуть мати або не мати різних паролів, залежно від того, як вони були встановлені.


Отже, спочатку я би перевірив, чи не було різниць із паролями: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Якщо вони є, ви можете виправити їх або продовжити розслідування.

Тоді я би перевірив skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Якщо це так ON, я б дізнався, де це встановлено (наприклад /etc/my.cnf), і видалив його, якщо тільки в цьому немає необхідності.

Сподіваємось, це вам допоможе!


1

У мене виникло це питання, і я не міг його розібратися. Я спробував усе, що міг штрафу, безрезультатно.

Я виявив, що у мене є .netrc в / root /, який мав інформацію в ньому.

Я видалив його, і проблема пішла.

Можливість увійти в mysql за допомогою mysql -uroot -p без проблем зараз.

Я знаю, що це старий пост, але сподіваюся, що це комусь допоможе.


1

Для мене зміна дозволів для публічного читання в батьківській директорії mysql.sock виправила проблему:

chmod 755 /var/lib/mysql

1

Для людей, які використовують CageFS з CloudLinux:

Я відтворив, /var/lib/mysqlбо будував сервер MySQL з нуля ...

які відмикали шлях від кліток. Я знаю, що це не пов'язано, але я використовував cPanel та CloudLinux. Я не міг перевірити, чому з'єднання з сокетом не працюватиме, і, нарешті, зрозумів.

додавання /var/lib/mysqlдо /etc/cagefs/cagefs.mp (якщо вже є перехід до наступного кроку) та запуску

cagefsctl --remount-all

виправили проблему


1
О БОЖЕ МІЙ! Це те, що це зафіксувало для мене! Це вже було, /etc/cagefs/cagefs.mpале cagefsctl --remount-allйого виправлено. Спасибі людино!
Альваро Фланьо Ларрондо

0

Ви повинні визначити це в приватному / etc / hosts, я думаю ... або просто використовувати 127.0.0.1, оскільки це все одно і те саме, просто псевдонім.


127.0.0.1 localhost - у моєму файлі хостів.
dcolumbus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.