我正在开发一个 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 代理的原因。因此,整个过程必须是自动化的,并且在包内具有所有必要的值——尤其是副本状态(主要和次要)的确定,以便不需要手动干预。
我正在使用sp_Blitz,并希望使用它来执行对我所有 SQL Server 的检查并将结果写入单个表。
我是否需要在中央实例上创建链接服务器以连接到其他实例,或者是否有其他方法可以将服务器名称输入到sp_Blitz存储过程中?
我sp_BlitzCache version 4.1 (20161210)在一个2008R2 instance (10.5.4042).
如果我在没有 的情况下执行 sp @OutputDatabaseName, @OutputSchemaName, and @OutputTableName,它工作正常。但是,当我设置这些值时,它会在整个过程中运行到最后,并出现错误:
“INSERT 语句的选择列表包含比插入列表更多的项目。SELECT 值的数量必须与 INSERT 列的数量相匹配。”
我正在运行的具体语句是:
EXEC [dbo].[sp_BlitzCache] @OutputDatabaseName = 'Maintenance_Stats'
,@OutputSchemaName = 'dbo'
,@OutputTableName = 'BlitzCacheResults'
Run Code Online (Sandbox Code Playgroud)
数据库、模式和表已经存在,但其中没有记录。所以......在 sp 代码的某个地方,它创建了表,但试图将太多的值填充到表中。
我正在使用它来尝试解决应用程序 (SCCM) 挂起问题,并按照建议创建了一个 SQL 代理作业,帮助台在遇到问题时可以执行该作业(它是间歇性的),但我尝试自己执行它,并且它因上述错误而失败。