Я пытался подключиться к 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)")
Может ли кто-нибудь помочь мне в этом? Спасибо
В 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.