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

MySql: может нормально подключаться к локальной базе данных, может подключаться через TCP удаленно, но не может подключаться через TCP локально

На хосте A работает сервер mysql. На A я могу подключиться к db:

hostA: mysql -p

Я разрешил подключиться пользователю X с хоста B. Я могу подключиться через это:

hostB: mysql -h A --protocol=TCP -p -u X

Однако я не могу подключиться к A из A через TCP:

hostA: mysql -h 127.0.0.1 --protocol=tcp -p

Он говорит:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

Я пробовал следующие адреса:

localhost, 127.0.0.1, <hostname>, <actual ip>

Адрес привязки в my.cnf - это фактический IP-адрес.

Есть предположения? Кто-нибудь может предложить дальнейшую диагностику?

Ваша команда:

hostA: mysql -h 127.0.0.1 --protocol=tcp -p

означает подключение к серверу через TCP-сокет, используя IP-адрес loopack 127.0.0.1.

Похоже, ваш демон mysql (mysqld) прослушивает IP-адрес одного из интерфейсов. Вы можете убедиться в этом, посмотрев файл my.cnf:

bind-address  = your_server_ip_addr

и используя:

$ sudo netstat -lnp | grep mysql

Если вы укажете bind-address так как:

  1. 0.0.0.0: слушать на всех интерфейсах или
  2. 127.0.0.1: слушать только локально

ваша команда должна работать.

Чтобы решить эту проблему, вам нужно либо изменить свою команду, чтобы она была такой:

mysql -h your_sever_ip_addr --protocol=tcp -p

или измените адрес привязки соответствующим образом.

закомментируйте строку с адресом привязки в файле my.cfn, перезапустите демон и попробуйте затем. После этого mysqld должен прослушивать все интерфейсы

#bind-address=...

mysqld имеет очень неприятную привычку маршрутизировать соединения TCP / IP DB через 127.0.0.1 порт 3306 в файл сокета.

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

mysql> SELECT USER(),CURRENT_USER();

В USER() функция сообщает вам, как вы пытались аутентифицироваться

В CURRENT_USER() функция сообщает вам, как mysqld позволил вам аутентифицировать

Если ты видишь root@localhost для CURRENT_USER(), то TCP / IP не используется.

@Khaled уже упоминал об этом:

mysql -h your_sever_ip_addr --protocol=tcp -p

Вот что вам нужно для исследования

Запустите эту команду

SELECT CONCAT(user,'@',host) RootUser,password FROM mysql.user WHERE user='root';

У тебя уже должно быть root@localhost. Вы также должны иметь root@127.0.0.1 с тем же паролем, что и root@localhost или другой, если хотите.

Если у вас нет root@127.0.0.1, вот как создать root@127.0.0.1 с тем же паролем, что и root@localhost:

CREATE TABLE mysql.roothome LIKE mysql.user;
INSERT INTO mysql.roothome SELECT * FROM mysql.user
WHERE user='root' AND host='localhost';
UPDATE mysql.roothome SET host='127.0.0.1';
INSERT INTO mysql.user SELECT * FROM mysql.roothome;
DROP TABLE mysql.roothome;
FLUSH PRIVILEGES;

Вот как создать root@127.0.0.1 с другим паролем от root@localhost:

CREATE TABLE mysql.roothome LIKE mysql.user;
INSERT INTO mysql.roothome SELECT * FROM mysql.user
WHERE user='root' AND host='localhost';
UPDATE mysql.roothome SET host='127.0.0.1',password=password('whateveryouwant');
INSERT INTO mysql.user SELECT * FROM mysql.roothome;
DROP TABLE mysql.roothome;
FLUSH PRIVILEGES;

Попробуйте !!!