sys.sp_cdc_cleanup_change_table (Transact-SQL)

Gilt für: SQL Server

Entfernt Zeilen aus der Änderungstabelle in der aktuellen Datenbank basierend auf dem angegebenen @low_water_mark Wert. Diese gespeicherte Prozedur wird für Benutzer bereitgestellt, die den Cleanupprozess für Änderungstabellen direkt verwalten möchten. Da diese Prozedur alle Consumer der Änderungstabellendaten betrifft, sollte sie mit Vorsicht eingesetzt werden.

Transact-SQL-Syntaxkonventionen

Syntax

sys.sp_cdc_cleanup_change_table [ @capture_instance = ] 'capture_instance'
    , [ @low_water_mark = ] low_water_mark
    , [ @threshold = ] 'delete threshold'
    , [ @fCleanupFailed = ] 'cleanup failed' OUTPUT
[ ; ]

Argumente

[ @capture_instance = ] 'capture_instance'

Der Name der Aufnahmeinstanz, die der Änderungstabelle zugeordnet ist. @capture_instance ist "sysname" ohne Standard und kann nicht seinNULL.

capture_instance muss eine Aufnahmeinstanz benennen, die in der aktuellen Datenbank vorhanden ist.

[ @low_water_mark = ] low_water_mark

Eine Logsequenznummer (Log Sequence Number, LSN), die als neues Niedriges Wasserzeichen für die @capture_instance verwendet wird. @low_water_mark ist binary(10) ohne Standard.

Wenn der Wert nicht NULLangegeben ist, muss er als start_lsn Wert eines aktuellen Eintrags in der cdc.lsn_time_mapping Tabelle angezeigt werden. Wenn andere Einträge cdc.lsn_time_mapping den gleichen Commit-Zeitraum aufweisen wie der durch das neue Wasserzeichen identifizierte Eintrag, wird der kleinste LSN, der dieser Gruppe von Einträgen zugeordnet ist, als Niedrigwasserzeichen ausgewählt.

Wenn der Wert explizit auf festgelegt NULList, wird die aktuelle @low_water_mark für die @capture_instance verwendet, um die obere Grenze für den Bereinigungsvorgang zu definieren.

Hinweis

@low_water_mark ist der LSN-Schwellenwert. Alle Transaktionen mit einem LSN-Wert, der niedriger als der angegebene Wert ist, werden verarbeitet, und der betreffende Wert wird ausgeschlossen.

[ @threshold = ] 'Löschschwellenwert'

Die maximale Anzahl von Löscheinträgen, die mithilfe einer einzelnen Anweisung zum Bereinigen gelöscht werden können. @threshold ist großint, mit einem Standardwert von 5000.

[ @fCleanupFailed = ] Ausgabe 'Bereinigung fehlgeschlagen'

Ein OUTPUT-Parameter, der angibt, ob der Bereinigungsvorgang fehlgeschlagen ist oder nicht. @fCleanupFailed ist bit, mit einem Standardwert von 0.

Resultset

Keine, es sei denn, der optionale @fCleanupFailed OUTPUT-Parameter wird verwendet.

Rückgabecodewerte

0 (erfolgreich) oder 1 Fehler.

Beispiele

-- Declaring a variable and Setting to zero first
SELECT @cleanup_failed_bit = 0;

-- Execute cleanup and obtain output bit
EXEC @retcode = sys.sp_cdc_cleanup_change_table
    @capture_instance = '<CaptureInstance>',
    @low_water_mark = @LSN, --== LSN to be used for new low watermark for capture instance
    @threshold = 1,
    @fCleanupFailed = @cleanup_failed_bit OUTPUT;

-- Leverage @cleanup_failed_bit output to check the status.
SELECT IIF(@cleanup_failed_bit > 0, 'CLEANUP FAILURE', 'CLEANUP SUCCESS');
CLEANUP SUCCESS

Hinweise

sys.sp_cdc_cleanup_change_table führt die folgenden Vorgänge aus:

  1. Wenn der parameter @low_water_mark ist NULL, bleibt der start_lsn Wert für die @capture_instance unverändert. Wenn das aktuelle Wasserzeichen jedoch größer als der unter verwendung des @low_water_mark Parameters für die Prozedur angegebene niedrige Wasserzeichenwert ist, wird der Fehler 22957 ausgelöst. Die Fehlermeldung für Fehler 22957 lautet LSN %s, specified as the new low endpoint for the change table associated with capture instance '%s', is not within the Change Data Capture timeline [%s, %s].

    Hinweis

    Bei der neuen Untergrenzenmarkierung muss es sich nicht zwingend um die im Aufruf der gespeicherten Prozedur angegebene Untergrenzenmarkierung handeln. Wenn andere Einträge in der cdc.lsn_time_mapping Tabelle die gleiche Commit-Zeit aufweisen, wird die kleinste start_lsn in der Gruppe der Einträge dargestellt als angepasstes Wasserzeichen ausgewählt. Wenn der parameter @low_water_mark oder das aktuelle niedrige Wasserzeichen größer als NULL das neue Wasserzeichen ist, bleibt der start_lsn Wert für die Aufnahmeinstanz unverändert.

  2. Ändern Sie Tabelleneinträge mit __$start_lsn Werten, die kleiner als das niedrige Wasserzeichen sind, und werden dann gelöscht. Der Schwellenwert zum Löschen wird verwendet, um die Anzahl gelöschter Zeilen in einer einzigen Transaktion zu begrenzen. Es wird ein Fehler beim erfolgreichen Löschen von Einträgen gemeldet, wirkt sich jedoch nicht auf änderungen an der Aufnahmeinstanz mit geringem Wasserzeichen aus, die basierend auf dem Anruf vorgenommen wurden.

  3. Wenn die sys.sp_cdc_cleanup_change_table gespeicherte Prozedur nach dem Aktualisieren der Erfassungsinstanzstart_lsn, aber ohne Löschen der Änderungstabellendaten ausgeht, wird der Datenaufbewahrungswert mithilfe der gespeicherten Prozedur sys.sp_cdc_change_job vor der nächsten Ausführung der gespeicherten Prozedur sys.sp_cdc_cleanup_change_table nicht für den angegebenen Aufbewahrungszeitraum aufbewahrt. Der start_lsn Wert in cdc.change_tables sollte als neues Wasserzeichen behandelt werden. Die sys.sp_cdc_cleanup_change_table gespeicherte Prozedur legt den Wert nicht so fest, dass er start_lsn mit dem neu angegebenen Datenaufbewahrungszeitraum übereinstimmt. Das Verfahren führt immer eine Bereinigung basierend auf dem niedrigen Wasserzeichen durch. Wenn Sie einen Wert für den @low_water_mark-Parameter angeben, der start_lsn dem Wert in cdc.change_tables entspricht oder höher ist, wird das Generieren von Fehler 22957 vermieden.

  4. Wenn Sie sys.sp_cdc_cleanup_change_table den Bereinigungstabellenvorgang verwalten und ein Deadlock zwischen dem CDC-Scan und der CDC-Bereinigung auftritt, wenn sys.sp_cdc_cleanup_change_table sie aufgerufen wird, wird Fehler 22852 mit Schweregrad 10 (Informationsmeldung) protokolliert. Die Meldung für Fehler 22852 lautet wie folgt:

    Could not delete change table entries made obsolete by a change in one or more low water marks for capture instances of database <DatabaseName>. The failure occurred when executing the command <CommandName>. The error returned was <ErrorInfo>. Use the action and error to determine the cause of the failure and resubmit the request.
    

Verwenden Sie sys.sp_cdc_cleanup_change_table unter folgenden Umständen:

  • Der Auftrag des Cleanup-Agents meldet Löschfehler.

    Ein Administrator kann diese gespeicherte Prozedur explizit ausführen, um einen fehlgeschlagenen Vorgang zu wiederholen. Führen Sie die Bereinigung für eine bestimmte Aufnahmeinstanz aus, und sys.sp_cdc_cleanup_change_tablegeben Sie NULL den parameter @low_water_mark an.

  • Die einfache aufbewahrungsbasierte Richtlinie, die vom Bereinigungs-Agent-Auftrag verwendet wird, ist nicht ausreichend.

    Da diese gespeicherte Prozedur eine Bereinigung für eine einzelne Aufnahmeinstanz durchführt, kann sie verwendet werden, um eine benutzerdefinierte Bereinigungsstrategie zu erstellen, mit der die Regeln für die Bereinigung auf die einzelne Aufnahmeinstanz zugeschnitten werden.

Berechtigungen

Hierfür ist die Mitgliedschaft in der festen Datenbankrolle db_owner erforderlich.