Назад | Перейти на главную страницу

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

для меня это в некоторой степени загадка. Единственный способ, которым я могу подключиться к 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)

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 перед его тестированием.

У вас может быть включен IPv6, его очень возможный localhost преобразуется в localhost ipv6, который не определен в вашей конфигурации msql.

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

Для меня встроенный 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)'

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

У меня действительно была похожая проблема некоторое время назад (хотя ее не было в OSx), поэтому я подумал, что, возможно, стоит попробовать.

PHP все еще пытается использовать расположение сокета по умолчанию. Эта проблема может возникнуть, если у вас переместил папку MariaDB / MySQL из / var / lib / mysql в другое место. Чтобы решить эту проблему, вам необходимо определить местоположение нового сокета в /etc/php.ini файл.

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

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

Чтобы проверить текущий каталог, выполните в mysql следующую команду:

select @@datadir;

Локальный хост определен в вашем /private/etc/hosts файл?

Мне удалось воссоздать те же симптомы на своем тестовом боксе, надеюсь, это поможет.

В MySQL пользователи определяются двумя частями (именем и хостом). По умолчанию в MySQL будет 3 пользователя root:

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) и удалите его, если в этом нет необходимости.

Надеюсь, это поможет вам!

У меня была эта проблема, и я не мог ее понять. Я пробовал все, что мог, безрезультатно.

Я обнаружил, что у меня есть .netrc в / root /, в котором есть информация.

Я удалил его, и проблема исчезла.

Теперь можно без проблем войти в mysql с помощью mysql -uroot -p.

Я знаю, что это старый пост, но надеюсь, что это кому-то поможет.

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

chmod 755 /var/lib/mysql

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

Я воссоздал /var/lib/mysql потому что я перестраивал сервер MySQL с нуля ...

который размонтировал путь от cagefs. Я знаю, что это не связано, но я использовал cPanel и CloudLinux. Я не мог понять, почему соединение через сокет не работает, и, наконец, понял.

добавление /var/lib/mysql к /etc/cagefs/cagefs.mp (если уже есть, переходите к следующему шагу) и запускается

cagefsctl --remount-all

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

вы должны определить его в private / etc / hosts, я думаю ... или просто используйте 127.0.0.1, потому что это то же самое, просто псевдоним.