You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS使用可信连接连接MS SQL Server时票据过期错误的解决方法

解决Kerberos票据过期(Ticket expired)连接SQL Server的问题

这个错误核心就是Kerberos认证的票据过期失效了,我整理了几个实用的排查和解决步骤,你可以一步步试:

1. 手动刷新Kerberos票据

先试试最直接的方法——手动刷新票据,Windows环境下打开CMD或PowerShell执行:

# 清空现有过期票据
klist purge
# 获取新的Kerberos票据(替换成你的域和用户名)
klist get YOUR_DOMAIN\YOUR_USERNAME

如果是Linux/macOS环境,命令换成:

kdestroy
kinit YOUR_USERNAME@YOUR_DOMAIN

执行完再重新跑你的Python脚本,大概率能临时解决问题。

2. 检查并清理本地票据缓存

有时候过期的票据会残留在本地缓存里,导致新票据无法正常生效:

  • 用klist(Windows)或klist -l(Linux/macOS)查看当前缓存的票据,确认有没有过期的条目
  • 用klist purge彻底清空缓存,再重新获取票据后尝试连接

3. 调整Kerberos票据生命周期(需域管理员配合)

如果频繁出现这个问题,可能是默认的票据有效期太短了。可以联系域管理员检查:

  • 域控制器上的MaxTicketAge(最大票据有效期)设置,建议调整到8小时以上
  • 同时确认MaxRenewAge(票据续订有效期),确保允许自动续订过期的票据

4. 在Python代码中加入自动刷新逻辑

如果你的脚本需要长时间运行,比如定时任务或持续连接,可以在代码里加定期刷新票据的逻辑:

import subprocess
import sqlalchemy as sa

def refresh_kerberos_ticket():
    # 清空旧票据
    subprocess.run(["klist", "purge"], check=True, capture_output=True)
    # 获取新票据(替换为你的域账号)
    subprocess.run(["klist", "get", "YOUR_DOMAIN\\YOUR_USERNAME"], check=True, capture_output=True)

# 每次建立连接前先刷新票据
refresh_kerberos_ticket()
engine = sa.create_engine(
    "mssql+pyodbc://@YOUR_SERVER/YOUR_DB?driver=ODBC+Driver+13+for+SQL+Server&Trusted_Connection=yes"
)

5. 升级ODBC驱动版本

你当前用的是ODBC Driver 13,建议升级到最新的ODBC Driver 17或18,新版本对Kerberos认证的兼容性更好,可能修复了票据过期相关的已知bug。

6. 确认SQL Server的SPN配置

如果服务主体名称(SPN)配置错误,也会导致票据无法正常续订。让域管理员执行以下命令检查:

setspn -L YOUR_SQL_SERVER_NAME

确保输出里存在MSSQLSvc/YOUR_SQL_SERVER_FQDN:PORT和MSSQLSvc/YOUR_SQL_SERVER_NAME:PORT格式的SPN条目,没有的话需要手动注册。


内容的提问来源于stack exchange,提问作者dstandish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:24