Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用MySQL连接器获取错误“客户端不支持服务器请求的身份验证协议”_Python_Mysql_Mysql Connector Python - Fatal编程技术网

在Python中使用MySQL连接器获取错误“客户端不支持服务器请求的身份验证协议”

在Python中使用MySQL连接器获取错误“客户端不支持服务器请求的身份验证协议”,python,mysql,mysql-connector-python,Python,Mysql,Mysql Connector Python,亲爱的朋友们好, 我在连接到托管MySQL实例时收到一个奇怪的错误。该连接在我的开发计算机Windows 8.1计算机上工作,但在Prod服务器CentOS 8上不工作,SELinux处于许可模式。该连接也可用于MySQL工作台 我在上述两个环境中都进行了pip冻结,结果都是mysql连接器python==8.0.19,我觉得这很奇怪。我已确保在激活venv的情况下运行测试 托管MySQL 8.x实例被设置为允许从我的droplet和我的Dev IP地址进行连接。我也尝试过在没有启用防火墙的情况

亲爱的朋友们好,

我在连接到托管MySQL实例时收到一个奇怪的错误。该连接在我的开发计算机Windows 8.1计算机上工作,但在Prod服务器CentOS 8上不工作,SELinux处于许可模式。该连接也可用于MySQL工作台

我在上述两个环境中都进行了pip冻结,结果都是mysql连接器python==8.0.19,我觉得这很奇怪。我已确保在激活venv的情况下运行测试

托管MySQL 8.x实例被设置为允许从我的droplet和我的Dev 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服务器中按预期工作连接。

附录:身份验证不是问题,我已使用$mysql client测试了Prod服务器到DB服务器的凭据,并成功登录。