Azure Databricks Python连接外部MySQL部分驱动报错原因咨询
Azure Databricks连接外部MySQL问题排查
问题场景
- 从Azure Databricks环境连接外部私有MySQL数据库时,使用pymysql、SQLAlchemy编写连接代码均返回1045访问拒绝错误,使用
mysql.connector可正常连接。 - pymysql连接代码示例:
conn = pymysql.connect( host='.....', user='.....', password = "....", db='....') cur = conn.cursor()
- SQLAlchemy连接代码示例:
engine = create_engine("mysql+pymysql://{0}:{1}@hostname:3306/database".format('user','password')) connection = engine.connect()
- 两类代码统一报错:
OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'user'@'IP_address' (using password: YES)")
前置说明:目标外部数据库已开启远程访问,Databricks访问出口IP已加入数据库白名单。
- 正常可用的mysql.connector代码示例:
connection = connect( host=dbutils.secrets.get(scope="resource_group", key="key"), port=dbutils.secrets.get(scope="resource_group", key="key"), user=dbutils.secrets.get(scope="resource_group", key="key"), password=dbutils.secrets.get(scope="resource_group", key="key"), database="db") cursor = connection.cursor()
相同网络与账号配置下,SQLAlchemy和pymysql连接失败的原因
按出现概率从高到低排序,核心原因有三类:
- 认证插件兼容性问题:MySQL 8.0及以上版本默认使用
caching_sha2_password作为用户认证插件,Azure Databricks各Runtime版本预装的pymysql大多为1.0以下的旧版本,这类版本原生不支持caching_sha2_password认证逻辑,仅兼容旧版mysql_native_password插件,认证阶段会直接被服务端拒绝,抛出1045错误。而Oracle官方维护的mysql.connector-python从8.0.11版本开始就完整适配caching_sha2_password认证流程,和MySQL 8.x服务端完全兼容,因此可以正常连接。 - 凭据传递错误:正常可用的连接逻辑通过
dbutils.secrets读取密钥,不存在硬编码问题。如果pymysql、SQLAlchemy代码中硬编码凭据,一旦密码包含@、:、/、?这类URL保留字符,SQLAlchemy会将这些字符识别为连接串分隔符,导致实际传递给数据库的用户名、密码解析错误;如果pymysql直连时手动填写的凭据存在前后空格、取值错误,也会触发相同的1045报错。 - SSL连接要求不匹配:多数生产环境私有MySQL会强制要求客户端通过SSL建立连接,旧版pymysql默认关闭SSL协商,不会携带SSL连接参数,会直接被服务端拒绝认证;而mysql.connector默认自动尝试SSL协商,符合服务端安全要求,因此可以通过认证。
Azure Databricks是否仅支持特定Python SQL连接器及相关限制原因
Azure Databricks没有官方强制要求必须使用特定Python SQL连接器,理论上只要是纯Python实现、可在Databricks Runtime的Python环境中正常安装、符合数据库通信协议的连接器都可以使用。
实际使用中出现部分连接器可用、部分不可用的核心原因有三点:
- 预装版本兼容性差异:Databricks Runtime会预装部分常用连接器(包括mysql.connector、pyodbc、psycopg2等),预装版本均经过兼容性验证,适配Runtime内置的OpenSSL、Python小版本环境;用户自行安装的pymysql等第三方库如果版本过低,和Runtime底层依赖不兼容,就会出现连接失败。
- 云网络环境适配差异:Databricks集群出口流量经过NAT网关转发,部分维护不活跃的旧版连接器在NAT环境下处理TCP握手、SSL协商时存在已知bug,会导致连接被拦截;而官方维护的主流连接器对云环境、NAT场景的适配更完善,不容易出现这类问题。
- 安全策略适配差异:Databricks集群默认拦截使用TLS1.0/1.1等过时加密协议的出网流量,部分旧版连接器默认使用低版本加密协议,会被集群侧直接拦截;经过兼容性验证的连接器默认使用TLS1.2及以上的符合安全要求的协议,可正常发起连接。
内容的提问来源于stack exchange,提问作者Data Analytics CSMAG
相关产品推荐
相关产品推荐

