Por que as condições do filtro de origem na minha tarefa do AWS DMS não funcionam mais?

7 minuto de leitura
0

Quero aprender a solucionar e corrigir problemas quando as condições do filtro de origem não estão funcionando corretamente em minhas tarefas do AWS Database Migration Service (AWS DMS).

Resolução

Verificar se o seu mecanismo oferece suporte ao recurso de filtragem de origem

A maioria das fontes do AWS DMS oferece suporte à filtragem de fontes. No entanto, o MongoDB ou o Amazon DocumentDB compatível com o MongoDB não oferecem suporte ao recurso de filtragem de origem. Para obter mais informações, consulte Sources for data migration.

As seguintes limitações podem afetar a filtragem de origem:

  • Os filtros não calculam colunas de idiomas da direita para a esquerda.
  • Você não pode aplicar filtros a colunas de objetos grandes (LOB).
  • Você pode aplicar filtros somente às colunas fixas que não podem ser atualizadas depois de criá-las. Se você aplicar filtros de origem a colunas fixas que podem ser atualizadas após criá-las, esses filtros de origem talvez não funcionem.

Solucionar problemas de filtros que não funcionam durante a carga total

Determine em que fase a filtragem de origem não funciona.

Se a filtragem de origem não funcionar durante o carregamento total, execute as seguintes ações:

  • Confirme se a diferenciação entre maiúsculas e minúsculas nas regras de mapeamento corresponde ao mecanismo de origem.
  • Ao filtrar tipos de dados de data, use os formatos exigidos pelo AWS DMS.
  • Execute o nível de registro de depuração em SOURCE_UNLOAD para reproduzir o problema. Em seguida, capture a consulta que o AWS DMS executa na origem para descarregar os dados.

Exemplo de um problema de filtragem em uma tabela Oracle de origem:

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

Crie uma tarefa do AWS DMS com regras de mapeamento que você configura para replicar somente linhas que tenham ENTRY_DATE maior ou igual a 01/01/2022.

Exemplo de tarefa:

{    
 "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"  
            }  
          ]  
        }  
      ]  
    }  
  ]  
}

Para garantir que nenhum registro seja replicado e que os erros apareçam nos logs de tarefas, execute a seguinte consulta:

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

Como os logs de depuração estão ativados para SOURCE_UNLOAD, os logs de tarefas mostram a consulta exata que o AWS DMS executa no banco de dados de origem.

Consulta de exemplo:

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)

Na saída de log a seguir, o AWS DMS executa a consulta no banco de dados de origem:

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

O AWS DMS não reconhece a data nas regras de mapeamento. Portanto, a data não corresponde ao formato de data esperado pelo AWS DMS.

Para modificar as regras de mapeamento para que correspondam ao formato de data esperado, execute a seguinte consulta:

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

Solucionar problemas de filtros que não funcionam durante a captura de dados de alterações (CDC)

Quando você filtra colunas fixas, os problemas de filtragem ocorrem somente durante a fase de CDC. Os problemas podem ocorrer somente em declarações específicas de linguagem de manipulação de dados (DML), como UPDATES ou DELETES. Certifique-se de ativar o registro em log suficiente na tabela de origem.

Para alocar registro em log adicional, use um Oracle, PostgreSQL ou Microsoft SQL Server.

Oracle

A Oracle usa registro em log complementar para adicionar logs adicionais nas colunas da tabela. Se a coluna que você filtrar não for uma coluna de chave primária, ative o registro em log complementar para as colunas da coluna e da chave primária.

O exemplo a seguir replica uma tabela chamada TEST.LOGGING que tem um ID de chave primária e um filtro na coluna NAME. Para criar o registro em log complementar do grupo de logs, execute o seguinte comando:

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

Se o registro em log complementar já tiver sido adicionado em todas as colunas da tabela, não adicione mais logs.

Exemplo com registro em log complementar já adicionado:

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

PostgreSQL

O PostgreSQL usa a propriedade REPLICA IDENTITY para configurar o nível de registro em log de uma tabela. Quando você define REPLICA IDENTITY como DEFAULT, o PostgreSQL registra os valores antigos das colunas da chave primária em logs de gravação antecipada (WAL). No entanto, quando você usa uma coluna de chave não primária, o nível de registro em log padrão pode não ser suficiente para exclusões.

Certifique-se de que a tarefa do AWS DMS use o plug-in definido com uma das seguintes propriedades:

Se você usar test_decoding, defina REPLICA IDENTITY como FULL:

ALTER TABLE tablename REPLICA IDENTITY FULL;

Observação: se você não definir REPLICA IDENTITY como FULL, o AWS DMS poderá enviar todas as exclusões para a tabela de destino.

Se você usar pglogical, defina REPLICA IDENTITY como ** FULL** depois de adicionar a tabela ao conjunto de replicação:

ALTER TABLE tablename REPLICA IDENTITY FULL;

Observação: quando você define REPLICA IDENTITY como FULL, pglogical inclui uma limitação para que você não possa adicionar uma tabela a um conjunto de replicação. Você também aumenta o número de registros WAL gerados no banco de dados de origem. Quando o número de logs do WAL aumenta, todas as colunas são conectadas ao WAL.

Microsoft SQL Server

Verifique se você atende a todos os seguintes requisitos de registro do CDC do AWS DMS para ativar o MS-CDC.

Para cada tabela que tenha uma chave primária, execute a seguinte consulta:

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

Observação: a consulta anterior é necessária para fontes baseadas em nuvem.

Para cada tabela com chaves exclusivas, mas sem chave primária, execute a seguinte consulta:

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

Observação: a consulta anterior é necessária para fontes locais e baseadas na nuvem. Se você usa MS-Replication para fontes locais, não precisa executar a consulta anterior.

Para cada tabela que não tem chaves primárias ou exclusivas, execute a seguinte consulta:

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

Observação: a consulta anterior requer fontes on-premises e baseadas na nuvem.

MySQL

No MySQL, a variável de sistema binlog_row_image controla as imagens das linhas nos binlogs. Para obter mais informações, consulte binlog_row_image no site do MySQL. O AWS DMS exige que você defina binlog_row_image como FULL e binlog_format como ROW.

O MySQL registra todas as colunas na imagem anterior e na imagem posterior. Para confirmar o nível máximo de registro em log nos binlogs, você deve definir binlog_row_image como FULL no banco de dados de origem.

Informações relacionadas

Como usar filtros de origem em tarefas do AWS DMS?

Using table mapping to specify task settings

Using source filters

AWS OFICIAL
AWS OFICIALAtualizada há 7 meses