如何通过Python从Linux连接仅支持AD认证的SQL Server?
报错根因
SSPI Provider: Server not found in Kerberos database (851968) 报错和你本地用户的Kerberos凭证无关,是Active Directory(AD)中缺少SQL Server服务对应的服务主体名称(SPN),或者SPN配置与你连接时使用的服务地址不匹配。
排查修复步骤
- 确认SQL Server服务对应的SPN格式是否正确
你连接的SQL Server实例需要在AD中注册2条SPN,默认端口1433场景下格式为:MSSQLSvc/servername.fqdn.comMSSQLSvc/servername.fqdn.com:1433
若SQL Server使用非默认端口,需将1433替换为实际端口号。 - 查询AD中现有SPN配置
在域控或已加入域的Windows设备上,使用域管理员权限执行命令:setspn -L <SQL Server服务运行时使用的域账号名>
若返回结果中没有上述两条SPN,手动执行注册:setspn -S MSSQLSvc/servername.fqdn.com <SQL服务运行域账号>setspn -S MSSQLSvc/servername.fqdn.com:1433 <SQL服务运行域账号> - 校验本地配置
- 确认
/etc/krb5.conf中的域配置(Realm)与AD实际配置大小写完全一致,Kerberos对大小写敏感 - 执行
nslookup servername.fqdn.com确认DNS解析结果与SQL Server实际IP一致,不要使用hosts文件硬绑定IP - 你当前使用的ODBC连接字符串配置正确,无需修改,注意不要把Server字段换成短域名或IP,必须用完整FQDN
- 确认
- 生效验证
配置完成后执行kdestroy清空本地Kerberos缓存,重新执行kinit <username>获取凭证后再尝试连接即可。
补充说明
如果SQL Server服务使用本地系统账号/网络服务账号运行,服务启动时会自动尝试注册SPN;如果使用自定义域账号运行,必须手动注册SPN才能使用Kerberos可信连接。
内容的提问来源于stack exchange,提问作者Brandon Kauffman
相关产品推荐
相关产品推荐

