使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

為什麼 AWS DMS 任務中的來源篩選條件不再適用?

3 分的閱讀內容
0

我想要了解如何在來源篩選條件未在我的 AWS Database Migration Service (AWS DMS) 任務中正確運作時疑難排解並修復問題。

解決方法

檢查您的引擎是否支援來源篩選功能

大多數 AWS DMS 來源都支援來源篩選。不過,MongoDB具有 MongoDB 相容性的 Amazon DocumentDB 不支援來源篩選功能。如需詳細資訊,請參閱資料遷移的來源

下列限制可能會影響來源篩選:

  • 篩選條件不會計算由右至左語言的資料欄。
  • 您無法將篩選條件套用至大型物件 (LOB) 資料欄。
  • 您只能將篩選條件套用至建立後無法更新的固定資料欄。如果您將來源篩選條件套用到建立後可以更新的固定資料欄,則來源篩選條件可能無法運作。

疑難排解在全負載期間未運作的篩選條件

確定來源篩選條件未運作的階段。

如果來源篩選條件在全負載期間未運作,請採取下列動作:

  • 確認對應規則中的區分大小寫與來源引擎相符。
  • 篩選日期資料類型時,請使用 AWS DMS 要求的格式。
  • SOURCE_UNLOAD 上執行偵錯記錄日誌層級,以重現問題。然後,擷取 AWS DMS 在來源上執行的查詢,以卸載資料。

在來源 Oracle 資料表上篩選問題的範例:

CREATE TABLE DMS.FILTERS  
( ID NUMBER(10) NOT NULL,  
  ENTRY_DATE DATE,  
  CONSTRAINT FILTERS_PK PRIMARY KEY (ID)  
);  
SQL> SELECT * FROM FILTERS;  
  ID       ENTRY_DATE  
---------- ---------  
         1 01-JAN-22  
         2 01-JUN-22  
         3 01-JAN-21  
         4 01-JUN-21  
         5 01-JAN-20  
         6 01-JUN-20

使用以下對應規則來建立 AWS DMS 任務:設定僅複製大於或等於 01/01/2022 之 ENTRY_DATE 的資料列。

範例任務:

{    
 "rules": [  
    {  
      "rule-type": "selection",  
      "rule-id": "893662253",  
      "rule-name": "893662253",  
      "object-locator": {  
        "schema-name": "DMS",  
        "table-name": "FILTERS"  
      },  
      "rule-action": "include",  
      "filters": [  
        {  
          "filter-type": "source",  
          "column-name": "ENTRY_DATE",  
          "filter-conditions": [  
            {  
              "filter-operator": "gte",  
              "value": "01/01/2022"  
            }  
          ]  
        }  
      ]  
    }  
  ]  
}

若要確定未複製任何記錄,且錯誤會出現在任務日誌中,請執行下列查詢:

01786264: 2022-06-22T10:36:53 [SOURCE_UNLOAD   ]E:  ORA-01843: not a valid month  [1020417]  (oracle_endpoint_unload.c:171)

由於 SOURCE_UNLOAD 已開啟偵錯日誌,因此任務日誌會顯示 AWS DMS 在來源資料庫上執行的確切查詢。

範例查詢:

1786264: 2022-06-22T10:36:53 [SOURCE_UNLOAD   ]D:  Select statement for UNLOAD is 'SELECT "ID","ENTRY_DATE"  FROM "DMS"."FILTERS" WHERE ((("ENTRY_DATE" >= TO_DATE('0000-00-00','YYYY-MM-DD'))))'  (oracle_endpoint_utils.c:1979)

在下列日誌輸出中,AWS DMS 會在來源資料庫上執行查詢:

SELECT "ID","ENTRY_DATE"  FROM "DMS"."FILTERS" WHERE ((("ENTRY_DATE" >= TO_DATE('0000-00-00','YYYY-MM-DD'))));

AWS DMS 無法辨識對應規則中的日期。因此,日期與 AWS DMS 預期的日期格式不符。

若要修改對應規則以符合預期的日期格式,請執行下列查詢:

{                            "filter-operator": "gte",  
                            "value": "2022-01-01"  
                        }

疑難排解在變更資料擷取 (CDC) 期間未運作的篩選條件

篩選固定資料欄時,篩選問題只會在 CDC 階段發生。問題可能只會在特定資料操作語言 (DML) 陳述式上發生,例如 UPDATESDELETES。請確定您已在來源資料表上開啟足夠的記錄日誌。

若要配置其他記錄日誌,請使用 Oracle、PostgreSQL 或 Microsoft SQL Server。

Oracle

Oracle 使用補充記錄日誌在資料表資料欄上新增其他日誌。如果您篩選的資料欄不是主索引鍵資料欄,則請啟用資料欄和主索引鍵欄的補充記錄日誌。

下列範例會複製名為 TEST.LOGGING 的資料表,該資料表格具有主索引鍵 ID 和資料欄 NAME 上的篩選條件。若要建立日誌群組補充記錄日誌,請執行下列命令:

ALTER TABLE TEST.LOGGING ADD SUPPLEMENTAL LOG GROUP TEST_LOG_GROUP (ID, NAME) ALWAYS;

如果已在資料表中的所有資料欄新增補充記錄日誌,則請勿新增更多補充記錄日誌。

已新增補充記錄日誌的範例:

ALTER TABLE TableName ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

PostgreSQL

PostgreSQL 使用 REPLICA IDENTITY 屬性來設定資料表的記錄層級。將 REPLICA IDENTITY 設定為 DEFAULT 時,PostgreSQL 會記錄 write-ahead logs (WAL) 中主索引鍵資料欄的舊值。但是,當您使用非主索引鍵資料欄時,預設記錄日誌層級可能不足以刪除。

請確定 AWS DMS 任務使用設定為下列其中一個屬性的外掛程式:

如果您使用 test_decoding,則請將 REPLICA IDENTITY 設定為 FULL:‎

ALTER TABLE tablename REPLICA IDENTITY FULL;

注意: 如果您未將 REPLICA IDENTITY 設定為 FULL,則 AWS DMS 可能會將所有刪除傳送至目標資料表。

如果您使用 pglogical,則請在將資料表新增至複寫集之後,將 REPLICA IDENTITY 設定為 FULL

ALTER TABLE tablename REPLICA IDENTITY FULL;

注意:REPLICA IDENTITY 設定為 FULL 時,pglogical 包括一項限制,因此您無法將資料表新增至複寫集。您也可以增加在來源資料庫上產生的 WAL 日誌數目。WAL 日誌數目增加時,所有資料欄都會紀錄至 WAL。

Microsoft SQL Server

請檢查您是否符合下列所有 AWS DMS CDC 記錄日誌要求,以開啟 MS-CDC

請對每個具有主索引鍵的資料表,請執行下列查詢:

exec sys.sp_cdc_enable_table
@source_schema = N'schema_name',
@source_name = N'table_name',
@role_name = NULL,
@supports_net_changes = 1
GO

注意: 雲端型來源需要執行事先查詢。

請對每個具有唯一索引鍵,但沒有主索引鍵的資料表,請執行下列查詢:

exec sys.sp_cdc_enable_table
@source_schema = N'schema_name',
@source_name = N'table_name',
@index_name = N'unique_index_name',
@role_name = NULL,
@supports_net_changes = 1
GO

注意: 內部部署和雲端型來源都需要執行事先查詢。如果您對內部部署來源使用 MS-Replication,則不需要執行事先查詢。

請對每個沒有主要或唯一索引鍵的資料表,請執行下列查詢:

exec sys.sp_cdc_enable_table
@source_schema = N'schema_name',
@source_name = N'table_name',
@role_name = NULL
GO

注意: 內部部署和雲端型來源都需要執行事先查詢。

MySQL

在 MySQL 中,binlog_row_image 系統變數控制 binlog 中的資料行映像。如需詳細資訊,請參閱 MySQL 網站上的 binlog_row_image。AWS DMS 要求您將 binlog_row_image 設定為 FULL 並將 binlog_format 設定為 ROW

MySQL 會記錄映像前和映像後中的所有資料欄。若要確認 binlog 中的最大記錄層級,您必須設定來源資料庫上的 binlog_row_image FULL

相關資訊

如何在 AWS DMS 任務中使用來源篩選條件?

使用資料表對應來指定任務設定

使用來源篩選條件

AWS 官方
AWS 官方已更新 6 個月前