Kah*_*ahn 6 sql-server availability-groups change-data-capture
所以我最近才在始终在线的 AG 上启用 CDC。虽然许多消息来源声称在alwaysON AG上启用CDC就像在任何独立服务器上一样简单,但事实证明事实并非如此。正如 MS所说:
您应该在故障转移之前在所有可能的故障转移目标上创建[CDC 捕获和清理]作业,并将它们标记为禁用,直到主机上的可用性副本成为新的主副本。当本地数据库成为辅助数据库时,还应禁用在旧主数据库上运行的 CDC 作业。若要禁用和启用作业,请使用 sp_update_job (Transact-SQL) 的 @enabled 选项。有关创建 CDC 作业的详细信息,请参阅 sys.sp_cdc_add_job (Transact-SQL)。
事实证明,在我们在主副本上启用 CDC 后,辅助副本上绝对没有发生任何事情。因此,根据 MS 的建议,我进行了手动故障转移,并在那里创建了作业,然后又进行了一次故障转移回原始主数据库。
显然,正如上面引用中所暗示的那样,尽管 CDC 应该与alwaysOn AG 完全兼容,但它完全无法确定它当前是在主副本还是辅助副本上运行。
那么,背景介绍完了,让我们来回答我的问题:如何保证 CDC 作业始终在当前主副本上启用?并始终在辅助设备上禁用(以免产生错误)?
显然,alwaysOn AG 的一个重要点是,无论出于何种原因,您都不需要在主数据库因任何原因发生故障时手动到达那里,因为辅助数据库将弥补空闲并保持系统在线,我认为然后预计它会创建每个副本上的一个作业,不断轮询它们的状态并改变 CDC 作业的状态?
如果这是正确的,您对如何进行此操作有什么具体建议、具体脚本或指南等吗?因为显然这在全球范围内是一个相当普遍的困境,我必须在每个副本上手动创建一个新的 TSQL 作业,只是为了使用alwaysOn AG 执行 CDC 的基本基本功能,这似乎很奇怪。
这似乎不太可能,这就是我问的原因。或者我误解了什么?谢谢!
更常见和接受的方式是,一旦作业到达 AG 中的服务器,您就开始编辑它:
这已经在其他一些 SE 问题中进行了探讨(它们与 CDC 没有具体关系,这就是您没有找到它们的原因):
第二种方法是使用类似的方法创建一个看门狗作业,该方法将打开和关闭作业。当您处理 SQL Server 内部作业时,这可能更容易接受。但这取决于你。
我对上面硬编码 AG 名称等的示例不太满意。我更喜欢让作业步骤在有问题的数据库中运行,这样,如果它甚至有一个组并且是其中的一部分,它就可以自行解决(因为即使您暂时将它们从数据库中删除,您的作业也应该继续运行)股份公司)。
Set Nocount On
If Exists (
-- Database in an AG
Select Top 1 0
From sys.availability_databases_cluster adc
Join sys.availability_groups ag
On adc.group_id = ag.group_id
Join sys.dm_hadr_availability_group_states dhags
On ag.group_id = dhags.group_id
Where adc.database_name = Db_Name()
)
And Not Exists (
-- Database in an AG which is Primary on this instance
Select Top 1 0
From sys.availability_databases_cluster adc
Join sys.availability_groups ag
On adc.group_id = ag.group_id
Join sys.dm_hadr_availability_group_states dhags
On ag.group_id = dhags.group_id
Where adc.database_name = Db_Name()
And Upper(dhags.primary_replica) = Upper(@@Servername)
)
Begin
Raiserror('This is not the primary replica.', 16, 1) With Nowait
Return
End
-- Check if the database isn't accessible
If Not Exists (
Select Top 1 0
From sys.databases
Where databases.name = Db_Name()
And state_desc = 'ONLINE'
)
Begin
Raiserror('The database doesn''t exist or isn''t ONLINE on this node.', 16, 1) With Nowait
Return
End
Run Code Online (Sandbox Code Playgroud)
这种事情对于 SSIS 作业和随着时间的推移弹出的其他位也很有用。
更进一步,您可能想要创建一个 PowerShell 脚本,该脚本将不时地检查并检查您的服务器是否有 CDC 作业且没有看门狗的 AG,以便您会收到创建看门狗的通知。
归档时间: |
|
查看次数: |
9332 次 |
最近记录: |