如何在Azure Databricks中通过Windows认证连接Azure SQL Server并解决连接报错
解决Azure Databricks通过Windows认证连接SQL Server的问题
先排查基础连接故障
报错核心是TCP/IP连接失败,先确认以下前置条件:
- 确认SQL Server实例已开启TCP/IP协议,且监听1433端口
- 检查数据库服务器防火墙,允许Azure Databricks所在IP段访问1433端口
- 确保JDBC使用的hostname正确(公网环境用服务器FQDN,同VNet内网可用私有IP/内网FQDN)
正确连接代码(分场景)
场景1:Databricks与SQL Server在同一Azure VNet(推荐)
同VNet内可直接用集成Windows认证,需确保Databricks集群的服务主体拥有SQL Server访问权限:
jdbcHostname = "你的服务器FQDN或内网IP" jdbcPort = "1433" jdbcDatabase = "目标数据库名" # 构造集成认证的JDBC地址 jdbcUrl = f"jdbc:sqlserver://{jdbcHostname}:{jdbcPort};database={jdbcDatabase};integratedSecurity=true;authenticationScheme=JavaKerberos" connectionProperties = { "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver" } # 读取数据库表数据 jdbcDF = spark.read.jdbc(url=jdbcUrl, table="目标表名", properties=connectionProperties)
场景2:公网连接,用Azure AD认证替代原生Windows认证
公网环境下原生Windows认证稳定性差,推荐用Azure AD服务主体认证:
jdbcHostname = "你的服务器公网FQDN" jdbcPort = "1433" jdbcDatabase = "目标数据库名" aadClientId = "你的服务主体Client ID" aadSecret = "你的服务主体密钥" aadTenant = "你的Azure租户ID" # 构造Azure AD认证的JDBC地址 jdbcUrl = f"jdbc:sqlserver://{jdbcHostname}:{jdbcPort};database={jdbcDatabase};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;authentication=ActiveDirectoryServicePrincipal" connectionProperties = { "user": aadClientId, "password": aadSecret, "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver" } # 读取数据库表数据 jdbcDF = spark.read.jdbc(url=jdbcUrl, table="目标表名", properties=connectionProperties)
关键注意事项
- 集成认证模式下不需要手动传入username和password,避免参数冲突
- 公网环境优先使用Azure AD认证,兼容性远高于原生Windows认证
- 确保Databricks集群使用的Runtime已预装最新版SQL Server JDBC驱动(若未预装可手动上传驱动包)
内容的提问来源于stack exchange,提问作者user10434309
相关产品推荐
相关产品推荐

