我是 SQL Server、复制和 CDC 概念的新手。我为 CDC 做了一些入门教程。我的问题是 - 因为 CDC 正在生成如此多的数据并占用如此多的空间(内存),我们需要提高它的效率。决定是将 CDC 表移动到新文件组。以下是它的选项(并且都有可能破坏 CDC 的危险):
i) 在每个表上重新创建一个主键
ii) 更改表创建语句
iii) 将整个 CDC 模式移动到新的文件组
请建议/指导如何去做?
Regards,
CD
我是 SQL Server、复制和 CDC 概念的新手。我为 CDC 做了一些入门教程。我的问题是 - 因为 CDC 正在生成如此多的数据并占用如此多的空间(内存),我们需要提高它的效率。决定是将 CDC 表移动到新文件组。以下是它的选项(并且都有可能破坏 CDC 的危险):
i) 在每个表上重新创建一个主键
ii) 更改表创建语句
iii) 将整个 CDC 模式移动到新的文件组
请建议/指导如何去做?
Regards,
CD
enter code here
好的,所以没有人回答我的问题..我等了一天,甚至没有评论。无论如何,我自己努力寻找答案,所以就在这里,希望至少能得到一些投票!:P
2个逻辑选项:
1) 禁用 CDC,然后启用 CDC,同时更改文件组 - 现在这看起来合乎逻辑,但是您会丢失所有以前的 CDC 数据,并且可能会丢失 CDC 元数据。仍然这可能对某些人有用,所以请在下面找到:
Declare @RowNo Int, @RowCount Int, @Capture_Instance Varchar(200), @strSQL NVarchar(1000)
Set @RowCount = 0
Set @RowNo = 1
Set @Capture_Instance = ''
Set @strSQL = ''
Declare @myTable Table (Capture_instance Varchar(200), RowNo Int)
Insert Into @myTable
Select capture_instance, ROW_NUMBER() Over(Order By Source_Object_Id) As RN From cdc.change_tables
Set @RowCount = @@ROWCOUNT
While @RowNo <= @RowCount
Begin
Select @Capture_Instance = Capture_instance From @myTable Where RowNo = @RowNo
Set @strSQL = 'sys.sp_cdc_disable_table @source_schema = N''' + Left(@Capture_Instance, CharIndex('_', @Capture_Instance) - 1) + ''',
@source_name = N''' + SubString(@Capture_Instance, CharIndex('_', @Capture_Instance) + 1, Len(@Capture_Instance)) + ''',
@capture_instance = N''All'''
Exec sp_ExecuteSQL @strSQL /*Diabling the sp_cdc*/
Set @strSQL = 'sys.sp_cdc_enable_table @source_schema = N''' + Left(@Capture_Instance, CharIndex('_', @Capture_Instance) - 1) + '''
,@source_name = N''' + SubString(@Capture_Instance, CharIndex('_', @Capture_Instance) + 1, Len(@Capture_Instance)) + '''
,@role_name = N''' + 'cdc_Admin' + '''
,@fileGroup_Name = N''' + 'CDCFileGroup' + ''';'
Exec sp_ExecuteSQL @strSQL /*Enabling the sp_cdc, with a new CDCFileGroup(this filegroup would have been created before running this script)*/
Set @RowNo += 1
End
2)这是正确的解决方案!创建唯一聚集索引,同时更改文件组 - 这会保留以前的 CDC 数据以及其他所有内容。您只需要确保文件组已经创建,并且它包含您已设置大小的文件。(有关更多信息,请在评论中提问)。脚本:
/*CREATING CLUSTERED INDEX, AND DROPPING CLUSTERED INDEX, TOGETHER*/
CREATE UNIQUE CLUSTERED INDEX dbo_YourTableName_CT_clustered_idx
ON cdc.dbo_YourTableName_CT ( [__$start_lsn] ASC,
[__$seqval] ASC,
[__$operation] ASC)
WITH (DROP_EXISTING = ON)
ON CDCFileGroup /*Your File Group Name*/