Airflow2.3.0使用MsSqlHook连接MSSQL报Adaptive Server不可用错误
报错根因
- Airflow 2.3.0 版本自带的
MsSqlHook默认连接驱动为pymssql,未显式指定驱动时不会自动识别你配置的mssql+pyodbc格式URI中的ODBC连接参数。从报错堆栈全是pymssql模块调用记录可以确认:Hook完全没有走你配置的ODBC Driver 18连接链路,而是调用pymssql发起连接。 - 你存放在AWS SecretManager中的连接串把服务器地址、驱动参数全部编码到了
odbc_connect字段中,走pymssql解析逻辑时这些参数会被全部忽略,相当于拿着空的服务端地址发起连接,最终触发Adaptive Server is unavailable or does not exist (:None)报错。 - 报错信息里服务端地址显示为
:None,正好对应参数解析失败、没有拿到目标Server地址的表现。
可行解决方法
- 前置依赖检查:先在所有运行Airflow任务的节点(调度器、worker、triggerer)上完成两个准备:
- 安装系统级依赖:ODBC Driver 18 for SQL Server
- 安装Python依赖:
pip install pyodbc apache-airflow-providers-microsoft-mssql>=3.0.0
- 方案1:修改连接配置,适配Hook的解析逻辑
不要直接把整段urlencode的pyodbc连接串作为URI存入SecretManager,按照Airflow MSSQL连接的标准字段拆分配置:- 连接类型选择
Microsoft SQL Server - Host字段填写你的MSSQL服务端地址
- Port字段默认填1433,有自定义端口按实际值填
- Login/Password字段填对应数据库账号密码
- Extra字段填写JSON格式的扩展参数:
{ "driver": "ODBC Driver 18 for SQL Server", "TrustServerCertificate": "yes", "ApplicationIntent": "ReadOnly" }
- 连接类型选择
- 方案2:代码层面强制指定pyodbc驱动,跳过默认的pymssql逻辑
修改自定义代码中获取Hook的方法,显式声明使用mssql+pyodbc的SQLAlchemy连接模式:
该方案不需要调整现有SecretManager里的URI格式,只要保证连接配置里的URI能被SQLAlchemy正确识别即可。def get_db_hook(self): return MsSqlHook( mssql_conn_id=self.mssql_conn_id, sqlalchemy_scheme="mssql+pyodbc" ) - 方案3:替换驱动为pymssql(不推荐生产使用)
如果你不想用ODBC驱动,可以把现有连接串改成pymssql支持的标准格式:mssql+pymssql://<用户名>:<密码>@<服务器地址>:<端口>/<数据库名>,去掉所有odbc_connect相关的编码参数。但pymssql对高版本SQL Server的TLS校验、只读路由、AlwaysOn集群的支持存在已知缺陷,稳定性不足。
排查提示:配置完成后先在Airflow UI的连接管理页做连通性测试,同时确认Airflow节点到MSSQL服务端1433端口的网络策略(安全组、防火墙、路由)放通,避免网络层面拦截导致连接失败。
内容的提问来源于stack exchange,提问作者Kar
相关产品推荐
相关产品推荐

