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
Вероятно, это больше из-за сбоя сервера, но убедитесь, что ваш файл hosts имеет псевдоним localhost.
Мэтт

127.0.0.1 localhost находится в моем файле hosts.
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 мс
dcolumbus

Ответы:


26

MySQL попытается подключиться к сокету unix, если вы скажете ему подключиться к «localhost». Если вы скажете ему подключиться к 127.0.0.1, вы заставите его подключиться к сетевому сокету. Поэтому, вероятно, MySQL настроен на прослушивание только сетевого сокета, а не сокета файловой системы.

Что именно не так с вашим сокетом Unix, сказать сложно. Но я рекомендую вам прочитать эту страницу в справочном руководстве по MySQL. Это должно помочь вам.

ОБНОВЛЕНИЕ: на основе обновленного вопроса: параметр "сокет" должен выглядеть примерно так: "/var/lib/mysql/mysql.sock". Эта страница в Справочном руководстве содержит дополнительную информацию.

Здесь у вас есть начало моего файла /etc/my.cnf:

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

Ваш файл должен быть похожим. Тогда ваша проблема должна быть решена. Не забудьте перезапустить сервер MySQL перед его тестированием.


1
Wow: «Файл сокета 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, который не определен в вашей конфигурации msql.

У меня также была проблема, когда я должен был добавить «localhost» вместо «127.0.0.1» в разрешенные подсети для этого пользователя, не понимаю почему (я использовал ipv4, и это было некоторое время назад), но его стоит попробовать.


Вы можете проверить это, посмотрев, возвращает ли 'host localhost' в командной строке :: 1, а также 127.0.0.1. Если это так, вы можете удалить отображение :: 1 из / private / etc / hosts или перенастроить MySQL для прослушивания адреса IPv6 :: 1, а также 127.0.0.1
Дэвид Норт,

Я думаю, что помню, что читал где-то, что IPv6 включен по умолчанию в Mac OS X ... это так?
dcolumbus

ipv6 в настоящее время включен практически для всех современных ОС, im на OSX10.6 и включен по умолчанию.
Silverfire

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

5

Для меня встроенный php OSX настроен на использование другого unix-сокета, чем mysql homebrew. Таким образом, он не может подключиться через localhost, который использует этот сокет.

Я исправил это быстрым взломом, используя символьный путь к сокету в php, чтобы указать на тот, который фактически использует mysql.

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

Следующие диагностические команды были очень полезны.

Проверьте пути к сокетам по умолчанию, используемые 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

Определите, какой тип сокета 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 находится в моем файле hosts.
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 с нуля ...

который размонтировал путь от cagefs. Я знаю, что это не связано, но я использовал 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 находится в моем файле hosts.
dcolumbus
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.