MySQL: «Доступ запрещен к x @ localhost» с использованием python

0

Я пытался подключиться к MySQL с помощью python. Он подключен в WorkBench MySQL. Затем в cmd я попытался подключиться (показано ниже). Это сработало!

mysql -u MyNewPass

Однако, когда я запускал код python:

db = MySQLdb.connect(host = "127.0.0.1", user="root", passwd="MyNewPass", db="test", port=3306)

Он показал ошибки

db = MySQLdb.connect(host = "127.0.0.1", user="root", passwd="MyNewPass", db="test", port=3306)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/MySQLdb/__init__.py", line 74, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/MySQLdb/connections.py", line 170, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")

Может ли кто-нибудь помочь мне в этом? Спасибо

Теги:

1 ответ

0

В MySQL пользователь идентифицируется именем пользователя ("root") и хостом, с которого пользователь подключается.

В MySQL на Linux имя хоста "localhost" является особенным, оно указывает соединение через локальный сокет, а не соединение TCP/IP.

Похоже, что разрешение имени DNS-узла включено (--skip-name-resolve не указана для сервера MySQL)

Похоже, сервер MySQL видит соединение, исходящее от IP-адреса 127.0.0.1, затем выполняет обратный поиск и находит имя хоста "localhost", а затем ищет соответствующий "root" @"localhost" пользователя.

(Это объяснение для меня немного странно, но у меня нет никаких других объяснений поведения, поскольку Python connect указывает IP-адрес сервера MySQL 127.0.0.1, а сообщение об ошибке "root" @"localhost" указывает,.)


Некоторые предложения:

Попробуйте подключиться к TCP/IP-соединению, а не к локальному сокетному соединению. С клиентом командной строки MySQL мы будем указывать --protocol=TCP например

mysql ... --protocol=TCP ...

Я не уверен в точном синтаксисе для коннектора Python, но я ожидаю, что это будет очень похоже.

Или попробуйте указать имя хоста "localhost" для использования локального соединения сокета.

Проверьте содержимое таблицы mysql.user для пользователей с именем "root" в качестве имени пользователя

SELECT user, host, password FROM mysql.user WHERE user = 'root' 

Обратите внимание, что пароль для "root" @"%" может отличаться от "root" @"localhost", потому что это разные пользователи.


Что действительно запутывает, так это то, что похоже, что соединение предоставило IP-адрес 127.0.0.1 в качестве целевого хоста, и похоже, что он должен принудительно установить TCP-соединение. Но MySQL, похоже, сообщает об ошибке при попытке подключения с помощью unix-сокета.

Сообщаемое поведение очень странно. Я не уверен, что происходит с коннектором Python, чтобы заставить 127.0.0.1 интерпретироваться как подключение к локальному хосту.

Здесь ссылка на ожидаемое поведение:

https://dev.mysql.com/doc/refman/5.7/en/connecting.html

В Unix программы MySQL обрабатывают имя хоста localhost специально таким образом, который, вероятно, отличается от ожидаемого по сравнению с другими сетевыми программами. Для соединений с localhost программы MySQL пытаются подключиться к локальному серверу с помощью файла сокета Unix. Это происходит, даже если задана опция --port или -P для указания номера порта. Чтобы клиент установил TCP/IP-соединение с локальным сервером, используйте --host или -h, чтобы указать значение имени узла 127.0.0.1 или IP-адрес или имя локального сервера. Вы также можете указать протокол подключения явно, даже для localhost, с помощью опции --protocol = TCP.

  • 0
    Спасибо за вашу помощь. Когда я не добавил пароль, это сработало. Я не уверен, почему ?? !!!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню