HANDLECOLLISIONS | NOHANDLECOLLISIONS

Válido Para

Replicat

Descrição

Use os parâmetros HANDLECOLLISIONS e NOHANDLECOLLISIONS para controlar se o Replicat tentará ou não resolver erros de registro duplicado e de registro ausente ao aplicar SQL no destino. Esses erros, chamados colisões, ocorrem durante uma carga inicial, quando dados das tabelas da origem estiverem sendo carregados nas tabelas do destino enquanto a Oracle GoldenGate estiver replicando as alterações transacionais que estão sendo feitas nessas tabelas, Quando o Oracle GoldenGate aplica as alterações replicadas após a conclusão da carga, o HANDLECOLLISIONS fornece o Replicat com lógica de tratamento de erros para essas colisões.

Você pode usar HANDLECOLLISIONS e NOHANDLECOLLISIONS das seguintes maneiras:

Os métodos anteriores podem ser combinados. Você pode especificar uma regra global de tratamento de colisões e, em seguida, substituir essa regra por diferentes regras de tratamento de colisões nas instruções MAP. Uma especificação MAP sempre substitui a especificação global.

Observação: o Tratamento de Erros do Replicat Integrado não é apropriado para HANDLECOLLISIONS. A Oracle recomenda que você use métodos de instanciação precisos em vez de usar HANDLECOLLISIONS.

HowHANDLECOLLISIONSWorks

O exemplo a seguir explica como o HANDLECOLLISIONS funciona:

  1. O aplicativo atualiza o registro A na origem table1.

  2. A extração extrai a atualização.

  3. O aplicativo exclui o registro A na origem table1.

  4. A extração extrai a exclusão.

  5. O Oracle GoldenGate extrai dados de carga inicial da origem table1, sem o registro A.

  6. O Oracle GoldenGate aplica a carga inicial, sem o registro A.

  7. O processo Replicat tenta aplicar a atualização do registro A.

  8. O banco de dados retorna um erro "record missing" (registro ausente).

  9. O processo Replicat tenta aplicar a exclusão do registro A.

  10. O banco de dados retorna um erro "record missing" (registro ausente).

Desative HANDLECOLLISIONS depois que as alterações transacionais capturadas durante a carga inicial forem aplicadas às tabelas de destino, de modo que o Replicat não trate automaticamente os erros subsequentes. Os erros gerados após a sincronização inicial indicam uma condição anormal e devem ser avaliados por alguém que possa determinar como resolvê-los. Por exemplo, um erro de registro ausente pode indicar que um registro existente no sistema de origem foi excluído inadvertidamente do sistema de destino.

Você pode desativar o HANDLECOLLISIONS das seguintes maneiras:

Soluções possíveis para evitar valores de coluna ausentes

Quando um banco de dados não registra todos os valores de coluna de uma tabela de origem por padrão, pode haver erros se a tabela de destino tiver restrições NOT NULL quando o Replicat tentar converter uma atualização de chave primária em uma inserção. Você pode contornar esse cenário das seguintes maneiras:

Se o banco de dados incluir todas as colunas por padrão, use NOCOMPRESSUPDATES e NOCOMPRESSDELETES para que HANDLECOLLISIONS funcione corretamente. Se o banco de dados não suportar NOCOMPRESSDELETES, você deverá usar FETCHOPTIONS MISSINGCOLS.

Consulte Sobre a Instanciação com Extração de Carga Inicial para obter mais informações sobre os métodos de carga inicial do Oracle GoldenGate.

Padrão

NOHANDLECOLLISIONS

Sintaxe

HANDLECOLLISIONS | NOHANDLECOLLISIONS [_ALLOWPKMISSINGROWCOLLISIONS]
[THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]

HANDLECOLLISIONS

Permite o tratamento de colisões.

_ALLOWPKMISSINGCOLISÕES DE LINHA

Use HANDLECOLLISIONS com _ALLOWPKMISSINGROWCOLLISIONS para ignorar as operações UPDATE de chave primária se a linha de destino correspondente não existir.

Observação: ignorar operações pode danificar os dados. Consulte a descrição neste tópico.

NOHANDLECOLLISIONS

Desativa o tratamento de colisões.

THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])

Ativa HANDLECOLLISIONS para os threads especificados. Quando usado em uma instrução HANDLECOLLISIONS global no nível raiz do arquivo de parâmetros, HANDLECOLLISIONS é ativado para os threads especificados onde quer que estejam em todas as instruções MAP em que . Quando usado em uma cláusula HANDLECOLLISIONS de uma instrução MAP, HANDLECOLLISIONS só é ativado para essa instrução MAP.

threadID[, threadID][, …]

Especifica um thread ID ou uma lista de threads delimitada por vírgulas no formato threadID, threadID, threadID.

thread_range[, thread_range][, …]

Especifica uma faixa de threads na forma de threadIDlow-threadIDhigh ou uma lista de faixas delimitada por vírgulas no formato de threadIDlow-threadIDhigh, threadIDlow-threadIDhigh.

Uma combinação desses formatos é permitida, como threadID, threadID, threadIDlow-threadIDhigh.

Exemplos

Exemplo 1

Este exemplo ativa o HANDLECOLLISIONS para todas as instruções MAP no arquivo de parâmetros.

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;

Exemplo 2

Este exemplo ativa o HANDLECOLLISIONS para algumas instruções MAP ao desativá-lo para outras.

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
NOHANDLECOLLISIONS
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;

Exemplo 3

Este exemplo mostra o uso básico do HANDLECOLLISIONS em uma instrução MAP.

MAP dbo.tcust, TARGET dbo.tcust, HANDLECOLLISIONS;

Exemplo 4

Este exemplo mostra uma combinação de uso global e no nível MAP. A especificação MAP substitui a especificação global para as tabelas especificadas.

HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep, NOHANDLECOLLISIONS;
MAP hr.country, TARGET hr.country, NOHANDLECOLLISIONS;

Exemplo 5

No exemplo a seguir, HANDLECOLLISIONS é ativado globalmente para todas as instruções MAP, exceto para o thread padrão 0 na primeira instrução MAP e para o thread 3 na segunda instrução MAP.

HANDLECOLLISIONS
MAP fin.*, TARGET fin.*;
MAP sales.*, TARGET sales.*;
MAP orders.*, TARGET orders.*;
MAP scott.cust, TARGET scott.cust, NOHANDLECOLLISIONS;
MAP amy.cust, TARGET amy.cust, THREAD(3), NOHANDLECOLLISIONS;

Exemplo 6

Neste exemplo, HANDLECOLLISIONS é ativado globalmente, mas desativado para o thread 3. Os segmentos 1, 2 e 4 restantes tratarão de colisões.

HANDLECOLLISIONS
NOHANDLECOLLISIONS THREAD(3)
MAP scott.emplyees, TARGET scott.employees, THREADRANGE(1,4, OID);
MAP scott.inventory, TARGET scott.inventory, THREADRANGE(1,4, OID);
MAP scott.cust, TARGET scott.cust, THREADRANGE(1,4, OID);

Exemplo 7

Neste exemplo, HANDLECOLLISIONS é ativado globalmente e, em seguida, desativado globalmente para threads de 5 a 7. Na primeira instrução de mapa, todos os threads tratarão colisões, pois o parâmetro HANDLECOLLISIONS não especifica um thread ou um intervalo. Na segunda instrução de mapa, somente os threads 4, 8 e 9 tratarão colisões porque o NOHANDLECOLLISIONS global se aplica aos threads 5-7.

HANDLECOLLISIONS
NOHANDLECOLLISIONS THREADRANGE(5-7)
MAP scott.cust, TARGET scott.cust, THREADRANGE(4,9,OID), HANDLECOLLISIONS;
MAP scott.offices, TARGET scott.offices, THREADRANGE(4,9,OID);
MAP scott.emp, TARGET scott.emp, THREADRANGE(4,9,OID);
MAP scott.ord, TARGET scott.ord, THREADRANGE(4,9,OID);
MAP acct.*, TARGET acct.*;
MAP admin.*, TARGET admin.*;