Здравствуйте, дорогие друзья из StackOverflow,
При подключении к управляемому экземпляру MySQL (DigitalOcean) я получаю странную ошибку. Соединение работает на моем компьютере Dev (машина Windows 8.1), но не на сервере Prod (CentOS 8, SE Linux в режиме permissive
). Соединение также работает с MySQL Workbench.
Я сделал pip freeze
в обеих упомянутых средах, и оба результата mysql-connector-python==8.0.19
, что я нахожу очень странным. Я проверил свои тесты с активированным venv
.
Управляемый экземпляр MySQL 8.x настроен так, чтобы разрешать соединения как с моей дроплеты, так и с моего IP-адреса разработчика. Я также попробовал это без включенного брандмауэра. Управляемый экземпляр требует использования соединения с поддержкой SSL, поэтому предоставляется сертификат CA (на данный момент я применил к нему chmod 777
, чтобы убедиться, что это не является причиной проблемы).
I ' я проверил документацию библиотеки, которую я использую, и она совместима с MySQL 8.
Стоит также отметить, что я также попробовал решение в этом вопросе об этом.
Код следующий. Работает, как и ожидалось, в Windows.
import datetime
import mysql.connector
from mysql.connector.constants import ClientFlag
dbconn_host = '<sanitized>'
dbconn_port = '<sanitized>'
dbconn_user = '<sanitized>'
dbconn_passwd = '<sanitized>'
dbconn_database = '<sanitized>'
cnx = mysql.connector.connect(
host=dbconn_host,
port=dbconn_port,
user=dbconn_user,
passwd=dbconn_passwd,
database=dbconn_database,
client_flags=ClientFlag.SSL,
ssl_ca='.\\ca_certificate.crt', # When running on prod server I change it to a proper Linux path
# auth_plugin='caching_sha2_password' # Trying another solution I had it changed to mysql_native_password
)
cur_a = cnx.cursor(buffered=True)
query_sel = (
"SELECT * FROM datasources"
)
cur_a.execute(query_sel)
for w in cur_a:
print(w[0])
Это трассировка стека, которую я получаю в Linux.
(venv) [root@<sanitized> <sanitized>]# python -i conn-test.py
Traceback (most recent call last):
File "conn-test.py", line 12, in <module>
cnx = mysql.connector.connect(
File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/__init__.py", line 219, in connect
return MySQLConnection(*args, **kwargs)
File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 104, in __init__
self.connect(**kwargs)
File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/abstracts.py", line 960, in connect
self._open_connection()
File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 290, in _open_connection
self._do_auth(self._user, self._password,
File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 212, in _do_auth
self._auth_switch_request(username, password)
File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 256, in _auth_switch_request
raise errors.get_exception(packet)
mysql.connector.errors.DatabaseError: 1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client
>>>
Как вы думаете, в чем здесь проблема?