SSIS - 旧版本OLEDB不支持Always On Availability Group
目录
问题
数仓项目中有上游将SQL Server升级为Always On高可用集群,导致我们使用OLEDB连接方式的SSIS Package在运行时出现了不稳定的情况,偶尔会连接失败。典型报错信息为Unable to complete login process due to delay in opening server connection。
查询相关资料后发现旧版本OLEDB即使在连接属性中加入了MultiSubnetFailover=True也很可能不起作用,官方文档已指出,旧版的OLEDB:
- SQL Native Client 11.0 OLEDB ( Provider: SQLNCLI 或 SQLNCLI11 )
- Microsoft OLE DB Provider for SQL Server ( Provider: SQLOLEDB )
已不推荐使用,2018新推出的Microsoft OLE DB Driver for SQL Server ( Provider: MSOLEDBSQL ) 开始支持最新功能。
现实情况是大量项目均在使用旧版本,且OLEDB连接由于在SSIS中功能更多而被大量使用。
可选方案
- 新建SSIS包尽量用ADO.NET,这是微软推荐的连接方式
- 若工作量和时间允许,将旧包也升级为ADO.NET连接,并作其它相关修改
- 若追求最小工作量,可直接更新SSIS的OLEDB的连接字符串,将Provider从SQLNCLI11、sqloledb改为MSOLEDBSQL,并加上MultiSubnetFailover=True,最好再加上Connect Timeout=30
- 过渡期间可仅在旧OLEDB的连接字符串上加上Connect Timeout=30,或暂时直接连接物理服务器名(Primary Replica)
其它说明
- 若SSIS用旧的包部署模式,开启了数据库方式的包配置选项,Connect Manager只能用OLEDB,这种就只能用新的OLEDB Driver
- 增加
Connect Timeout会进一步提升连接的成功率,对老的OLEDB版本也有效 - 仔细阅读说明,不同的Driver或程序在MultiSubnetFailover的赋值上存在不同,有的是True,有的是Yes,如果Yes不行就换成True试试
- 使用ODBC连接故障转移集群时,需要加上
MultiSubnetFailover=Yes选项,相关文档 - 使用ADO.Net连接故障转移集群时,不加
MultiSubnetFailover=True也比旧版本的OLEDB连接成功率高,但加上会有额外的性能提升 - 若故障转移集群为SQL Server 2012版本,以上两种方式都需加上
MultiSubnetFailover=Yes - sqlcmd基于ODBC连接,若要支持failover,需要加上-M选项
- bcp也是基于ODBC连接,若要支持failover,需要在ServerName上加上
;MultiSubnetFailover=Yes,比如:
bcp testdb.dbo.Table_A out C:\Test\Table_A.csv -T -c -t, -S server_name;multisubnetfailover=Yes
备注:以上均为个人理解,技术也一直在变化(比如OLEDB,一度被微软deprecated,2018年又undeprecated),所以文章仅供参考,若有错漏请指出。
参考链接
- https://learn.microsoft.com/en-us/sql/connect/oledb/features/oledb-driver-for-sql-server-support-for-high-availability-disaster-recovery?view=sql-server-ver16
- https://learn.microsoft.com/en-us/sql/connect/oledb/release-notes-for-oledb-driver-for-sql-server?view=sql-server-ver16#features-added-in-1802
- https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/sqlclient-support-for-high-availability-disaster-recovery
- https://www.connectionstrings.com/ole-db-driver-for-sql-server/