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 darf nicht NULL sein.

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

[ @low_water_mark = ] low_water_mark

Eine Protokollsequenznummer (Log Sequence Number, LSN), die als neues Wasserzeichen für die @capture Instanz verwendet werden soll. @low_water_mark ist binary(10) ohne Standard.

Wenn der Wert ungleich NULL 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 NULL festgelegt ist, wird das aktuelle @low Wasserzeichen für die @capture Instanz verwendet, um die obere Grenze für den vorgang sauber up zu definieren.

[ @threshold = ] 'Löschschwellenwert'

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

[ @fCleanupFailed = ] 'ausgabe sauber up fehlgeschlagen

Ein OUTPUT-Parameter, der angibt, ob der sauber upvorgang 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 (Erfolg) 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 NULL ist, bleibt der start_lsn Wert für die @capture Instanz 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', isn't 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 als angepasstes Wasserzeichen ausgewählt. Wenn der parameter @low_water_mark NULL ist oder das aktuelle Wasserzeichen größer als 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 start_lsn für die Erfassungsinstanz, 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 Niedrigwasserzeichen behandelt werden. Die sys.sp_cdc_cleanup_change_table gespeicherte Prozedur legt den start_lsn Wert nicht so fest, dass er mit dem neu angegebenen Datenaufbewahrungszeitraum übereinstimmt. Die Prozedur führt immer sauber up basierend auf dem niedrigen Wasserzeichen aus. Wenn Sie einen Wert für den @low_water_mark-Parameter angeben, der start_lsndem 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 prozess der sauber uptabelle verwalten und ein Deadlock zwischen dem CDC-Scan und dem CDC-sauber up auftritt, wenn sys.sp_cdc_cleanup_change_table sie aufgerufen wird, wird Fehler 22852 mit Schweregrad 10 protokolliert (Informationsmeldung). 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. Wenn Sie sauber up für eine bestimmte Aufnahmeinstanz wiederholen möchten, führen Sie aussys.sp_cdc_cleanup_change_table, und geben Sie NULL für den @low_water_mark-Parameter an.

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

    Da diese gespeicherte Prozedur sauber up für eine einzelne Erfassungsinstanz ausführt, kann sie verwendet werden, um eine benutzerdefinierte sauber up-Strategie zu erstellen, die die Regeln für sauber up auf die einzelne Erfassungsinstanz zugeschnitten.

Berechtigungen

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