Perché la mia attività AWS DMS CDC che utilizza Oracle come origine ha avuto esito negativo con un messaggio "Sequence doesn't exist" (La sequenza non esiste)?

7 minuti di lettura
0

Desidero eseguire la migrazione dei dati dal mio database on-premise o da Amazon Relational Database Service (Amazon RDS) per Oracle utilizzando AWS Database Migration Service (AWS DMS). L'attività AWS DMS per la modifica dell’acquisizione dei dati (Change Data Capture, CDC) viene eseguita come previsto, ma poi non va a buon fine e riporta un errore simile al seguente: "Oracle CDC maximum retry counter exceeded" (archivelog sequence does not exist) (Contatore massimo tentativi Oracle CDC superato - la sequenza archivelog non esiste) In che modo posso risolvere questo errore?

Breve descrizione

Quando utilizzi un database Oracle come origine per l'attività di migrazione, AWS DMS ottiene i dati dalla tabella durante la fase di caricamento completo. Durante la fase CDC, AWS DMS legge dai registri di ripetizione archiviati. Quindi, AWS DMS acquisisce i registri di ripetizione dal database Oracle di origine e applica solo le modifiche confermate al database di destinazione.

È possibile che venga visualizzato un errore del registro delle sequenze simile al seguente:

"03980512: 2022-05-23T12:33:11 [SOURCE_CAPTURE ]E: Archived Redo log with the sequence 232488 does not exist, thread 1 [1022318] (oradcdc_thread.c:624)" (il registro di ripetizione archiviato con la sequenza 232488 non esiste)

Per risolvere questo errore, segui la seguente procedura:

1.    Esegui questa query sul database Oracle di origine per verificare se la sequenza del registro di archivio è presente nell'origine. Ad esempio, questa query verifica la sequenza del registro di ripetizione 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.    Esegui questo comando sulla posizione dei file di registro di archivio sul server di origine. Questo comando controlla se il registro di archivio è fisicamente presente:

ls -l * 232488*

3.    Controlla la destinazione archivelog (log_archive_dest) nel database Oracle di origine.

Gli esempi in questo articolo analizzano questo errore con due diverse cause primarie:

  • AWS DMS sta cercando il registro di ripetizione nel DEST_ID errato
  • DEL è YES e la sequenza archivelog non esiste nel database Oracle di origine

Risoluzione

Esempio 1: AWS DMS sta cercando il registro di ripetizione nel DEST_ID errato

L'errore mostra che la sequenza del registro di ripetizione archiviato 232488 non è presente nel database Oracle di origine. Ciò può accadere se il registro viene eliminato dal database Oracle di origine. Questo causa il fallimento dell'attività.

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.    Esegui questa query sul database di origine per verificare se la sequenza del registro di archivio 232488 esiste nell'origine:

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

Output:

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.    Controlla la colonna DEL. Se in questa colonna è riportato NO, la sequenza archivedlog esiste nel database di origine. Se riporta YES, allora archiveredlog non esiste e potrebbe essere stato eliminato dall'origine a causa del periodo di conservazione.

In questo esempio, l'output indica che la sequenza archivelog esiste nell'origine. Tuttavia, l'attività AWS DMS continua a fallire con un errore che indica che la sequenza non esiste. Per la risoluzione dei problemi quando DEL è SÌ, vedi l'esempio 2.

3.    Adesso controlla la colonna DEST_ID. Per impostazione predefinita, AWS DMS acquisisce i registri di ripetizione su DEST_ID 1. In questo esempio, vedi questo frammento nei registri:

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)

Pertanto, l'attività AWS DMS fallisce perché sta cercando il registro di ripetizione in DEST_ID 1, ma il file del registro di ripetizione è presente in DEST_ID 2.

4.    Per attenuare questo errore, utilizza questo attributo di connessione aggiuntivo (ECA) nell'endpoint di origine:

additionalArchivedLogDestId=2

Per ulteriori informazioni su AdditionalArchivedLogdestId, vedi Tipi di dati di origine per Oracle.

5.    Dopo aver configurato ECA, riprendi l'attività AWS DMS. In questo esempio, i registri mostrano che AWS DMS è ora in grado di acquisire la sequenza del registro di ripetizione 232488 disponibile da DEST_ID 2.

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)

Esempio 2: DEL è YES e la sequenza archivelog non esiste nel database Oracle di origine

Come descritto in precedenza nel passaggio 2, se DEL è YES, è possibile che la sequenza archivelog sia stata eliminata dal database Oracle di origine.

Nota: le istanze Oracle eliminano i file del registro di archivio per ridurre al minimo lo spazio occupato dallo stesso.

Passaggi per l'ambiente on-premise o per Amazon Elastic Compute Cloud (Amazon EC2)

Se Recovery Manager (RMAN) è stato pianificato per eliminare noprompt archivelog fino all'ora SYSDATE-1, questa pianificazione eliminerà tutti i file del registro di archivio più vecchi di un giorno. Per aumentare il periodo, modifica questo comando in SYSDATE-2 o disattiva la pianificazione.

Segui la seguente procedura per individuare il periodo di conservazione corrente e quindi aumentalo.

1.    Connettiti a RMAN.

2.    Mostra tutto:

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

Nota: il valore predefinito della policy di eliminazione di Archivelog è NONE (nessuno).

3.    Modifica il valore della policy di eliminazione impostando un valore sufficiente per conservare gli archivelog nel database on-premise di origine:

CONFIGURE ARCHIVELOG DELETION POLICY BACKED UP integer TIMES TO DEVICE TYPE

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

Procedura per Amazon RDS

Amazon RDS elimina i file del registro di archivio ogni cinque minuti e ne conserva una copia in un bucket Amazon Simple Storage Solution (Amazon S3). È possibile utilizzare questa copia per eseguire un ripristino point-in-time.    

1.    Aumenta il periodo di conservazione dei file del registro di archivio utilizzando la procedura descritta in Esecuzione di attività comuni relative ai registri per le istanze database di Oracle.    

2.    Verifica il periodo di conservazione definito per i file del registro di archivio:

exec RDSADMIN.RDSADMIN_UTIL.SHOW_CONFIGURATION;

3.    Verifica se il file del registro di archivio recuperato nella query precedente è fisicamente disponibile sul server del database di origine.

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

Nota: in Amazon RDS, la colonna eliminata mostra NO, anche se è stato rimosso. Queste informazioni provengono dal file di controllo.

4.    Per verificare se il registro di ripetizione esiste in Amazon RDS, esegui questa query:

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

Nota: AWS DMS non controlla l'eliminazione dei registri di ripetizione di archivio. I registri di ripetizione di archivio vengono eliminati dall’origine on-premises o dal database RDS per Oracle. Al contrario, AWS DMS conferma di non riuscire a trovare il registro quando tenta di elaborare il prossimo LSN.

5.    Se disponibile, ripristina il registro di archivio mancante della sequenza 232488 nella destinazione di origine e quindi riprendi l'attività. Tutti i registri di ripetizione successivi a 232488 devono essere presenti nell'origine prima di poter riprendere correttamente l'attività AWS DMS.

Se non è possibile ripristinare la sequenza del registro di archivio mancante, prova a riavviare l'attività dalla fase di caricamento completo e quindi riavvia la migrazione.


Informazioni correlate

Attributi di connessione aggiuntivi quando si utilizza Oracle come origine per AWS DMS

Utilizzo di un database Oracle come origine per AWS DMS

Esecuzione di attività comuni relativi al registro per le istanze database di Oracle

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa