Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
為什麼 AWS DMS 任務中的來源篩選條件不再適用?
我想要了解如何在來源篩選條件未在我的 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) 陳述式上發生,例如 UPDATES 或 DELETES。請確定您已在來源資料表上開啟足夠的記錄日誌。
若要配置其他記錄日誌,請使用 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。
相關資訊
- 語言
- 中文 (繁體)
