跳至內容

為什麼使用 Oracle 作為來源的 AWS DMS CDC 任務會失敗並出現 "Sequence does not exist" 錯誤?

4 分的閱讀內容
0

我想使用 AWS Database Migration Service (AWS DMS) 從內部部署或 Amazon Relational Database Service (Amazon RDS) for Oracle 資料庫遷移資料。AWS DMS 變更資料擷取 (CDC) 任務失敗,並出現 "Sequence does not exist" 錯誤訊息。

簡短說明

當您使用 Oracle 資料庫作為遷移任務的來源時,AWS DMS 會在全負載階段從資料表中擷取資料。在 CDC 階段,AWS DMS 會從已歸檔的重做日誌中讀取資料。接著,AWS DMS 會從來源 Oracle 資料庫擷取重做日誌,且僅將已 commit 的變更套用至目標資料庫。

如果 AWS DMS 在錯誤的目的地尋找重做日誌,或者當 DEL 為 YES 且來源 Oracle 資料庫上不存在封存日誌序號時,您可能會收到錯誤訊息。錯誤訊息類似於下列內容:

"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"

解決方法

注意: 來源內部部署資料庫或 RDS for Oracle 資料庫會清除封存重做日誌。AWS DMS 不會清除封存重做日誌。相反地,AWS DMS 會在嘗試處理下一個 LSN 時,確認其無法找到該日誌。

檢查封存日誌檔案和序號是否存在

請完成下列步驟:

  1. 若要檢查來源 Oracle 資料庫伺服器上是否可取得您的封存日誌序號 (LSN),請執行下列命令:
    select name, dest_id, thread#, sequence#, archived, applied, deleted, status, first_time, next_time, completion_time from v$archived_log where sequence# = 232488;
    注意: 將 232488 替換為您序號日誌錯誤中的封存 LSN。
  2. 檢查 ** DEL ** 欄。
    注意: 如果該欄位列出 NO,則代表封存 LSN 存在於來源資料庫中。如果列出 YES 且您使用的是內部部署 Oracle 伺服器,則代表封存 LSN 不存在,且 Oracle 可能已從來源將其清除。請繼續閱讀本文的 DEL 為 YES 且來源 Oracle 資料庫上不存在封存日誌序號一節。在 Amazon RDS 中,如果 Oracle 已清除歸檔 LSN,則 DEL 欄位會顯示為 NO。此資訊來自控制檔。
  3. 如果您使用 Amazon RDS for Oracle,請檢查 Amazon RDS 中是否存在重做日誌。請執行下列查詢:
    select * from table(rdsadmin.rds_file_util.listdir('ARCHIVELOG_DIR')) where filename='example-redolog.arc' order by mtime desc;
    注意: 將 example-redolog.arc 替換為您的封存重做日誌名稱。如果 ARCHIVELOG_DIR 不存在,請建立 ARCHIVELOG_DIR 並再次執行查詢。

AWS DMS 在錯誤的目的地中尋找重做日誌

根據預設,AWS DMS 會擷取 DEST_ID 1 上的重做日誌。AWS DMS 任務失敗,因為它在 DEST_ID 1 中尋找重做日誌,但重做日誌檔案存在於不同的 DEST_ID 中。

若要變更 DEST_ID 值,請完成下列步驟:

  1. 若要檢查序號 DEST_ID 值,請在來源資料庫上執行下列查詢:

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

    注意: 請將 232488 替換為您的封存 LSN。
    上述查詢的範例輸出:

    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. 檢查 DEST_ID 欄位,然後檢查您的 DMS 任務日誌以驗證 DEST_ID。
    日誌範例:

    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)
  3. 若要變更 AWS DMS 使用的 DEST_ID,請將 additionalArchivedLogDestId 額外連線屬性 (ECA) 新增至您的來源端點。
    注意: 請確保此 ECA 的值為上一個步驟中所找到的 DEST_ID 值。如需更多資訊,請參閱 Endpoint settings when using Oracle as a source for AWS DMS (將 Oracle 作為 AWS DMS 的來源時的端點設定)。

  4. 恢復 DMS 任務。日誌顯示 AWS DMS 現在可以從您更新的 DEST_ID 中擷取可用的重做 LSN。
    日誌範例:

    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)

DEL 為 YES 且來源 Oracle 資料庫上不存在封存日誌序號

如果 DEL 為 YES,則代表 AWS DMS 已從來源 Oracle 資料庫中清除封存日誌序號。Oracle 執行個體會刪除封存日誌檔案,以盡量減少封存日誌所佔用的空間。

增加內部部署 Oracle 資料庫的封存保留期

如果您已將 Recovery Manager (RMAN) 排程為刪除 noprompt archivelog 直到時間 SYSDATE-1 為止,則此排程會刪除所有早於 1 天的封存日誌檔案。若要增加此值,請將排程修改為 SYSDATE-2,或關閉排程。

若要查看目前的組態並增加存檔記錄保留率,請完成下列步驟:

  1. 連線至 RMAN。
  2. 若要顯示 Oracle 資料庫上的所有組態,請執行下列查詢:
    RMAN> SHOW ALL;
    注意: 預設的封存日誌刪除政策值為 NONE。
  3. 若要增加保留期,請執行下列命令:
    CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO SBT;
    注意: 將 SBT 替換為您的儲存裝置類型,例如 DISK 或 ANY。
  4. 還原您備份的封存重做日誌,然後恢復 DMS 任務。
    注意: 如果您沒有備份封存重做日誌,請從全負載階段重新啟動任務並重新開始遷移。

增針對 Amazon RDS 增加封存保留期並下載您的封存重做日誌

Amazon RDS 會刪除不在封存日誌保留期內的封存日誌檔案。Amazon RDS 也會根據您的 Amazon RDS 備份保留政策,在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中保留一份副本。您可以使用此副本進行指定時間點還原。

請完成下列步驟:

  1. 若要檢視您目前的封存日誌保留期,請執行下列查詢:

    exec rdsadmin.rdsadmin_util.show_configuration;
  2. 若要增加您的封存日誌保留期,請執行下列命令:

    begin rdsadmin.rdsadmin_util.set_configuration( name => 'archivelog retention hours', value => '24');
    end;
    /
    commit;

    注意: 請將 24 替換為大於您目前封存日誌保留期的值。

  3. 若要確認您增加的保留期並尋找您的日誌檔案名稱,請執行下列命令:

    exec rdsadmin.rdsadmin_util.show_configuration;
  4. 下載您的封存重做日誌。
    注意: 在您可以成功恢復 AWS DMS 任務之前,來源上必須存在跟在您的 LSN 之後的所有重做日誌。如果您無法還原遺失的封存日誌序號,請從全量載入階段重新啟動任務並重新開始遷移。

相關資訊

Using an Oracle database as a source for AWS DMS (使用 Oracle 資料庫作為 AWS DMS 的來源)

Performing common log-related tasks for Oracle DB instances (為 Oracle DB 執行個體執行常見的日誌相關任務)

AWS 官方已更新 6 個月前