首页 > 解决方案 > 在 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
>>>

你认为这里的问题可能是什么?

标签: pythonmysqlmysql-connector-python

解决方案


StackOverflow 的神奇之处在于,当您发布一个问题时,您会在几分钟内找到解决方案。发生了两件事:

  • 有一半时间我没有到 MySQL 数据库的网络连接。
  • 所以我在 ping 服务器之前运行了各种测试,然后我意识到我应该再次运行所有测试,但我没有从基础开始(我做了所有应用补丁的测试,而不是尝试“香草”首先连接,可以这么说)。

解决方案是我注释掉了,client_flags=ClientFlag.SSL,但启用了 CA 证书,并且连接在 Prod 服务器中按预期工作。


推荐阅读