Detecção e Resolução Automática de Conflitos

Quando o Oracle GoldenGate replica alterações entre bancos de dados Oracle, você pode configurar e gerenciar o Oracle GoldenGate Automatic Conflict Detection and Resolution nos bancos de dados Oracle. Observação: O recurso Detecção e Resolução Automática de Conflitos está disponível no Oracle Database 12c Release 2 (12.2) e em versões posteriores e funciona com o Oracle GoldenGate 12c (12.3.0.1) e versões posteriores. Há um recurso manual de detecção e resolução de conflitos, chamado CDR (Oracle GoldenGate Conflict Detection and Resolution). O CDR do Oracle GoldenGate está configurado no arquivo de parâmetros Replicat. Para saber mais sobre o CDR do Oracle GoldenGate, consulte Manual Conflict Detection and Resolution.

Sobre Detecção e Resolução Automática de Conflitos

Quando o Oracle GoldenGate replica alterações entre bancos de dados Oracle, você pode configurar e gerenciar a detecção e a resolução de conflitos do Oracle GoldenGate automaticamente nesses bancos de dados.

Esse recurso deve ser usado com configurações de ativo-ativo, nas quais o Oracle GoldenGate deve manter a sincronização de dados entre vários bancos de dados que contêm os mesmos conjuntos de dados.

Observação: o recurso de detecção e resolução automáticas de conflitos (ACDR) que só está disponível ao usar o Oracle GoldenGate com o Oracle AI Database. Para bancos de dados não Oracle, há um recurso CDR (Manual Conflict Detection and Resolution) disponível com o Oracle GoldenGate. O CDR do Oracle GoldenGate está configurado no arquivo de parâmetros Replicat.

Detecção e Resolução Automática de Conflitos

Você pode configurar a detecção e a resolução automáticas de conflitos em uma configuração do Oracle GoldenGate que replica tabelas entre bancos de dados Oracle. Para configurar a detecção e a resolução automáticas de conflitos para uma tabela, você precisa chamar o procedimento ADD_AUTO_CDR no pacote DBMS_GOLDENGATE_ADM. Um pré-requisito para configurar a detecção e a resolução automáticas de conflitos, o usuário do Oracle GoldenGate deve ter os privilégios apropriados. Consulte Conceder Privilégios de Usuário para o Oracle AI Database 26ai e Superior e Conceder Privilégios de Usuário para o Oracle Database 21c e Inferior para saber mais sobre privilégios de usuário.

O usuário administrador deve estar conectado ao PDB apropriado ao chamar o ADD_AUTO_CDR. As seguintes constantes, que representam sinalizadores de bits, agora são adicionadas:

O exemplo a seguir usa um comando ALTER para a tabela HR.EMPLOYEES:

BEGIN
 dbms_goldengate_adm.alter_auto_cdr
 (schema_name => 'HR'
 ,table_name => 'EMPLOYEES'
 ,additional_options => DBMS_GOLDENGATE_ADM.ADDITIONAL_OPTIONS_ADD_KEY_VERSION );
END;
/

Consulte a descrição de additional_options em ADD_AUTO_CDR Procedure do Oracle AI Database PL/SQL Packages and Types Reference.

Quando o Oracle GoldenGate captura alterações originadas em um Oracle AI Database, cada alteração é encapsulada em um LCR (Registro de Alteração Lógica de Linhas). Um LCR de linha é uma representação estruturada de uma alteração de linha DML. Cada LCR de linha inclui o tipo de operação, os valores de coluna antigos e os valores de coluna novos. LCRs com várias linhas podem fazer parte de uma única transação de banco de dados.

Quando mais de uma réplica de uma tabela permite alterações na tabela, um conflito pode ocorrer quando uma alteração é feita na mesma linha em dois bancos de dados diferentes quase ao mesmo tempo. O Oracle GoldenGate replica as alterações usando os LCRs de linha. Ele detecta um conflito comparando os valores antigos na linha LCR para a alteração inicial do banco de dados de origem com os valores atuais da linha da tabela correspondente no banco de dados de destino identificado pelas colunas de chave. Se qualquer valor de coluna não corresponder, haverá um conflito.

Depois que um conflito é detectado, o Oracle GoldenGate pode resolver o conflito substituindo valores na linha por alguns valores da linha LCR, ignorando os valores na linha LCR ou computando um delta para atualizar os valores da linha.

A detecção e resolução automáticas de conflitos não exigem alterações no aplicativo pelos seguintes motivos:

Requisitos para Detecção e Resolução Automática de Conflitos

Estes são os principais requisitos para configurar o CDR Automático no Oracle GoldenGate:

Compatibilidade e Migração

Se a tabela base no banco de dados de origem não contiver a coluna KEYVER$$, mas a tabela base de destino tiver, DELETE e Atualizações de Chave Primária causarão um erro no banco de dados de destino para resoluções EARLIEST TIMESTAMP, DELETE ALWAYS WINS e SITE PRIORITY.

Ao replicar de uma tabela base, que tem um KEYVER$$ para uma tabela de destino, que não tem, a coluna KEYVER$$ é ignorada.

Grupos de Coluna

Um grupo de colunas é um agrupamento lógico de uma ou mais colunas em uma tabela replicada. Quando você adiciona um grupo de colunas, a detecção e a resolução de conflitos são executadas nas colunas do grupo de colunas separadamente das outras colunas da tabela.

Quando você configura uma tabela para detecção e resolução de conflitos do Oracle GoldenGate com o procedimento ADD_AUTO_CDR, todas as colunas escalares da tabela são adicionadas a um grupo de colunas padrão. Para definir outros grupos de colunas para a tabela, execute o procedimento ADD_AUTO_CDR_COLUMN_GROUP. Todas as colunas da tabela que não fazem parte de um grupo de colunas definido pelo usuário permanecem no grupo de colunas padrão da tabela.

Os grupos de colunas permitem que bancos de dados diferentes atualizem colunas diferentes na mesma linha quase ao mesmo tempo sem causar um conflito. Quando grupos de colunas são configurados para uma tabela, os conflitos podem ser evitados mesmo que bancos de dados diferentes atualizem a mesma linha na tabela. Um conflito não será detectado se as atualizações alterarem os valores das colunas em diferentes grupos de colunas.

Figura 1: Grupos de colunas

A descrição da imagem é exibida

Este exemplo mostra uma linha sendo replicada no banco de dados A e no banco de dados B. Os dois grupos de colunas a seguir são configurados para a tabela replicada em cada banco de dados:

Esses grupos de colunas permitem que os bancos de dados A e B atualizem a mesma linha quase ao mesmo tempo sem causar um conflito. Especificamente, as seguintes alterações são feitas:

Como as colunas Office e Title estão em diferentes grupos de colunas, as alterações são replicadas sem que um conflito seja detectado. O resultado é que os valores na linha são os mesmos em ambos os bancos de dados após cada alteração ter sido replicada.

Atualizações de LOB da Piecewise

Um conjunto de operações de LOB compostas por LOB WRITE, LOB ERASE e LOB TRIM é uma atualização de LOB baseada em partes. Quando uma tabela que contém colunas LOB é configurada para detecção e resolução de conflitos, cada coluna LOB é colocada em seu próprio grupo de colunas e o grupo de colunas tem sua própria coluna de timestamp oculto. A coluna de marcador de data/hora é atualizada na primeira operação de LOB de nível.

Para uma coluna LOB, um conflito é detectado e resolvido das seguintes maneiras:

Detecção e Resolução Mais Antigas de Conflitos de Timestamp

Colunas com nomes no formato CDRTS$ column group e CDRTS$ROW são usadas para conter timestamps que refletem tempos de modificação para grupos de colunas e a linha.

Observação: As tabelas com símbolos $ ou $$ são tabelas internas ou ocultas.

O DBMS_GOLDENGATE_ADM inclui os seguintes procedimentos para configurar a resolução de timestamp mais antiga e mais recente:

O campo ADDITIONAL_OPTIONS em ADD_AUTO_CDR() e ALTER_AUTO_CDR() ativa o uso do timestamp mais antigo. A ativação do timestamp mais antigo ativa automaticamente o controle de versão, o que adiciona uma nova coluna oculta KEYVER$$ (número de versão) do tipo timestamp. Um novo valor de indicador é adicionado para indicar o uso do marcador de data/hora mais antigo. Esse campo também é adicionado à tabela DELETE TOMBSTONE. Os conflitos de exclusão são o motivo pelo qual o número da versão é necessário. Com uma resolução de timestamp mais antiga, os conflitos de exclusão, que podem ser transparentes, podem não apenas ser bem-sucedidos incorretamente, mas também podem impedir novas inserções da linha (novas versões). Com um timestamp de versão, a exclusão pode ser resolvida corretamente em uma DML de linha para a mesma versão de linha.

A inserção original da linha recebe o marcador de data/hora atual de seu valor padrão. Em seguida, a exclusão desta linha insere o número da versão e a hora em que esta linha foi inserida na tabela de lápides quando há uma exclusão. Em uma nova inserção, por padrão, o número da versão recebe o timestamp atual novamente, evitando assim um conflito falso com as entradas de exclusão atuais na tabela de lápides.

Exemplo

Suponha que você tenha uma tabela tab1 que seja globalmente consistente entre bancos de dados no site 1 e no site 2.

A tabela contém uma chave (principal). O ACDR está mantendo automaticamente uma versão de chave (kv) e um timestamp (ts) como colunas para a tabela base (oculta) e a tabela de lápide. Para a versão da chave kv e o timestamp ts

Banco de Dados 1: insert tab1 key1 kv1 ts1

Banco de Dados 2: delete tab1 key1 kv1 ts1

Inserção para EXCLUIR a tabela TOMBSTONE key1 kv1 ts1

Banco de Dados 1: insert tab1 key1 kv2 ts2

Sem usar a versão da chave, a inserção seria ignorada, o timestamp de exclusão é anterior. Como a versão da chave é usada, você sabe que kv2 não é a versão da linha que foi excluída e a inserção é bem-sucedida.

Detecção e Resolução do Conflito de Timestamp Mais Recente

Quando você executa o procedimento ADD_AUTO_CDR no pacote DBMS_GOLDENGATE_ADM para configurar uma tabela para detecção e resolução automáticas de conflitos do Oracle GoldenGate, uma coluna de timestamp oculto é adicionada à tabela. Esta coluna de marcador de data/hora oculta registra a hora de uma alteração de linha, e essas informações são usadas para detectar e resolver conflitos.

Quando um LCR de linha é aplicado, pode ocorrer um conflito para uma operação INSERT, UPDATE ou DELETE. A tabela a seguir descreve cada tipo de conflito e como ele é resolvido.

Operação Detecção de Conflito Resolução de Conflitos
INSERT Um conflito é detectado quando a tabela tem o mesmo valor para uma coluna de chave que o novo valor na linha LCR.

Se o marcador de data/hora da linha LCR for posterior ao marcador de data/hora na linha da tabela, os valores na linha LCR substituirão os valores na tabela.

Se o timestamp da linha LCR for anterior ao timestamp na linha da tabela, o LCR da linha será descartado e os valores da tabela serão retidos.

UPDATE

Um conflito é detectado em cada um dos seguintes casos:

  • Há uma incompatibilidade entre o valor do marcador de data/hora na linha LCR e o valor do marcador de data/hora da linha correspondente na tabela.

  • Há uma incompatibilidade entre um valor antigo em um grupo de colunas na linha LCR não corresponde ao valor da coluna na linha da tabela correspondente. Um grupo de colunas é um agrupamento lógico de uma ou mais colunas em uma tabela replicada.

  • A linha da tabela não existe. Se a linha estiver na tabela de lápide, isso será chamado de conflito update-delete.

Se houver uma incompatibilidade de valor e o timestamp da linha LCR for posterior ao timestamp na linha da tabela, os valores na linha LCR substituirão os valores na tabela.

Se houver uma incompatibilidade de valor e o timestamp da linha LCR for anterior ao timestamp na linha da tabela, o LCR da linha será descartado e os valores da tabela serão retidos.

Se a linha da tabela não existir e o timestamp da linha LCR for posterior ao timestamp na linha da tabela de lápide, o LCR da linha será convertido de uma operação UPDATE para uma operação INSERT e inserido na tabela.

Se a linha da tabela não existir e o timestamp da linha LCR for anterior ao timestamp na linha da tabela de lápide, o LCR da linha será descartado.

Se a linha da tabela não existir e não houver linha correspondente na tabela de lápide, a linha LCR será convertida de uma operação UPDATE para uma operação INSERT e inserida na tabela.

DELETE

Um conflito é detectado em cada um dos seguintes casos:

  • Há uma incompatibilidade entre o valor do marcador de data/hora na linha LCR e o valor do marcador de data/hora da linha correspondente na tabela.

  • A linha da tabela não existe.

Se o timestamp da linha LCR for posterior ao timestamp na tabela, exclua a linha da tabela.

Se o timestamp da linha LCR for anterior ao timestamp na tabela, o LCR da linha será descartado e os valores da tabela serão retidos.

Se a exclusão for bem-sucedida, registre a linha LCR inserindo-a na tabela de lápides.

Se a linha da tabela não existir, registre a linha LCR inserindo-a na tabela de lápide.

A imagem a seguir exibe a resolução de conflitos entre o banco de dados A e o banco de dados B: Resolução de conflito de timestamp mais recente usando o método de timestamp mais recente.

Este exemplo mostra uma linha sendo replicada no banco de dados A e no banco de dados B. As colunas do banco de dados são Name, RowTS, Office, Title e Salary. A coluna RowTS é a coluna invisível nos dois bancos de dados. Há uma atualização na coluna Office no banco de dados A e, ao mesmo tempo, há uma atualização na coluna Title no banco de dados B. Isso causa um conflito e a resolução desse conflito é feita aplicando o método de timestamp mais recente.

Resolução de Conflitos Delta

Com a detecção de conflito delta, ocorre um conflito quando um valor na lista de colunas antiga da linha LCR difere do valor da linha correspondente na tabela.

Para configurar a detecção e a resolução de conflitos delta de uma tabela, execute o procedimento ADD_AUTO_CDR_DELTA_RES no pacote DBMS_GOLDENGATE_ADM. O método de resolução delta não depende de um marcador de data/hora ou de uma coluna de resolução extra. Com a resolução de conflitos delta, o conflito é resolvido adicionando a diferença entre os valores novos e antigos na linha LCR para o valor na tabela. Esse método de resolução é geralmente usado para dados financeiros, como um saldo de conta. Por exemplo, se um saldo bancário for atualizado em dois locais simultaneamente, o valor convergente contabilizará todos os débitos e créditos.

A figura a seguir fornece um exemplo que ilustra a detecção e resolução de conflitos delta.

Figura 2: Detecção e resolução de conflitos Delta

A descrição da imagem é exibida

Este exemplo mostra uma linha sendo replicada no banco de dados A e no banco de dados B. A coluna Balance é designada como a coluna na qual a resolução de conflito delta é executada, e a coluna RowTS é a coluna de timestamp invisível para rastrear o horário de cada alteração na coluna Balance. É feita uma alteração no valor Balance na linha em ambos os bancos de dados quase ao mesmo tempo (@T20 no banco de dados A e @T22 no banco de dados B). Essas alterações resultam em um conflito, e a resolução de conflitos delta é usada para resolver o conflito da seguinte maneira:

Após a resolução do conflito delta, o valor da coluna Balance é o mesmo para a linha no banco de dados A e no banco de dados B.

CDR de prioridade do local

Observação: A resolução SITE PRIORITY tem precedência sobre todas as definições de resolução COLUMN GROUP.

Observação: Se o parâmetro Replicat SITE PRIORITY não for colocado antes das instruções de mapa aplicáveis no arquivo de parâmetros, ele não funcionará. Este parâmetro deve ser colocado antes das instruções de mapa aplicáveis.

A resolução de prioridade é especificada no arquivo de parâmetros Replicat entre a origem e o destino para resolução de conflito.

SITE PRIORITY é ativado para um banco de dados ou PDB no arquivo de parâmetros de Replicat com o parâmetro ACDR SITE_PRIORITY {source_db_name}{OVERWRITE | IGNORE }, que é especificado para ativar a resolução SITE PRIORITY de uma tabela.

Se a opção OVERWRITE for especificada, a tabela de origem terá prioridade e os conflitos serão resolvidos pelo OVERWRITE. Da mesma forma, se a opção IGNORE for especificada, a tabela de destino terá prioridade e as alterações da tabela de origem serão ignoradas em um conflito.

A resolução SITE PRIORITY pode ser desativada pelo campo ADDITIONAL_OPTIONS no procedimento ADD_AUTO_CDR() no pacote DBMS_GOLDENGATE_ADM e pelo ALTER_AUTO_CDR() definindo IGNORE_SITE_PRIORITY.

Cada relacionamento de origem-destino do Replicat pode ser configurado de maneira diferente; portanto, a convergência depende da configuração do usuário.

Excluir CDR de Timestamp de Sempre Ganhos

O DELETE ALWAYS WINS é ativado por meio do campo ADDITIONAL_OPTIONS nos procedimentos DBMS_GOLDENGATE_ADM ADD_AUTO_CDR() e ALTER_AUTO_CDR(). Este é novamente um método de exclusão de resolução de conflito, que não está usando a resolução de timestamp mais recente, portanto, o controle de versão é necessário. A ativação do DELETE ALWAYS WINS ativa automaticamente o controle de versão, que adiciona uma nova coluna oculta KEYVER$$ (número de versão) do tipo timestamp. Um novo valor de flag também é adicionado ao acdrflags_kqldtvc para indicar o uso do DELETE ALWAYS WINS. Esse campo também é adicionado à tabela DELETE TOMBSTONE. Os mesmos problemas de versão existem na resolução EARLIEST TIMESTAMP.

Exemplo:

Versão da Chave kv e Timestamp ts

Banco de Dados 1: insert tab1 key1 kv1 ts1

Banco de Dados 2: delete tab1 key1 kv1 ts1

Inserção na tabela DELETE TOMBSTONE key1 kv1 ts1

Banco de Dados 1: insert tab1 key1 kv2 ts2

Sem usar a versão da chave, a inserção seria ignorada, a exclusão sempre vence. Como a versão da chave é usada, você sabe que kv2 não é a versão da linha que foi excluída e a inserção é bem-sucedida.

DELETE TOMBSTONE Tabela

A tabela DELETE TOMBSTONE é um marcador de um registro excluído para distingui-lo de um registro, que nunca existiu. Uma tabela DELETE TOMBSTONE contém no mínimo as colunas de chave e o timestamp da operação. Essas informações são necessárias para excluir a convergência porque algumas atualizações e inserções de entrada podem ser atrasadas de outro site e o LCR de entrada precisa ser filtrado em relação ao timestamp da operação de lápide para determinar se deve ser aplicado.

Rastrear Atualizações da Chave Primária em Excluir Tombstone

O suporte total às atualizações da chave primária (PK) requer o tratamento de conflitos nas linhas representadas pela imagem anterior da chave e na linha representada pela imagem posterior da chave. Uma atualização de PK é uma exclusão e inserção autônomas; portanto, os conflitos de atualização de PK devem ser suportados como uma exclusão para conflitos com a imagem anterior da chave e inserções com a imagem posterior da chave (e linha).

Suportar a atualização PK como uma exclusão da linha representada pela imagem anterior da chave significa que ela deve ser inserida na tabela de lápides de exclusão como uma exclusão. Um acionador interno de atualização é adicionado para inserir na tabela de lápide quando a chave primária é atualizada (na verdade, a chave de identificação da linha, a chave primária se existir ou o Reino Unido escolhido com pelo menos uma coluna não anulável). Como uma atualização de PK pode levar a dois conflitos, até duas resoluções são tentadas no nível da linha, a exclusão da linha com a PK original e a inserção da linha com a nova PK.

Exemplo: Usando a resolução de timestamp mais recente

Database 1: Atualizar para tab1 key1 at ts1

Database 2: Atualizar para tab1 key1 set key1 to key2 ts2

Database 3: Atualizar para tab1 key2 ts3

Nesse cenário, parece que a linha tab1 no nível da linha com key1 deve ser excluída e a atualização do banco de dados 3 deve ser a modificação final da chave da linha tab1

  1. Se, em vez disso, o banco de dados 2 estiver em ts3 e o banco de dados 3 estiver em ts3, a atualização da PK no banco de dados 2 será a modificação final da linha tab1 key2.

Now, consider a case where the database 1 was at ts3, database 2 at ts2 and database 3 at ts1, then the update to tab1 row key1 on database 1 should succeed and the PK update from database 2 on tab1 row key2 should succeed. Neste ponto, parece que a resolução completa é que a exclusão na imagem anterior e a inserção na imagem posterior devem ser resolvidas separadamente. Isto implica que eles não são dependentes um do outro e uma perda para um, não é uma perda para ambos.

Configurando a Detecção e a Resolução do Conflito Delta

O procedimento ADD_AUTO_CDR_DELTA_RES no pacote DBMS_GOLDENGATE_ADM configura a detecção e a resolução de conflitos delta.

Com a resolução de conflitos delta, você especifica uma coluna para a qual os conflitos são detectados e resolvidos. O conflito será detectado se o valor da coluna na linha LCR não corresponder ao valor correspondente na tabela. O conflito é resolvido adicionando a diferença entre os valores novos e antigos na linha LCR para o valor na tabela.

Você pode configurar um administrador do Oracle GoldenGate usando o procedimento GRANT_ADMIN_PRIVILEGE no pacote DBMS_GOLDENGATE_ADM.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento ADD_AUTO_CDR e especifique a tabela a ser configurada para detecção e resolução de conflitos de timestamp mais recentes.

  3. Execute o procedimento ADD_AUTO_CDR_DELTA_RES e especifique a coluna na qual a detecção e resolução de conflitos delta é executada.

  4. Repita as etapas anteriores em cada Oracle AI Database que replica a tabela.

Exemplo 9-23 Configurando a Detecção e a Resolução de Conflitos Delta para uma Tabela

Este exemplo configura a detecção e a resolução de conflitos delta para a coluna order_total na tabela oe.orders.

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

Configurando a Detecção e Resolução de Conflitos de Timestamp Mais Recente

O procedimento ADD_AUTO_CDR no pacote DBMS_GOLDENGATE_ADM configura a detecção e a resolução de conflitos de timestamp mais recentes. O procedimento ADD_AUTO_CDR_COLUMN_GROUP adiciona grupos de colunas opcionais.

Para o Oracle AI Database 26ai e versões posteriores, existem métodos adicionais para gerenciar e manter tabelas configuradas do ACDR. Você pode manter as colunas subjacentes relacionadas ao AUTO-CDR como colunas UNUSED ou eliminá-las imediatamente após chamar o procedimento REMOVE_AUTO_CDR.

Se você aplicar o procedimento ADD_AUTO_CDR a uma tabela, por padrão, suas colunas internas serão marcadas como não usadas se AUTO_CDR for removido. Após chamar REMOVE_AUTO_CDR, as colunas não utilizadas poderão ser excluídas manualmente em um estágio posterior ou poderão ser removidas imediatamente usando alguns parâmetros adicionais. Para obter detalhes, consulte Removendo Detecção e Resolução de Conflitos de uma Tabela.

Para saber mais, consulte ADD_AUTO_CDR Procedure na Referência de Tipos e Pacotes PL/SQL do Oracle AI Database

Com a mais recente detecção e resolução de conflitos de timestamp, um conflito é detectado quando a coluna de timestamp da linha LCR não corresponde ao timestamp da linha da tabela correspondente. O LCR da linha será aplicado se seu timestamp for posterior. Caso contrário, a linha LCR será descartada e a linha da tabela não será alterada. Quando você executa o procedimento ADD_AUTO_CDR, ele adiciona uma coluna de timestamp invisível para cada linha na tabela especificada e configura a detecção e a resolução de conflitos de timestamp. Quando você usa o procedimento ADD_AUTO_CDR_COLUMN_GROUP para adicionar um ou mais grupos de colunas, ele adiciona um timestamp para o grupo de colunas e configura a detecção e a resolução de conflitos de timestamp para o grupo de colunas.

Você pode configurar um administrador do Oracle GoldenGate usando o procedimento GRANT_ADMIN_PRIVILEGE no pacote DBMS_GOLDENGATE_ADM.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento ADD_AUTO_CDR e especifique a tabela a ser configurada para detecção e resolução de conflitos de timestamp mais recentes.

  3. Execute o procedimento ADD_AUTO_CDR_COLUMN_GROUP e especifique um ou mais grupos de colunas na tabela.

  4. Repita as etapas anteriores em cada Oracle AI Database que replica a tabela.

Exemplo 9-24 Configurando a Última Detecção e Resolução de Conflitos de Timestamp para uma Tabela

Este exemplo configura a detecção e a resolução de conflitos de timestamp mais recentes para a tabela hr.employees.

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'HR',
    TABLE_NAME  => 'EMPLOYEES');
END;
/

Exemplo 9-25 Configurando Grupos de Colunas

Este exemplo configura os seguintes grupos de colunas para resolução de conflito de timestamp na tabela HR.EMPLOYEES:

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_LIST       => 'JOB_ID, DEPARTMENT_ID, MANAGER_ID',
    COLUMN_GROUP_NAME => 'JOB_IDENTIFIER_CG');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_LIST       => 'SALARY, COMMISSION_PCT',
    COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;
/

Configurando a Detecção e a Resolução do Conflito Delta

O procedimento ADD_AUTO_CDR_DELTA_RES no pacote DBMS_GOLDENGATE_ADM configura a detecção e a resolução de conflitos delta.

Com a resolução de conflitos delta, você especifica uma coluna para a qual os conflitos são detectados e resolvidos. O conflito será detectado se o valor da coluna na linha LCR não corresponder ao valor correspondente na tabela. O conflito é resolvido adicionando a diferença entre os valores novos e antigos na linha LCR para o valor na tabela.

Você pode configurar um administrador do Oracle GoldenGate usando o procedimento GRANT_ADMIN_PRIVILEGE no pacote DBMS_GOLDENGATE_ADM.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento ADD_AUTO_CDR e especifique a tabela a ser configurada para detecção e resolução de conflitos de timestamp mais recentes.

  3. Execute o procedimento ADD_AUTO_CDR_DELTA_RES e especifique a coluna na qual a detecção e resolução de conflitos delta é executada.

  4. Repita as etapas anteriores em cada Oracle AI Database que replica a tabela.

Exemplo 9-26 Configurando a Detecção e a Resolução de Conflitos Delta para uma Tabela

Este exemplo configura a detecção e a resolução de conflitos delta para a coluna order_total na tabela oe.orders.

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

Gerenciando a Detecção e a Resolução Automática de Conflitos

Você pode gerenciar a detecção e resolução automáticas de conflitos do Oracle GoldenGate no Oracle AI Database com o pacote DBMS_GOLDENGATE_ADM.

Alterando a Detecção de Conflitos e a Resolução para uma Tabela

O procedimento ALTER_AUTO_CDR no pacote DBMS_GOLDENGATE_ADM altera a detecção e a resolução de conflitos de uma tabela.

A detecção e a resolução automáticas de conflitos do Oracle GoldenGate devem ser configuradas para a tabela:

  1. Estabeleça conexão com o banco de dados do servidor de entrada como o administrador do Oracle GoldenGate.

  2. Execute o procedimento ALTER_AUTO_CDR e especifique a tabela a ser configurada para detecção e resolução de conflitos de timestamp mais recentes.

  3. Repita todas as etapas anteriores em cada Oracle AI Database que replica a tabela.

Exemplo 9-27 Alterando a Detecção e a Resolução de Conflitos de uma Tabela

Este exemplo altera a detecção e a resolução de conflitos da tabela HR.EMPLOYEES para especificar que os conflitos de exclusão são rastreados em uma tabela de lápide.

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    TOMBSTONE_DELETES => TRUE);
END;
/

Alterando um Grupo de Colunas

O procedimento ALTER_AUTO_CDR_COLUMN_GROUP altera um grupo de colunas.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento ALTER_AUTO_CDR_COLUMN_GROUP e especifique um ou mais grupos de colunas na tabela.

  3. Repita todas as etapas anteriores em cada Oracle AI Database que replica a tabela.

Exemplo 9-28 Alterando um Grupo de Colunas

Este exemplo remove a coluna MANAGER_ID do grupo de colunas JOB_IDENTIFIER_CG da tabela HR.EMPLOYEES.

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME        => 'HR',
    TABLE_NAME         => 'EMPLOYEES',
    COLUMN_GROUP_NAME  => 'JOB_IDENTIFIER_CG',
    REMOVE_COLUMN_LIST => 'MANAGER_ID');
END;
/

Observação: Se houver mais de uma coluna, use uma lista separada por vírgulas.

Expurgando Linhas de Lápide

O procedimento PURGE_TOMBSTONES remove as linhas de lápide que foram registradas antes de uma data e hora especificadas. Este procedimento remove as linhas de base de todas as tabelas configuradas para resolução de conflitos no banco de dados.

Pode ser necessário limpar as fileiras de lápide periodicamente para evitar que o log de lápide cresça muito ao longo do tempo.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento PURGE_TOMBSTONES e especifique a data e a hora.

Exemplo 9-29 Expurgando Linhas de Lápide

Este exemplo limpa todas as linhas de lápide registradas antes das 3:00 da tarde em 1º de dezembro de 2015, Horário Padrão do Leste. O timestamp deve ser informado no formato TIMESTAMP WITH TIME ZONE.

EXEC DBMS_GOLDENGATE_ADM.PURGE_TOMBSTONES('2015-12-01 15:00:00.000000 EST');

Redefinição On-line em Tabelas ACDR

O Oracle AI Database permite mitigar a interação do aplicativo ao reorganizar tabelas ou colunas usando o pacote DBMS_REDEFINITION. O pacote DBMS_REDEFINITION pode ser usado para executar as seguintes tarefas:

O DBMS_REDFINITION.START_REDEF_TABLE gerencia automaticamente a coluna de timestamp oculto para a tabela provisória.

Para obter detalhes sobre o Pacote DBMS_REDFINITION, consulte DBMS_REDEFINITION no Oracle AI Database PL/SQL Packages and Types Reference.

Remover detecção e resolução de conflitos de uma tabela

Com o Oracle AI Database e versões mais recentes, a remoção completa do ADR (Automatic Conflict Detection and Resolution) da tabela terá menor impacto na tabela porque as colunas relacionadas a AUTO_CDR serão marcadas como UNUSED se AUTO_CDR for removido.

Depois de chamar o procedimento REMOVE_AUTO_CDR, as colunas não usadas podem ser excluídas manualmente em uma janela de manutenção. Isso é útil para tabelas grandes em que a operação ALTER TABLE ... DROP COLUMN consome muitos recursos.

Se quiser remover todas as colunas internas AUTO_CDR imediatamente ao chamar o procedimento REMOVE_AUTO_CDR, você deverá primeiro marcar a tabela usando o parâmetro additional_options REMOVE_HIDDEN_COLUMNS para o procedimento ADD_AUTO_CDR ou ALTER_AUTO_CDR.

Use o procedimento REMOVE_AUTO_CDR no pacote DBMS_GOLDENGATE_ADM para marcar uma tabela como UNUSED, que minimiza o bloqueio. Você pode optar por eliminar uma coluna ou retê-la em um estágio posterior.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento REMOVE_AUTO_CDR e especifique a tabela.

  3. Repita todas as etapas anteriores em cada instância do Oracle AI Database que replica a tabela.

Exemplo 9-30 Removendo a Detecção e a Resolução de Conflitos de uma Tabela

Este exemplo remove a detecção e a resolução de conflitos da tabela HR.EMPLOYEES.

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR(
    SCHEMA_NAME => 'HR',
    TABLE_NAME  => 'EMPLOYEES');
END;
/

Você pode optar por eliminar colunas usando o flag ADD_AUTO_CDR.REMOVE_HIDDEN_COLUMNS como um parâmetro additional_flags no procedimento ADD_AUTO_CDR.

Veja um exemplo que você pode usar para exibir colunas ocultas em uma tabela.

A consulta a seguir usa o pacote DBA_UNUSED_COL_TABS para determinar se há colunas não usadas na tabela EMPLOYEES.

SELECT OWNER, TABLE_NAME, COUNT
  FROM DBA_UNUSED_COL_TABS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  ORDER BY OWNER, TABLE_NAME;

A saída é exibida da seguinte forma:

OWNER        TABLE_NAME    COUNT
--------    ------------ ----------
HR            EMPLOYEES      1

A consulta a seguir lista as colunas ocultas que foram marcadas pelo sistema quando o ACDR foi removido do grupo de colunas na tabela EMPLOYEES.

SELECT OWNER, TABLE_NAME, COLUMN_ID, COLUMN_NAME, DATA_TYPE, HIDDEN_COLUMN
  FROM DBA_TAB_COLS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  AND HIDDEN_COLUMN = 'YES' AND USER_GENERATED= 'NO'
  ORDER BY OWNER, TABLE_NAME, COLUMN_ID;

A saída é exibida da seguinte forma:

OWNER        TABLE_NAME    COLUMN_ID  COLUMN_NAME      DATA_TYPE     HIDDEN_COLUMN
------------ ------------ ---------- -------------    ------------ ---------------
HR           EMPLOYEES    SYS_C00014_22092220:30:52$   TIMESTAMP(6)       YES

Removendo um Grupo de Colunas

Com o Oracle AI Database 26ai e versões mais recentes, a remoção da ACDR (Automatic Conflict Detection and Resolution) dos grupos de colunas tem menor impacto na tabela porque as colunas relacionadas ao ACDR são marcadas como UNUSED. Você também pode optar por eliminar uma coluna ou retê-la em um estágio posterior.

Use o procedimento REMOVE_AUTO_CDR_COLUMN_GROUP no pacote DBMS_GOLDENGATE_ADM para marcar uma tabela, o que minimiza o bloqueio. Consulte o exemplo em Removendo Detecção e Resolução de Conflitos de uma Tabela.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento REMOVE_AUTO_CDR_COLUMN_GROUP e especifique o nome do grupo de colunas.

  3. Repita todas as etapas anteriores em cada Oracle AI Database que replica a tabela.

Exemplo 9-31 Removendo um Grupo de Colunas

Este exemplo remove o grupo de colunas COMPENSATION_CG da tabela HR.EMPLOYEES.

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    COLUMN_GROUP_NAME => 'COMPENSATION_CG');
END;

Removendo Detecção e Solução de Conflitos Delta

O procedimento REMOVE_AUTO_CDR_DELTA_RES no pacote DBMS_GOLDENGATE_ADM remove a detecção e a resolução de conflitos delta de uma coluna.

A detecção e a resolução de conflitos delta devem ser configuradas para a coluna especificada.

  1. Estabeleça conexão com o banco de dados do servidor de entrada como um administrador do Oracle GoldenGate.

  2. Execute o procedimento REMOVE_AUTO_CDR_DELTA_RES e especifique a coluna.

  3. Repita todas as etapas anteriores em cada Oracle AI Database que replica a tabela.

Exemplo 9-32 Removendo a Detecção e a Resolução de Conflitos Delta para uma Tabela

Este exemplo remove a detecção e a resolução de conflitos delta da coluna ORDER_TOTAL na tabela OE.ORDERS.

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;

Monitorando a Detecção e a Resolução Automática de Conflitos

Você pode monitorar a detecção e a resolução automáticas de conflitos do Oracle GoldenGate em um Oracle AI Database consultando views do dicionário de dados.

Exibindo Informações Sobre as Tabelas Configuradas para Conflitos

A view ALL_GG_AUTO_CDR_TABLES exibe informações sobre as tabelas configuradas para detecção e resolução automáticas de conflitos do Oracle GoldenGate.

  1. Conectar-se ao banco de dados.

  2. Consulte a exibição ALL_GG_AUTO_CDR_TABLES.

Exemplo 9-33 Exibindo Informações Sobre as Tabelas Configuradas para Detecção e Resolução de Conflitos

Esta consulta exibe as seguintes informações sobre as tabelas configuradas para detecção e resolução de conflitos:

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN TOMBSTONE_TABLE FORMAT A15
COLUMN ROW_RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME,
       TOMBSTONE_TABLE,
       ROW_RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_TABLES
  ORDER BY TABLE_OWNER, TABLE_NAME;

Sua saída é semelhante à seguinte:

TABLE_OWNER     TABLE_NAME      TOMBSTONE_TABLE ROW_RESOLUTION_COLUMN
--------------- --------------- --------------- -------------------------
HR              EMPLOYEES       DT$_EMPLOYEES   CDRTS$ROW
OE              ORDERS          DT$_ORDERS      CDRTS$ROW

Exibir informações sobre colunas de resolução de conflitos

A view ALL_GG_AUTO_CDR_COLUMNS exibe informações sobre as colunas configuradas para detecção e resolução automáticas de conflitos do Oracle GoldenGate.

As colunas podem ser configuradas para detecção e resolução automática de conflitos de linha ou coluna. As colunas podem ser configuradas para a última resolução de conflito de timestamp em um grupo de colunas. Além disso, uma coluna pode ser configurada para resolução de conflitos delta.

  1. Estabeleça conexão com o banco de dados como um administrador do Oracle GoldenGate.

  2. Consulte a exibição ALL_GG_AUTO_CDR_COLUMNS.

Exemplo 9-34 Exibindo Informações Sobre Grupos de Colunas

Esta consulta exibe as seguintes informações sobre as tabelas configuradas para detecção e resolução de conflitos:

COLUMN TABLE_OWNER FORMAT A10
COLUMN TABLE_NAME FORMAT A10
COLUMN COLUMN_GROUP_NAME FORMAT A17
COLUMN COLUMN_NAME FORMAT A15
COLUMN RESOLUTION_COLUMN FORMAT A23

SELECT TABLE_OWNER,
       TABLE_NAME,
       COLUMN_GROUP_NAME,
       COLUMN_NAME,
       RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_COLUMNS
  ORDER BY TABLE_OWNER, TABLE_NAME;

Sua saída é semelhante à seguinte:

TABLE_OWNE TABLE_NAME COLUMN_GROUP_NAME COLUMN_NAME     RESOLUTION_COLUMN
---------- ---------- ----------------- --------------- -----------------------
HR         EMPLOYEES  COMPENSATION_CG   COMMISSION_PCT  CDRTS$COMPENSATION_CG
HR         EMPLOYEES  COMPENSATION_CG   SALARY          CDRTS$COMPENSATION_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG MANAGER_ID      CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG JOB_ID          CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG DEPARTMENT_ID   CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  IMPLICIT_COLUMNS$ PHONE_NUMBER    CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ LAST_NAME       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ HIRE_DATE       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ FIRST_NAME      CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMAIL           CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMPLOYEE_ID     CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_MODE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_ID        CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_DATE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ CUSTOMER_ID     CDRTS$ROW
OE         ORDERS     DELTA$            ORDER_TOTAL
OE         ORDERS     IMPLICIT_COLUMNS$ PROMOTION_ID    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_STATUS    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ SALES_REP_ID    CDRTS$ROW

Neste exemplo, as colunas com IMPLICIT_COLUMNS$ para o nome do grupo de colunas são configuradas para detecção e resolução de conflitos de linha, mas não fazem parte de um grupo de colunas. As colunas com DELTA$ para o nome do grupo de colunas são configuradas para detecção e resolução de conflitos delta, e essas colunas não têm uma coluna de resolução.

Exibir informações sobre grupos de colunas

A view ALL_GG_AUTO_CDR_COLUMN_GROUPS exibe informações sobre os grupos de colunas configurados para detecção e resolução automáticas de conflitos do Oracle GoldenGate.

Você pode configurar a detecção e a resolução automáticas de conflitos do Oracle GoldenGate usando o procedimento ADD_AUTO_CDR no pacote DBMS_GOLDENGATE_ADM. Você pode configurar grupos de colunas usando o procedimento ADD_AUTO_CDR_COLUMN_GROUP no pacote DBMS_GOLDENGATE_ADM.

  1. Estabeleça conexão com o banco de dados como um administrador do Oracle GoldenGate.

  2. Consulte a exibição ALL_GG_AUTO_CDR_COLUMN_GROUPS.

Exemplo 9-35 Exibindo Informações Sobre Grupos de Colunas

Esta consulta exibe as seguintes informações sobre as tabelas configuradas para detecção e resolução de conflitos:

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN COLUMN_GROUP_NAME FORMAT A20
COLUMN RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME,
       COLUMN_GROUP_NAME,
       RESOLUTION_COLUMN
  FROM ALL_GG_AUTO_CDR_COLUMN_GROUPS
  ORDER BY TABLE_OWNER, TABLE_NAME;

A saída é semelhante à seguinte:

TABLE_OWNER     TABLE_NAME      COLUMN_GROUP_NAME    RESOLUTION_COLUMN
--------------- --------------- -------------------- -------------------------
HR              EMPLOYEES       COMPENSATION_CG      CDRTS$COMPENSATION_CG
HR              EMPLOYEES       JOB_IDENTIFIER_CG    CDRTS$JOB_IDENTIFIER_CG