Mysqli:: mysqli(): (HY000/2002): Не удается подключиться к локальному серверу MySQL через сокет "MySQL" (2)
Я получаю эту ошибку, когда пытаюсь подключиться к базе данных mysql, используя php mysqli class. Используя следующий код:
$db = new MySQLi("localhost","kamil","*****");
if (mysqli_connect_errno())
{
echo "An error occured. Please try again later.";
exit();
}
пароль * для обеспечения безопасности.
Я создал пользователя kamil
со всеми привилегиями на внешний IP-адрес и localhost. Когда я запускаю: select user,host from mysql.user
он правильно отображает этих двух пользователей.
Я провел некоторое исследование и использовал этот тест: qaru.site/info/131950/..., чтобы узнать, к чему он подключается. Как оказалось, он может подключаться только к 127.0.0.1
и 127.0.0.1:3306
, который является localhost, однако при поставке localhost
он выдает эту ошибку.
Мой вопрос в том, почему это только позволяет мне подключиться к БД, используя адрес localhost ip, а не имя или внешний ip. Нужен ли мне другой хост, если я хочу использовать mysql на веб-сайте, или если я могу использовать 127.0.0.1
?
EDIT:
hosts
файл
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 raspberrypi
Результаты поиска пользователя Mysql для этого пользователя:
| kamil | 109.255.177.28 |
| kamil | localhost |
Ответы
Ответ 1
Когда вы используете только "localhost", клиентская библиотека MySQL пытается использовать сокет домена Unix для подключения вместо соединения TCP/IP. Ошибка сообщает вам, что сокет, называемый MySQL
, не может использоваться для соединения, вероятно, потому, что он не существует (номер ошибки 2).
Из Документация MySQL:
В Unix программы MySQL обрабатывают имя хоста localhost специально, в путь, который, вероятно, отличается от того, что вы ожидаете, по сравнению с другими сетевые программы. Для соединений с локальным хостом, программы MySQL попытайтесь подключиться к локальному серверу с помощью файла сокета Unix. Это происходит, даже если параметр -port или -P задан для указания порта номер. Чтобы клиент выполнял TCP/IP-соединение с локальный сервер, используйте -host или -h, чтобы указать значение имени узла 127.0.0.1, или IP-адрес или имя локального сервера. Вы также можете указать протокол подключения явно, даже для localhost, используя опцию --protocol = TCP.
Есть несколько способов решить эту проблему.
- Вы можете просто использовать TCP/IP вместо Unix-сокета. Вы должны сделать это, используя
127.0.0.1
вместо localhost
при подключении. Однако сокет Unix может быть быстрее и безопаснее.
- Вы можете изменить сокет в
php.ini
: откройте файл конфигурации MySQL my.cnf
, чтобы найти, где MySQL создает сокет, и установите PHP mysqli.default_socket
на этот путь. В моей системе это /var/run/mysqld/mysqld.sock
.
-
Настройте сокет непосредственно в PHP script при открытии соединения. Например:
$db = new MySQLi('localhost', 'kamil', '***', '', 0,
'/var/run/mysqld/mysqld.sock')
Ответ 2
Если это проблема с PHP, вы можете просто изменить конфигурационный файл php.ini везде, где он находится, и обновить настройки для PORT/SOCKET-PATH и т.д., чтобы подключиться к серверу.
В моем случае я открыл файл php.ini и сделал
mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock
И это сработало сразу. Должен признаться, я принял намек на принятый ответ @Joni
Ответ 3
Если "localhost" не работает, но 127.0.0.1. Убедитесь, что ваш локальный файл hosts указывает на правильное местоположение. (/etc/hosts для linux/mac, C:\system32\drivers\etc\hosts для Windows).
Кроме того, убедитесь, что вашему пользователю разрешено подключаться к любой базе данных, которую вы пытаетесь выбрать.
Ответ 4
Пожалуйста, проверьте следующий файл
%SystemRoot%\system32\drivers\etc\host
Строка, которая связывает имя хоста с ip, вероятно, отсутствует строка, которая связывает их togather
127.0.0.1 localhost
Если данная строка отсутствует. Добавьте строку в файл
Не могли бы вы также проверить свою таблицу пользователей базы данных MySQL и сообщить нам значение столбца хоста для пользователя, который вы используете. У вас должна быть привилегия пользователя как для хоста "127.0.0.1", так и для "localhost" и использовать%, так как это дикое char для общего имени хоста.
Ответ 5
[RESOLVED]: Решение, которое мы интегрировали, мы увеличили пространство на сервере, и оно было разрешено.
Не знаю точную причину, но это позволяет нам решить проблему.