Warum ist meine AWS-DMS-CDC-Aufgabe, bei der Oracle als Quelle verwendet wurde, mit der Meldung „Sequenz existiert nicht“ fehlgeschlagen?

Letzte Aktualisierung: 08.09.2022

Ich möchte Daten aus meiner lokalen Datenbank oder Amazon-Relational-Database-Service-for-Oracle-Datenbank (Amazon RDS) mithilfe von AWS Database Migration Service (AWS DMS) migrieren. Die AWS-DMS-Change-Data-Capture-Aufgabe (CDC) wird erwartungsgemäß ausgeführt, schlägt dann aber mit einem Fehler ähnlich dem folgenden fehl:

„Maximaler Wiederholungszähler von Oracle CDC überschritten“ (Archivelog-Sequenz existiert nicht)

Wie kann ich diesen Fehler beheben?

Kurzbeschreibung

Wenn Sie eine Oracle-Datenbank als Quelle für Ihre Migrationsaufgabe verwenden, ruft AWS DMS die Daten während der Volllastphase aus der Tabelle ab. Während der CDC-Phase liest AWS DMS aus den archivierten Redo-Protokollen. Anschließend erfasst AWS DMS die Redo-Protokolle aus der Oracle-Quelldatenbank und wendet nur die festgeschriebenen Änderungen auf die Zieldatenbank an.

Möglicherweise wird ein Sequenzprotokollfehler angezeigt, der wie folgt aussieht:

„03980512:2022-05-23T 12:33:11 [SOURCE_CAPTURE] E: Archiviertes Redo-Protokoll mit der Sequenz 232488 existiert nicht, Thread 1 [1022318] (oradcdc_thread.c:624“

Gehen Sie folgendermaßen vor, um diesen Fehler zu beheben:

1.    Führen Sie diese Abfrage in der Oracle-Quelldatenbank aus, um zu überprüfen, ob die Archivprotokollsequenz in der Quelle vorhanden ist. Diese Abfrage prüft beispielsweise auf Redo-Protokoll-Sequenz 232488:

select name, dest_id, thread#,
sequence#, archived, applied, deleted, status, first_time, next_time, 
completion_time  from v$archived_log where sequence# =232488;

2.    Führen Sie diesen Befehl am Speicherort der Archivprotokolldateien auf dem Quellserver aus. Dieser Befehl prüft, ob das Archivprotokoll physisch vorhanden ist:

ls -l * 232488*

3.    Überprüfen Sie das Archivelog-Ziel (log_archive_dest) in der Oracle-Quelldatenbank.

Die Beispiele in diesem Artikel untersuchen diesen Fehler mit zwei verschiedenen Ursachen:

  • AWS DMS sucht nach dem Redo-Protokoll in der falschen DEST_ID
  • DEL ist JA und die Archivelog-Sequenz existiert nicht auf Oracle Quellcode

Auflösung

Beispiel 1 – AWS DMS sucht nach dem Redo-Protokoll in der falschen DEST_ID

Der Fehler zeigt, dass die archivierte Redo-Protokoll-Sequenz 232488 in der Oracle-Quelldatenbank fehlt. Dies kann passieren, wenn das Protokoll aus der Oracle-Quelldatenbank gelöscht wird. Dies führt dazu, dass die Aufgabe fehlschlägt.

01788702: 2022-06-07T17:10:31:206453 [SOURCE_CAPTURE  ]D:  Going to 
prepare the statement 'select supplemental_log_data_min, DATABASE_ROLE, 
SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_ALL from v$database'  
(oracle_endpoint_conn.c:114)

01788702: 2022-06-07T17:10:31:209648 [SOURCE_CAPTURE  ]I:  Database role is 'PHYSICAL STANDBY'  (oracle_endpoint_conn.c:139)

1.    Führen Sie diese Abfrage in der Quelldatenbank aus, um festzustellen, ob die Archivprotokollsequenz 232488 in der Quelle vorhanden ist:

select name, dest_id, thread#, sequence#, archived, applied, deleted, 
status, first_time, next_time, completion_time  from v$archived_log 
where sequence# in (232488);

Ausgabe:

NAME                                             DEST_ID    THREAD#  SEQUENCE# ARC APPLIED   DEL S FIRST_TIM NEXT_TIME COMPLETIO

--------------------------------------------- ---------- ---------- ---------- --- --------- --- - --------- --------- ---------

/orafra/prdsvbo/arc/1_232488_950180179.arc             2          1     232488 YES YES       NO  A 07-JUN-22 07-JUN-22 07-JUN-22

2.    Überprüfen Sie die Spalte DEL. Wenn in dieser Spalte NEIN aufgeführt ist, ist die Archivedlog-Sequenz in der Quelldatenbank vorhanden. Wenn dort JA aufgeführt ist, existiert archiveredlog nicht und wurde möglicherweise aufgrund der Aufbewahrungsfrist aus der Quelle gelöscht.

In diesem Beispiel zeigt die Ausgabe an, dass die Archivelog-Sequenz in der Quelle vorhanden ist. Die AWS-DMS-Aufgabe schlägt jedoch immer noch mit einem Fehler fehl, der besagt, dass die Sequenz nicht existiert. Informationen zur Fehlersuche, wenn DEL auf JA steht, siehe Beispiel 2.

3.    Überprüfen Sie als Nächstes die Spalte DEST_ID. Standardmäßig erfasst AWS DMS die Redo-Protokolle auf DEST_ID 1. In diesem Beispiel sehen Sie dieses Snippet in den Protokollen:

01788702: 2022-06-07T17:10:31:658376 [SOURCE_CAPTURE  ]I:  Used Oracle archived Redo log destination id is '1'  (oracdc_merger.c:639)

01788702: 2022-06-07T17:10:31:658420 [SOURCE_CAPTURE  ]I:  Oracle instance uses more than one archived Redo log destination id. Please configure the correct destination id, if Redo logs of '1' destination cannot be accessed  (oracdc_merger.c:642)

Daher schlägt die AWS-DMS-Aufgabe fehl, weil sie nach dem Redo-Protokoll in DEST_ID 1 sucht, die Redo-Protokoll-Datei jedoch in DEST_ID 2 vorhanden ist.

4.    Um diesen Fehler zu minimieren, verwenden Sie dieses zusätzliche Verbindungsattribut (ECA) im Quellendpunkt:

additionalArchivedLogDestId=2

Weitere Informationen zu AdditionalArchivedLogDestid finden Sie unter Quelldatentypen für Oracle.

5.    Nachdem Sie die ECA konfiguriert haben, setzen Sie die AWS-DMS-Aufgabe fort. In diesem Beispiel zeigen die Protokolle, dass AWS DMS jetzt die verfügbare Redo-Protokoll-Sequenz 232488 aus DEST_ID 2 erfassen kann.

01898667: 2022-06-08T05:45:08:535588 [SOURCE_CAPTURE  ]D:  Going to retrieve archived REDO log with sequence 232488, thread 1  (oradcdc_thread.c:510)

01898667: 2022-06-08T05:45:08:535607 [SOURCE_CAPTURE  ]T:  Use a prepared statement to access v$archived_log, thread 1  (oradcdc_thread.c:587)

01898667: 2022-06-08T05:45:08:598396 [SOURCE_CAPTURE  ]D:  Going to open Redo Log with original name '/orafra/prdsvbo/arc/1_232488_950180179.arc', thread id '1'  (oradcdc_redo.c:492)

01898667: 2022-06-08T05:45:08:599614 [SOURCE_CAPTURE  ]D:  archived Redo log '/orafra/prdsvbo/arc/1_232488_950180179.arc' with sequence 232488 is opened, thread id '1'  (oradcdc_redo.c:747)

Beispiel 2 - DEL ist JA und die Archivelog-Sequenz existiert nicht auf Quell-Oracle

Wie bereits in Schritt 2 beschrieben, ist es möglich, dass die Archivelog-Sequenz aus der Oracle-Quelldatenbank gelöscht wurde, wenn DEL auf JA gesetzt ist.

Hinweis: Oracle-Instances löschen die Archiv-Protokolldateien, um den Speicherplatz zu minimieren, den die Archivprotokolle belegen.

Schritte für On-Premises oder Amazon Elastic Compute Cloud (Amazon EC2)

Wenn Sie den Recovery Manager (RMAN) so geplant haben, dass noprompt archivelog bis zum Zeitpunkt SYSDATE-1 gelöscht wird, löscht dieser Zeitplan alle Archiv-Protokolldateien, die älter als einen Tag sind. Um diesen Wert zu erhöhen, ändern Sie diesen Befehl in SYSDATE-2, oder deaktivieren Sie den Zeitplan.

Folgen Sie diesen Schritten, um den aktuellen Aufbewahrungszeitraum zu ermitteln, und erhöhen Sie ihn dann.

1.    Stellen Sie eine Verbindung zu RMAN her.

2.    Alle anzeigen:

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

Hinweis: Der Standardwert für die Archivelog-Löschrichtlinie ist NONE.

3.    Ändern Sie den Wert der Löschrichtlinie in einen Wert, der ausreicht, um die Archivelogs in der lokalen Quelldatenbank beizubehalten:

CONFIGURE ARCHIVELOG DELETION POLICY BACKED UP integer TIMES TO DEVICE TYPE

  CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO SBT;

Schritte für Amazon RDS

Amazon RDS löscht die Archiv-Protokolldateien alle fünf Minuten und bewahrt eine Kopie in einem Amazon-Simple-Storage-Solution-Bucket (Amazon S3) auf. Sie können diese Kopie verwenden, um eine Point-in-Time-Wiederherstellung durchzuführen.    

1.    Erhöhen Sie die Aufbewahrung der Archiv-Protokolldateien mithilfe der Schritte unter Durchführen allgemeiner Protokollbezogener Aufgaben für Oracle-DB-Instances.    

2.    Überprüfen Sie den Aufbewahrungszeitraum, der für die Archiv-Protokolldateien definiert ist:

exec RDSADMIN.RDSADMIN_UTIL.SHOW_CONFIGURATION;

3.    Überprüfen Sie, ob die Archiv-Protokolldatei, die Sie in der vorherigen Abfrage abgerufen haben, physisch auf dem Quelldatenbankserver verfügbar ist.

SQL>select name, archived, deleted, status, sequence# from v$archived_log where sequence# = 232488;

Hinweis: In Amazon RDS zeigt die gelöschte Spalte NEIN an, obwohl sie gelöscht wurde. Diese Informationen stammen aus der Steuerdatei.

4.    Um zu überprüfen, ob das Redo-Protokoll in Amazon RDS vorhanden ist, führen Sie diese Abfrage aus:

select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('ARCHIVELOG_DIR')) where filename='redolog-5924417-1-1013939085.arc' order by mtime desc;

Hinweis: AWS DMS kontrolliert nicht das Löschen der Archiv-Redo-Protokolle. Archiv-Redo-Protokolle werden von der lokalen Quelldatenbank oder der RDS for Oracle-Datenbank gelöscht. Stattdessen bestätigt AWS DMS, dass es das Protokoll nicht finden kann, wenn versucht wird, das nächste LSN zu verarbeiten.

5.    Falls verfügbar, stellen Sie das fehlende Archivprotokoll der Sequenz 232488 im Quellziel wieder her, und setzen Sie die Aufgabe dann fort. Alle Redo-Protokolle nach 232488 müssen in der Quelle vorhanden sein, bevor Sie die AWS-DMS-Aufgabe erfolgreich fortsetzen können.

Wenn Sie die fehlende Archiv-Protokollsequenz nicht wiederherstellen können, versuchen Sie, den Task aus der Volllastphase neu zu starten, und starten Sie dann die Migration erneut.