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),所以文章仅供参考,若有错漏请指出。

参考链接