如何将CDC表移动到新文件组?

时间:2012-04-02 19:20:51

标签: sql-server sql-server-2008 tsql cdc

我是SQL Server的新手,CDC的复制和概念。我为CDC做了很少的入门教程。我的问题是 - 因为CDC正在生成如此多的数据并占用太多空间(内存),我们需要提高它的效率。决定是将CDC表移动到新的文件组。以下是它的选项(并且都有可能破坏CDC的危险):

i)在每个表上重新创建主键

ii)更改表创建语句

iii)将整个CDC架构移动到新的FileGroup

请建议/指导如何解决这个问题?

Regards,
CD

1 个答案:

答案 0 :(得分:4)

enter code here好的,所以没有人回答我的问题。我等了一天,甚至没有发表评论。无论如何,我自己努力寻找答案,所以在这里,希望至少得到一些投票! :P

2个逻辑选项:

1)禁用CDC,然后启用CDC,同时更改文件组 - 现在这似乎合乎逻辑,但您丢失了所有以前的CDC数据,并可能丢失CDC Meta Date。这可能对某些人有用,所以请在下面找到:

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*/