SQL*_*ker 7 sql-server ssis availability-groups
我正在开发一个 SSIS 包,它将从生产备份中刷新开发数据库。该程序包已经存在多年,但我们正在开发实例上部署可用性组,因此必须更改任务以同时使用主副本和辅助副本。背景:所有实例都是 SQL Server 2014 SP2。一个生产实例 (PD1)、两个开发实例 (DV3 和 DV7) 和一个实用程序实例 (DV1),其中 SSIS 包部署到 SSISDB 以及 SQL 代理作业运行的位置。在 SSIS 包中,在获取完整备份并将其放在生产网络共享上后,下一组任务(在单独的 SSIS 包中)需要确定哪个节点承载主副本。我正在按照此处列出的步骤操作去做这项工作,如果它是硬编码的,一切都很好(如果/当发生故障转移时,这当然不起作用)。我能够考虑解决这个问题的唯一方法是,在运行时,评估哪个实例是主要的,然后继续执行任务(顺便说一下,这些都是“执行 SQL 任务”对象——需要它们自己的连接定义)。我已经看到了一些关于如何在 ConnectionStrings 和变量中使用表达式的示例,但无法弄清楚如何在 SQL Server 中设置从以下查询返回的值以返回正确的实例来设置包中的连接字符串。
select cs.replica_server_name
from sys.dm_hadr_availability_replica_states rs
join sys.dm_hadr_availability_replica_cluster_states cs
on rs.replica_id = cs.replica_id
join sys.dm_hadr_name_id_map n
on rs.group_id = n.ag_id
where rs.role = 2
and n.ag_name = 'DVAG001'
Run Code Online (Sandbox Code Playgroud)
理想情况下,会有两个这样的连接管理器,一个用于主连接管理器,一个用于辅助连接管理器,然后我可以在“执行 SQL 任务”对象中使用它们。那么一切都会完美运行。可能还有其他方法可以做到这一点,但我在 SSIS 或 TSQL 之外的开发方面经验不足。
更新:上述过程每天都在进行……这就是我使用 SSIS 包和 SQL 代理的原因。因此,整个过程必须是自动化的,并且在包内具有所有必要的值——尤其是副本状态(主要和次要)的确定,以便不需要手动干预。
假设您有一个只有一个辅助副本的可用性组(您可以轻松扩展此示例以获得更多副本)
1. 连接
您将需要 3 个连接:
2. 变量
创建 2 个数据类型为 String 的变量
3.查询
要使用执行 SQL 任务将查询结果集映射到变量,您的查询只需返回一行。您会将每一列映射到您希望的变量。知道了这一点,我已将您的查询更改为以下内容:
WITH CTE_AGStatus as (
select cs.replica_server_name, rs.role
from sys.dm_hadr_availability_replica_states rs
join sys.dm_hadr_availability_replica_cluster_states cs
on rs.replica_id = cs.replica_id
join sys.dm_hadr_name_id_map n
on rs.group_id = n.ag_id
where n.ag_name = 'DVAG001'
)
select ServernamePrimary = MAX(case when role = 1 then replica_server_name end)
, ServernameSecondary = MAX(case when role = 2 then replica_server_name end)
from CTE_AGStatus
Run Code Online (Sandbox Code Playgroud)
(随意更改,只需记住只返回一行)
4. 将结果集映射到变量
在执行 SQL 任务编辑器上,粘贴上面的查询,设置 OLEDB 连接“AG 侦听器”并将结果集更改为“单行”

5. 更改连接字符串
单击“主要”连接管理器并转到“属性”选项卡,然后单击“表达式”,选择属性“服务器名称”并在表达式上添加变量。
对“辅助”连接管理器重复该过程
6.检查流程
要进行验证,您可以添加其他步骤并使用断点来检查变量的运行方式。接下来的步骤由您决定。现在您有一个连接指向您的 AG 的每台服务器。

| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |