Pymysql Доступ запрещен "с использованием пароля (нет"), но с использованием пароля



Здесь для меня платок.



Я пытаюсь подключиться к базе данных на моем локальном MySQL 8.0.11.0 install from Python.



Вот код, который я использую:



conn = pymysql.connect(host='localhost', port=3306, user='root', password='placeholder', db='CustomerInfo')


Python возвращает следующее :



Traceback (most recent call last):
File "D:PythonFileCheck.py", line 38, in <module>
conn = pymysql.connect(host='localhost', port=3306, user='root', password='placeholder', db='CustomerInfo')
File "C:Program FilesPython36libsite-packagespymysql__init__.py", line 90, in Connect
return Connection(*args, **kwargs)
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 704, in __init__
self.connect()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 974, in connect
self._request_authentication()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 1203, in _request_authentication
auth_packet = self._read_packet()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 1059, in _read_packet
packet.check_error()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 384, in check_error
err.raise_mysql_exception(self._data)
File "C:Program FilesPython36libsite-packagespymysqlerr.py", line 109, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")


Я подтвердил, что имею доступ к базе данных при входе в систему через MySQL Workbench. Самое странное, что Python говорит мне "using password: NO", хотя я отправляю пароль.



Я пытался измениться. passwd к "password" в скрипте и создание нового пользователя с соответствующими привилегиями. Ни то, ни другое не сработало.



Не знаю, что проверять дальше.



EDIT: вот гранты для root:



GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION
GRANT BACKUP_ADMIN,BINLOG_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *....
GRANT ALL PRIVILEGES ON `customerinfo`.* TO `root`@`localhost` WITH GRANT OPTION
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION


Правка 2:
Добавлены строки отладки для connect и _request_authentication в connections.py.



Вот последнее:



C:UsersPaul Miller>python.exe D:PythonFileCheck.py
** DEBUG 1 **
connect, line 973
host= localhost
user= root
password= placeholder


** DEBUG 2 **
_request_authentication line 1172
user= root
password= placeholder


Traceback (most recent call last):
File "D:PythonFileCheck.py", line 38, in <module>
conn = pymysql.connect(host='localhost', port=3306, user='root', password='placeholder', db='CustomerInfo')
File "C:Program FilesPython36libsite-packagespymysql__init__.py", line 90, in Connect
return Connection(*args, **kwargs)
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 704, in __init__
self.connect()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 982, in connect
self._request_authentication()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 1218, in _request_authentication
auth_packet = self._read_packet()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 1067, in _read_packet
packet.check_error()
File "C:Program FilesPython36libsite-packagespymysqlconnections.py", line 384, in check_error
err.raise_mysql_exception(self._data)
File "C:Program FilesPython36libsite-packagespymysqlerr.py", line 109, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")


Правка 3: включено ведение журнала. Никаких сюрпризов в журнале, но вот какая последняя попытка генерируется:



2018-05-15T10:27:15.197445Z    43 Connect   root@localhost on CustomerInfo using TCP/IP
2018-05-15T10:27:15.197540Z 43 Connect Access denied for user 'root'@'localhost' (using password: NO)


EDIT 4: нашел проблему. Я добавил несколько отладочных операторов следующим образом:



    if self._auth_plugin_name in ('', 'mysql_native_password'):
print("** DEBUG 3 **")
print(self.password)
print("n")
authresp = _scramble(self.password.encode('latin1'), self.salt)


Проблема заключается в следующем, если блок не работает... поток программ не доходит до утверждения "authresp". Когда мой коллега запускает эту же программу, его пароли печатаются в консоли.



Итак, теперь мне просто нужно понять, почему я не собираюсь спускаться по этой ветке.
802   2  

2 ответов:

Решил проблему после понижения уровня MySQL с 8.0.11.0 до 5.7.22.

В дополнение к тому, что я перечислил в своем первоначальном вопросе, я также попробовал следующее:

  • установлена более низкая версия PyMySQL (от 0.8.1 до 0.8.0 в моем случае)
  • полностью удалены обе версии PyMySQL и установлен v0. 8. 0
  • удалил MySQL 8.0 и переустановил

Когда ничего из вышеперечисленного не сработало, я понизил MySQL до v5.7, что и использует один из моих коллег. Это разрешилось ошибка.

Это странно. Я бы установил pymysql в виртуальной среде, а затем бросил бы несколько строк отладки в этой функции:

Https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/connections.py#L940

Это должно показать, какие переменные он на самом деле использует для соединения и сделать его очевидным, что неправильно.

Comments

    Ничего не найдено.