На хосте 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
так как:
0.0.0.0
: слушать на всех интерфейсах или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;
Попробуйте !!!