python - 在 Python 中使用 MySQL 连接器出现“客户端不支持服务器请求的身份验证协议”的错误
问题描述
您好亲爱的 StackOverflow 朋友们,
连接到托管 MySQL 实例 (DigitalOcean) 时收到一个奇怪的错误。该连接在我的开发计算机(Windows 8.1 机器)上有效,但在 Prod 服务器上无效(CentOS 8,SELinuxpermissive
模式)。该连接也适用于 MySQL Workbench。
我已经pip freeze
在提到的两个环境中完成了,这两个结果都mysql-connector-python==8.0.19
让我觉得很奇怪。我确保在venv
激活的情况下运行我的测试。
托管 MySQL 8.x 实例设置为允许来自我的 droplet 和我的开发 IP 地址的连接。我也试过没有启用防火墙。托管实例需要使用启用 SSL 的连接,因此提供了 CA 证书(我现在已经应用chmod 777
了它以确保这不是问题的原因)。
我检查了我正在使用的库的文档,它与 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
>>>
你认为这里的问题可能是什么?
解决方案
StackOverflow 的神奇之处在于,当您发布一个问题时,您会在几分钟内找到解决方案。发生了两件事:
- 有一半时间我没有到 MySQL 数据库的网络连接。
- 所以我在 ping 服务器之前运行了各种测试,然后我意识到我应该再次运行所有测试,但我没有从基础开始(我做了所有应用补丁的测试,而不是尝试“香草”首先连接,可以这么说)。
解决方案是我注释掉了,client_flags=ClientFlag.SSL,
但启用了 CA 证书,并且连接在 Prod 服务器中按预期工作。
推荐阅读
- asp.net-mvc-viewmodel - MVC 视图中的 if else 条件
- python - 抓取不断更新的网页
- image - 有没有办法直接从字节创建光栅图像以用于画布(不显示)显示?
- google-cloud-platform - 循环遍历许多文件时如何增加gcsfuse吞吐量?
- c# - AAD 身份验证和 cookie 名称?
- r - r 在绘制日内数据时如何从 x 轴中删除工作日的非工作时间(以及周末和节假日)
- python - scikit k-means:查找属于特定质心生成集群的数据点
- bootstrap-4 - 如何在 Bootstrap 媒体对象中使用 fontawesome 堆叠图标
- sql - 如何运行返回数据库中每个表的排序规则类型的查询
- html - 将图像浮动到文本右侧时图像和文本之间的间隙