Question

I'm new to SQL Server, replication and concept of CDC. I did few primer tutorials for CDC. My problem is like - Because CDC is generating so much data and taking up so much space(memory), we need to make it more efficient. The decision is to move CDC tables to a new filegroup. And following are the options for it (and all have a danger of potentially breaking the CDC):

i) Re-create a Primary Key on each table

ii) Alter table create statement

iii) Move the whole CDC schema to a new FileGroup

Please suggest/guide how to go about this?

Regards,
CD
Was it helpful?

Solution

enter code hereOk, so no one answered my question..I waited for a day, and not even a comment. Anyways, I worked towards the answer myself, so here it is, hopefully will atleast get some votes for this! :P

2 Logical Options:

1) Disable the CDC, and then enable the CDC, while changing the File Group - Now this seems logical, but you lose all the previous CDC Data, and might lose CDC Meta Date. Still this might be useful for some, so find below:

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) This is the correct solution! Create Unique Clustered Index, while changing the File Group - this preserves the previous CDC Data, and everything else. You just need to make sure that the File Group is already created, and it contains files, whose size you have set. (for more info., ask in comment). Script for this:

/*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*/
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top