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:
-
Você pode ativar
HANDLECOLLISIONSeNOHANDLECOLLISIONSde maneira global especificando-os no nível raiz do arquivo de parâmetros. Um parâmetro permanece ativado para todas as instruçõesMAPsubsequentes no arquivo de parâmetros, até que o parâmetro oposto seja encontrado. -
Você pode ativar
HANDLECOLLISIONSouNOHANDLECOLLISIONSem um parâmetroMAPespecífico para ativar ou desativar o tratamento de erros somente para esse mapeamento de origem-destino.
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:
-
Quando o Replicat encontra uma atualização em uma coluna que o Oracle GoldenGate está usando como chave, o tratamento é o seguinte:
-
Se a linha com a chave antiga não for encontrada no destino, o registro de alteração na trilha será convertido em uma inserção.
-
Se houver uma linha com a nova chave no destino, o Replicat excluirá a linha que tiver a chave antiga (ela não existiria se a atualização fosse executada com sucesso) e, em seguida, a linha com a nova chave será atualizada como uma sobreposição em que os valores da trilha substituirão os valores atuais.
Essa lógica requer que todas as colunas da tabela (não apenas as alteradas) sejam registradas no log de transações, por padrão ou por força, como usando a opção
COLSdeADD TRANDATApara um banco de dados Oracle. Consulte Possíveis soluções para evitar valores de coluna ausentes. -
-
Quando o Replicat encontra um erro de registro duplicado, o registro estático que foi aplicado pela carga inicial é substituído pelo registro de alteração na trilha. Sobrepor a alteração é mais seguro do ponto de vista operacional do que ignorar o erro de registro duplicado.
-
O processo Replicat com
HANDLECOLLISIONSnão descartará o registro de alteração na trilha, mesmo que a operação de atualização ou exclusão não afete uma coluna de chave na origem e o processo Replicat encontre um erro de registro ausente no destino. Esses erros ocorrem quando um registro é alterado no sistema de origem e, em seguida, o registro é excluído antes de os dados da tabela serem extraídos pelo processo de carregamento inicial. Por exemplo:
-
O aplicativo atualiza o registro A na origem table1.
-
A extração extrai a atualização.
-
O aplicativo exclui o registro A na origem table1.
-
A extração extrai a exclusão.
-
O Oracle GoldenGate extrai dados de carga inicial da origem table1, sem o registro A.
-
O Oracle GoldenGate aplica a carga inicial, sem o registro A.
-
O processo Replicat tenta aplicar a atualização do registro A.
-
O banco de dados retorna um erro "record missing" (registro ausente).
-
O processo Replicat tenta aplicar a exclusão do registro A.
-
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:
-
Interrompa o Replicat e remova
HANDLECOLLISIONSdo arquivo de parâmetros do Replicat (pode causar latência de destino). Como alternativa, você pode editar o arquivo de parâmetros para adicionarNOHANDLECOLLISIONSantes das instruçõesMAPpara as quais deseja desativar o tratamento de erros. -
Enquanto o Replicat estiver em execução, execute o GGSCI e, em seguida, use o comando
SEND REPLICATcom a opçãoNOHANDLECOLLISIONSpara as tabelas que você deseja afetar.Observação: Se estiver usando
SEND REPLICAT, certifique-se de removerHANDLECOLLISIONSdo arquivo de parâmetros ou adicionar um parâmetroNOHANDLECOLLISIONSantes de iniciar outra execução de Replicat, para queHANDLECOLLISIONSnão seja ativado novamente.
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:
-
HANDLECOLLISIONSrequer que a tabela tenha uma chave primária NOTNULLou uma restrição exclusiva NOTNULLna tabela de destino. -
Use o parâmetro
NOCOMPRESSUPDATESno arquivo de parâmetros Extract para enviar todas as colunas da tabela para a trilha e configure o banco de dados para registrar todos os valores de coluna. Por padrão, o processo Extract grava apenas a chave primária e as colunas que foram alteradas para a trilha. Esse é o método mais seguro, pois ele grava os valores atuais no momento em que a operação é executada e elimina a necessidade de extração. -
Use o parâmetro
FETCHOPTIONScom a opçãoFETCHPKUPDATECOLSno arquivo de parâmetros de Extract. Essa configuração faz com que o Extract extraia colunas indisponíveis quando uma coluna de chave é atualizada na origem. Uma extração é o valor atual, não necessariamente o valor no momento de uma determinada atualização, para que possa haver problemas de integridade de dados. Consulte"[FETCHOPTIONS](fetchoptions.html#GUID-DB7BCF87-E3E8-48CF-868A-A56F6D0B6A07)"para obter mais informações e opções de extração adicionais para tratar extrações malsucedidas.
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.*;