1. Was ist Change Data Capture (
CDC
)?Change Data Capture (
CDC
) verwendetSQL Server
Agenten , um auf Tabellen angewendete Einfüge-, Aktualisierungs- und Löschaktivitäten aufzuzeichnen. Dadurch werden Einzelheiten zu diesen Änderungen in einem benutzerfreundlichen relationalen Format bereitgestellt. Für geänderte Zeilen werden Spalteninformationen sowie Metadaten erfasst, die zum Anwenden der Änderungen auf die Zielumgebung erforderlich sind, und in einer Änderungstabelle gespeichert, die die Spaltenstruktur der verfolgten Quelltabelle widerspiegelt.
Damit Verbraucher systematisch auf Änderungsdaten zugreifen können, werden Tabellenwertfunktionen bereitgestellt. Ein typisches Beispiel für einen Datenkonsumenten, auf den diese Technologie abzielt, ist eineETL
Anwendung zum Extrahieren, Transformieren und Laden ( ).ETL
Anwendungen laden geänderte Daten schrittweise ausSQL Server
Quelltabellen in ein Data Warehouse oder einen Data Mart. Während die Darstellung von Quelltabellen in einem Data Warehouse Änderungen in den Quelltabellen widerspiegeln muss, ist die End-to-End-Technik der Aktualisierung einer Kopie der Quelle nicht anwendbar. Stattdessen benötigen Sie einen zuverlässigen Strom von Änderungsdaten mit einer spezifischen Struktur, die Verbraucher auf verschiedene Zieldatendarstellungen anwenden können.SQL Server
Change Data Capture stellt diese Technologie bereit.2. Ändern Sie den Hauptdatenfluss der Datenerfassung
Die Änderungsdatenquelle für die Änderungsdatenerfassung ist dasSQL Server
Transaktionsprotokoll . Wenn Einfügungen, Aktualisierungen und Löschvorgänge auf die verfolgte Quelltabelle angewendet werden, werden dem Protokoll Einträge hinzugefügt, die diese Änderungen beschreiben. Das Protokoll wird als Eingabequelle für den Erfassungsprozess verwendet. Es liest das Protokoll und fügt Informationen über die Änderung in der zugehörigen Änderungstabelle der nachverfolgten Tabelle hinzu. Es werden Funktionen bereitgestellt, um die Änderungen aufzuzählen, die innerhalb eines angegebenen Bereichs in der Änderungstabelle aufgetreten sind, und diesen Wert in einem gefilterten Ergebnissatz zurückzugeben. Typischerweise verwendet der Anwendungsprozess den gefilterten Ergebnissatz, um die Quelldarstellung in einer externen Umgebung zu aktualisieren.3. Notwendige Bedingungen für die Aktivierung von CDC
3.1 Verfügbar in der Enterprise Edition, Development Edition und Evaluation Edition von SQL Server 2008 und höher
Versionsprüfung: Die installierte Version von SQL Server ist die Entwicklungsversion 20193.2 Der Proxy-Dienst (Job) muss aktiviert sein
3.3 CDC benötigt zum Speichern von Protokolldateien zusätzlich zur Geschäftsbibliothek zusätzlichen Speicherplatz
3.4 Die Tabelle muss einen Primärschlüssel oder einen eindeutigen Index haben
Als Primärschlüssel wurde die Spalte derDB_Student
Tabelle der Datenbank festgelegt.tb_teacher
teaid
4. Überprüfen und öffnen Sie den
CDC
Datenbankdienst4.1 Fragen Sie
CDC
den Dienststatus der Datenbank ab
select is_cdc_enabled from sys.databases where name='DB_Student'
Wenn das Abfrageergebnis 0 ist, bedeutet dies, dass der Datenbankdienst
DB_Student
noch nicht gestartet wurdeCDC
.
CDC
4.2 Funktionen auf Datenbankebene aktivieren
ALTER AUTHORIZATION ON DATABASE::[DB_Student] TO [sa];
if exists(select 1 from sys.databases where name='DB_Student' and is_cdc_enabled=0)
begin
exec sys.sp_cdc_enable_db
end
;
select is_cdc_enabled from sys.databases where name='DB_Student';
Das Ergebnis ist 0, was anzeigt, dass der Datenbankdienst geöffnet
DB_Student
wurdeCDC
5. Fügen Sie CDC-spezifische Dateigruppen und Dateien hinzu
SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('DB_Student');
ALTER DATABASE DB_Student ADD FILEGROUP CDC1;
ALTER DATABASE DB_Student
ADD FILE
(
NAME= 'DB_Student_CDC1',
FILENAME = 'D:\DATA\DB_Student_CDC1.ndf'
)
TO FILEGROUP CDC1;
6. Die Operation öffnet die Tabellenebene
CDC
(Hinweis: In der Tabelle muss ein Primärschlüssel oder ein eindeutiger Index vorhanden sein)
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE is_tracked_by_cdc = 0;
IF EXISTS(SELECT 1 FROM sys.tables WHERE name='tb_teacher' AND is_tracked_by_cdc = 0)
BEGIN
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo',
@source_name = 'tb_teacher',
@capture_instance = NULL,
@supports_net_changes = 1,
@role_name = NULL,
@index_name = NULL,
@captured_column_list = NULL,
@filegroup_name = 'CDC1'
END;
DECLARE @tableName nvarchar(36)
DECLARE My_Cursor CURSOR
FOR (SELECT 'new_srv_workorderBase' name
union select 'tablename1'
union select 'tablename2'
union select 'tablename3'
)
OPEN My_Cursor;
FETCH NEXT FROM My_Cursor INTO @tableName;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo',
@source_name = @tableName,
@capture_instance = NULL,
@supports_net_changes = 1,
@role_name = NULL,
@index_name = NULL,
@captured_column_list = NULL,
@filegroup_name = 'CDC1'
FETCH NEXT FROM My_Cursor INTO @tableName;
END
CLOSE My_Cursor;
DEALLOCATE My_Cursor;
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE is_tracked_by_cdc = 1 ORDER BY NAME;
7. Überprüfen Sie, ob es erfolgreich geöffnet wurde
CDC
7.1 Überprüfen Sie
tb_teacher
den offenenCDC
Status der Tabelle. Das Ergebnis ist 1, was darauf hinweist, dassCDC
der Dienst erfolgreich war.
select name, is_tracked_by_cdc from sys.tables where object_id = OBJECT_ID('DB_Student')
7.2 Nach erfolgreichem Öffnen des Datenbankdienstes liegen
DB_Student
Jobs und Jobs am Agent-Job vorCDC
SQL Server
cdc.DB_Student_capture
cdc.DB_Student_cleanup
7.3 Nach erfolgreichem Öffnen des Post-Service
CDC
werden die folgenden Funktionen in der Datenbank generiert: „DB_Student
Funktion mit programmierbaren Funktionstabellenwerten“.
cdc.fn_cdc_get_all_changes_dbo_tb_teacher
LSN
: Gibt eine Zeile für jede an der Quelltabelle vorgenommene Änderung innerhalb des angegebenen Protokollsequenznummernbereichs ( ) zurück. Wenn die Quellzeile innerhalb dieses Intervalls mehrere Änderungen aufwies, wird jede Änderung im zurückgegebenen Ergebnissatz dargestellt.
cdc.fn_cdc_get_net_changes_dbo_tb_teacher
: Gibt eine netto geänderte Zeile für jede geänderte Quellzeile im angegebenenLSN
Bereich . Das heißt, wenn die Quellzeile mehrere Änderungen innerhalbLSN
des Bereichs , gibt die Funktion eine einzelne Zeile zurück, die den endgültigen Inhalt dieser Zeile widerspiegelt. : Gibt den Wert der Protokollsequenznummer ( ) in der Spalte der Systemtabelle
sys.fn_cdc_map_time_to_lsn
für die angegebene Zeit zurück. Diese Funktion kann verwendet werden, um einen Datums-/Uhrzeitbereich systematisch einem Bereich zuzuordnen, der auf den Changedata Capture-Enumerationsfunktionen basiert und um Datenänderungen innerhalb dieses Bereichs zurückzugeben .cdc.lsn_time_mapping
start_lsn
LSN
LSN
cdc.fn_cdc_get_all_changes_<capture_instance>
cdc.fn_cdc_get_net_changes_<capture_instance>
7.4 Nach erfolgreichem Start des CDC-Dienstes wird die folgende Tabelle in der Datenbank „DB_Student-table-system table“ generiert.
cdc.change_tables
: Nach dem Öffnen der Tabellecdc
werden Daten in diese Tabelle eingefügt und einige grundlegende Informationen der Tabelle aufgezeichnet
cdc.captured_columns
:cdc
Nach dem Öffnen der Tabelle werden ihre Feldinformationen in dieser Tabelle aufgezeichnet
cdc.dbo_VW_GHZDK_CT
:VW_GHZDK
Alle geänderten Daten in Die Tabelle wird aufgezeichnet, und das Feld „__$operation
“ ist „1“ bedeutet gelöscht, „2“ steht für Einfügen, „3“ ist der Wert vor der Durchführung des Aktualisierungsvorgangs und „4“ ist der Wert nach der Durchführung des Aktualisierungsvorgangs. Da die Änderung im Feld „__$start_lsn
“ aus dem Transaktionsprotokoll der Datenbank stammt, wird hier die Startsequenznummer ( ) des Transaktionsprotokolls gespeichertLSN
.8. Überprüfen Sie
CDC
die Funktionalität zur Implementierung der Datenänderungserfassung8.1 Systemtabelle abfragen
cdc.dbo_tb_teacher_CT
SELECT * FROM cdc.dbo_tb_teacher_CT
Anhand der Abfrageergebnisse können wir erkennen, dass
cdc.dbo_tb_teacher_CT
in der Systemtabelle kein Datensatz vorhanden ist. Da die Tabelle gerade erst erstellt wurde,dbo.tb_teacher
wurden an der Originaltabelle keine Ergänzungen, Löschungen oder Änderungen vorgenommen.8.2
tb_teacher
Datensätze in die Tabelle einfügen und erneut abfragencdc.dbo_tb_teacher_CT
Nachdem Sie Daten in die Tabelle eingefügt haben , fragen Sietb_teacher
die Systemtabelle ab, und Sie können sehen, dass es einen weiteren Datensatz gibt.cdc.dbo_tb_teacher_CT
In Kombination mit 7.4 können Sietb_teacher
einen Datensatz in die Datentabelle einfügen und aktualisieren.