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