Не удается подключиться к MySQL, используя localhost, но используя 127.0.0.1, это нормально?

12

Мой файл / etc / hosts выглядит так:

127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

При сборке сервера я обнаружил, что, хотя я мог успешно пропинговать localhost, в некоторых файлах конфигурации для сервисов, таких как Postfix и Apache и Dovecot, мне нужно было указать 127.0.0.1вместо localhostтого, чтобы заставить их работать.

Мне также нужно было изменить конфигурационные файлы определенных веб-сайтов, управляемых базой данных, которые использовались localhostдля подключения к MySQL.

Я пробовал различные модификации hostsфайла, но пока ничего не помогло.

Сервер работает под управлением Ubuntu 12.04.02 LTS. На нем не установлено selinux, и описанная выше ситуация сохраняется даже после установки политик IPtables по умолчанию для их принятия и сброса.

Питер Сноу
источник

Ответы:

15

Вы можете проверить одну вещь (которая требует входа в консоль MySQL) - проверьте, чтобы убедиться, что у вас есть разрешения для входа rootчерез localhost.

mysql -h 127.0.0.1 -u root -p

- Как только вы успешно вошли в систему -

mysql> select user,host from mysql.user;
+------+--------------------------------+
| user | host                           |
+------+--------------------------------+
| root | 127.0.0.1                      | 
| root | ::1                            |
| root | localhost                      | <-- Make sure you have a localhost entry for root
+------+--------------------------------+
3 rows in set (0.00 sec)

Просто выбрасываю это на всякий случай, вот в чем проблема.

drewrockshard
источник
Я чувствую, что вы на правильном пути. Я сделал это, и я вижу, что хотя root и пара других пользователей были созданы для localhost, те, что созданы панелью управления хостингом для пользователей, предназначены для всех 127.0.0.1(кроме одного, который есть %). Я думаю, что этого достаточно, чтобы я мог это исправить, поэтому я, вероятно, вскоре приму ваш ответ.
Питер Сноу,
Спасибо за помощь! Я хотел бы добавить, что перезагрузка сервера mysql требуется после обновления таблицы mysql.user, чтобы изменения вступили в силу.
LOVOVIC10
Несмотря на то, что это принято, для mysql это обычно не является (когда-либо?) Проблемой. См EEAA в ответ вместо (MySQL интерпретирует localhostкак socketвместо TCP).
ToolmakerSteve
8

Большинство клиентов MySQL странно в том факте, что если вы укажете хост как localhost, они псевдоним этого соединения с сокетом вместо соединения TCP. Ваши варианты: либо придерживаться, 127.0.0.1либо, если клиент поддерживает это (как двоичный файл CLI mysql делает с --protocolфлагом), заставить его использовать TCP вместо сокета unix.

EEAA
источник
Спасибо ЕЕАА. Проблема в том, что такие вещи, как установщик Joomla, терпят неудачу. Если во время установки вы указываете 127.0.0.1вместо поля localhostимени хоста, это приводит к путанице в путях установки, что вызывает другие ошибки, но при указании localhost не удается подключиться к базе данных! Чем вызвана эта ситуация? Почему у меня это есть?
Питер Сноу,
3
@PeterSnow Настройте сокет домена Unix в своей конфигурации MySQL.
Майкл Хэмптон
Спасибо @MichaelHampton. Я искал последние полчаса и не могу найти, как это настроить. Можете ли вы указать мне статью или дать мне идею, пожалуйста? У меня есть socket = /var/run/mysqld/mysqld.sockв my.cnfи файл существующего, принадлежащий MySQL с правами 777. Спасибо.
Питер Сноу,
@PeterSnow Вы перезапустили mysqld после внесения этого изменения?
EEAA
В настоящее время я пытаюсь использовать его через скрипт установки Joomla. Страница http запрашивает имя хоста. Если я выбираю, 127.0.0.1это работает (но сценарий использует запись позже и терпит неудачу, потому что он ожидает разрешимое имя как localhost), но если я использую localhost, соединение, чтобы создать базу данных, терпит неудачу.
Питер Сноу,
1

Стоит отметить, что, если гранты верны, если вы используете MariaDB, произошла ошибка, которая привела к такому поведению в версиях 10.0.1 и 5.5.30 https://mariadb.atlassian.net/browse/MDEV-4356

Скотт Макинтайр
источник
1

Вы можете проверить разрешение следующим образом:

[learner@localhost ~]$ sudo netstat -npa | grep mysqld  
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      6284/mysqld         
unix  2      [ ACC ]     STREAM     LISTENING     233040 6284/mysqld         /var/lib/mysql/mysql.sock

Если это прослушивание 0 0.0.0.0:*, это означает, что каждый может получить доступ к этому mysql.

Вы можете отредактировать привязку для этого в файле my.conf. В Linux путь по умолчанию для этого:

[learner@localhost ~]$ sudo vi /etc/my.cnf

Добавьте эти строки в файл my.conf, чтобы разрешить IP, который вы хотите.

bind-address = 127.0.0.1   
bind-address = 0.0.0.0
a_learner
источник
Спасибо a_learner, за информацию, хотя я уже принял ответ.
Питер Сноу
0

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

mysqli.default_socket =/newDBLocation/mysql/mysql.sock
joelschmid
источник
0

Я решил эту проблему, создав символическую ссылку sudo ln -s /opt/lampp/var/mysql/mysql.sock /var/run/mysqld/mysqld.sock. Но сначала я должен создать папку, /var/run/mysqld/потому что папка изначально не существовала.

saharul
источник
-1

Вам нужен mysql.sock в / tmp

ln -s /var/lib/mysql/mysql.sock mysql.sock

должно работать нормально после этого.

Уильям
источник