2012-04-02 4 views
1

Ich bin neu in SQL Server, Replikation und Konzept von CDC. Ich habe einige Primer Tutorials für CDC gemacht. Mein Problem ist wie - Da CDC so viele Daten generiert und so viel Speicherplatz (Speicher) beansprucht, müssen wir es effizienter machen. Die Entscheidung ist, CDC-Tabellen in eine neue Dateigruppe zu verschieben. Und Folgenden sind die Optionen für sie (und alle haben eine Gefahr potenziell die CDC zu brechen):Wie CDC-Tabellen in eine neue Dateigruppe verschoben werden?

i) neu erstellen einen Primärschlüssel auf jedem Tisch

ii) Alter Tabelle erstellen Anweisung

iii) Verschieben Sie das gesamte CDC-Schema in eine neue FileGroup

Bitte schlagen Sie vor/Leitfaden, wie Sie vorgehen?

Regards, 
CD 

Antwort

4

enter code here Ok, so antwortete niemand meine question..I für einen Tag gewartet, und nicht einmal ein Kommentar. Wie auch immer, ich arbeitete an der Antwort selbst, also hier ist es, hoffentlich wird zumindest einige Stimmen dafür bekommen! : P

2 Logik Optionen:

1) Deaktivieren Sie die CDC und dann die CDC ermöglichen, während die Dateigruppe zu ändern - Nun scheint dies logisch, aber Sie verlieren alle vorherigen CDC Daten und könnte CDC verlieren Meta-Datum Dennoch könnte dies für einige nützlich sein, so unten finden:

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) Dies ist die richtige Lösung! Erstellen Sie einen eindeutigen gruppierten Index, während Sie die Dateigruppe ändern. Dadurch bleiben die vorherigen CDC-Daten und alles andere erhalten. Sie müssen nur sicherstellen, dass die Dateigruppe bereits erstellt wurde und Dateien enthält, deren Größe Sie festgelegt haben. (für weitere Informationen, fragen Sie im Kommentar). Skript dafür:

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