top of page

Implementando replicação unidirecional no Oracle GoldenGate - Parte 2

Atualizado: 25 de jun. de 2023

No artigo anterior (clique aqui para ler) implementamos as etapas de preparação dos banco de dados, criamos os usuários de banco de dados do Oracle GoldenGate e fizemos a configuração de alguns parametros.


Agora daremos a continuação executando o método initial load para transferir o esquema HR do banco de origem para o banco de destino.

replicação unidirecional oracle goldengate

Neste artigo, irei abordar o método de replicação conhecido como "File to Replicat". Este método envolve o processo Extract, que captura os dados de origem e os armazena no trail. Em seguida, o Replicat lê os dados desses arquivos e os aplica no banco de dados de destino. É importante ressaltar que existem outros métodos de replicação disponíveis mas não serão tratados neste momento.

 

1. Criar schema no banco de destino (db2)


Ao criar o banco de dados de destino, intencionalmente não selecionei a opção para criar o conjunto de exemplos. Portanto, o esquema HR e o espaço da tabela não existem no banco de dados de destino. Agora, vamos proceder criando um novo esquema chamado HRTRG no banco de dados de destino, que será responsável pelas tabelas replicadas do esquema HR no banco de dados de origem.

sqlplus / as sysdba

create user hrtrg identified by oracle 
default tablespace users 
quota unlimited on users;

grant connect, resource to hrtrg;
create user hrtrg identified by oracle  default tablespace users  quota unlimited on users;

Adicione um título para cada etapa da sua receita. Os títulos chamam a atenção dos leitores e os mantêm na página. Divida o processo em etapas curtas e claras.


2. Criar e preparar os metadados do conjunto de dados de destino


Agora vou preparar a estrutura de dados do conjunto de dados de destino para que possamos sincronizar as alterações. Essa preparação envolve desativar as constraints, desabilitar as triggers e remover os índices. Neste caso, estamos assumindo que a estrutura de dados do conjunto de dados de destino é idêntica à estrutura do conjunto de dados de origem. Você pode usar qualquer ferramenta ou método para obter os metadados do banco de dados de origem e transferi-los para o banco de dados de destino. No meu caso, vou utilizar o Data Pump Import para exportar os metadados das tabelas específicas do esquema HR no banco de dados db1 e importá-los para o esquema HRTRG no banco de dados db2, online, utilizando um link de banco de dados.

create public database link db1link 
connect to system 
identified by oracle 
using '(DESCRIPTION=(ADDRESS = (PROTOCOL = TCP)(HOST = ggsrv1) (PORT=1521))
(connect_data=(service_name= db1)))';

select sysdate from dual@db1link;
create public database link db1link  connect to system  identified by oracle  using '(DESCRIPTION=(ADDRESS = (PROTOCOL = TCP)(HOST = ggsrv1) (PORT=1521)) (connect_data=(service_name= db1)))';

No diretório /u01, crie um diretório chamado "manobra" e em seguida crie um directory apontando para ele.

!mkdir -p /u01/manobra
create directory gg_dir as '/u01/manobra';
grant read, write on directory gg_dir to system;
create directory gg_dir as '/u01/manobra';

Usando o utilitário Data Pump vou fazer um import remoto usando o dblink que acabei de criar. Veja que utilizo o parametro remap_schema e ele irá automaticamente substituir do schema hr para o hrtrg, remap_tablespace também irá mapear para o tablespace users.


Navegue até o diretório /u01/manobra e crie o arquivo parfile e adicione os parâmetros conforme abaixo:

cd /u01/manobra

vi impdp_hr.par

-- adicione os parametros
system/oracle@db2 
directory=gg_dir 
schemas=hr 
remap_schema=hr:hrtrg
remap_tablespace=example:users 
logfile=hr_db1.log 
content=METADATA_ONLY
network_link=db1link

-- execute o utilitário
impdp parfile=impdp_hr.par
impdp arquivo parfile

Veja que os objetos foram criados mas os dados não foram importados.

select count tabela
select count tabela

Quando a replicação de carga inicial insere os dados, o banco de dados de destino pode rejeitar algumas operações de inserção porque eles violam as restrições. Vamos desabilitar as restrições durante o carregamento inicial e habilitar após o término do carregamento inicial.

SET SERVEROUTPUT ON
exec DBMS_OUTPUT.ENABLE(1000)
DECLARE
V_SCHEMA VARCHAR2(10) := 'HRTRG';
V_SQL VARCHAR2(32000);
CURSOR c_DisableConstraints IS
SELECT 'alter table '|| OWNER|| '.' ||TABLE_NAME||' disable constraint
'||CONSTRAINT_NAME||' cascade' sqlstatement, TABLE_NAME, CONSTRAINT_NAME
FROM DBA_CONSTRAINTS WHERE OWNER= V_SCHEMA
AND TABLE_NAME IN (
'JOB_HISTORY','EMPLOYEES','JOBS','DEPARTMENTS','LOCATIONS','REGIONS')
ORDER BY TABLE_NAME, CONSTRAINT_NAME;
BEGIN
FOR r IN c_DisableConstraints LOOP
BEGIN
 V_SQL := r.sqlstatement;
 EXECUTE IMMEDIATE (V_SQL);
 DBMS_OUTPUT.PUT_LINE('Constraints desabilitadas ' || R.TABLE_NAME ||'-' || R.CONSTRAINT_NAME);
EXCEPTION
 WHEN OTHERS THEN
 DBMS_OUTPUT.PUT_LINE('FAILED: ' || V_SQL);
END ;
END LOOP;
END;
/
disable constraints oracle

Desabilite as triggers

SET SERVEROUTPUT ON
DECLARE
V_SCHEMA VARCHAR2(10) := 'HRTRG';
V_SQL VARCHAR2(32000);
CURSOR c_DisableTriggers IS
SELECT 'alter trigger '|| OWNER ||'.'|| TRIGGER_NAME|| ' disable' sqlstatement,
TABLE_NAME, TRIGGER_NAME
FROM DBA_TRIGGERS WHERE OWNER= V_SCHEMA
AND TABLE_NAME IN (
'JOB_HISTORY','EMPLOYEES','JOBS','DEPARTMENTS','LOCATIONS','REGIONS')
ORDER BY TABLE_NAME;
BEGIN
FOR r IN c_DisableTriggers LOOP
BEGIN
 V_SQL := r.sqlstatement;
 EXECUTE IMMEDIATE (V_SQL);
 DBMS_OUTPUT.PUT_LINE('Triggers desabilitadas '|| R.TABLE_NAME ||'-' || R.TRIGGER_NAME);
EXCEPTION
 WHEN OTHERS THEN
 DBMS_OUTPUT.PUT_LINE('FAILED: ' || V_SQL);
END ;
END LOOP;
END;
/
disable triggers oracle

É comum remover os índices do banco de dados de destino antes de iniciar o processo de carregamento inicial. Isso acontece porque os índices podem tornar o carregamento inicial mais lento. Os índices exclusivos podem causar problemas, pois, mesmo que as restrições de chave primária sejam desativadas, os índices exclusivos ainda exigirão exclusividade. Por isso, é recomendado obter o código para recriar os índices, removê-los antes do carregamento inicial e, após a conclusão desse carregamento, criar novamente os índices.

-- backup código dos índices
SET PAGESIZE 0
SET LONG 90000
SET FEEDBACK OFF
SET ECHO OFF
SET HEADING OFF
SET LINES 100
SET LINESIZE 200
SET MARKUP HTML OFF SPOOL OFF
SET TRIMSPOOL ON
Col STATEMENT format a10000
SPOOL /home/oracle/scripts/hrtrg_cindexs.sql REPLACE
SELECT
 DBMS_METADATA.GET_DDL('INDEX',U.INDEX_NAME,'HRTRG') || ';' AS STATEMENT
FROM DBA_INDEXES U
WHERE OWNER = 'HRTRG'
 AND TABLE_NAME IN (
'JOB_HISTORY','EMPLOYEES','JOBS','DEPARTMENTS','LOCATIONS','REGIONS');
SPOOL OFF
 DBMS_METADATA.GET_DDL('INDEX',U.INDEX_NAME,'HRTRG') || ';' AS

Remova os índices.

-- drop índices
SET PAGESIZE 0
SET LONG 90000
SET FEEDBACK OFF
SET ECHO OFF
SET HEADING OFF
SET LINES 100
SET MARKUP HTML OFF SPOOL OFF
SET TRIMSPOOL ON
SPOOL /home/oracle/scripts/hrtrg_dindexs.sql REPLACE

SELECT
 'DROP INDEX HRTRG.' || INDEX_NAME || ';' AS STATEMENT
FROM DBA_INDEXES U
WHERE OWNER = 'HRTRG'
 AND TABLE_NAME IN (
'JOB_HISTORY','EMPLOYEES','JOBS','DEPARTMENTS','LOCATIONS','REGIONS');

SPOOL OFF
'DROP INDEX HRTRG.' || INDEX_NAME || ';' AS STATEMENT

3. Configurar os arquivos de parametro extract e replicat do Oracle GoldenGate


O manager deve estar iniciado em ambos os servidores.

ggsrv1

info mgr goldengate

ggsrv2

info manager goldengate

Em ggsrv1, configure o arquivo de parâmetro do extract para carga inicial.


SourceIsTable: Esse parâmetro especifica que a origem dos dados é uma tabela. Ele indica que os objetos a serem replicados são tabelas no banco de dados de origem.


USERID ogg, PASSWORD oracle: Essa linha define as credenciais de acesso ao banco de dados de origem. Aqui usaremos o nome de usuário "ogg" e a senha "oracle".


RmtHost ggsrv2, MgrPort 7810: Essa linha define o nome do servidor de destino onde os dados replicados serão enviados. O servidor é "ggsrv2" e a porta de gerenciamento é "7810".


RmtFile /u01/app/oracle/product/ogg/dirdat/initload.dat, Purge: Esse parâmetro especifica o arquivo remoto onde os dados replicados serão armazenados temporariamente antes de serem aplicados no banco de dados de destino. O arquivo "initload.dat" está localizado no caminho "/u01/app/oracle/product/ogg/dirdat/". O parâmetro "Purge" indica que os dados do arquivo remoto serão excluídos após serem aplicados.


Table: Especifica as tabelas que serão replicadas.

edit param eftrinit

-- adicione os parametros abaixo
SourceIsTable
USERID ogg, PASSWORD oracle
RmtHost ggsrv2, MgrPort 7810
RmtFile /u01/app/oracle/product/ogg/dirdat/initload.dat, Purge
Table HR.JOB_HISTORY;
Table HR.EMPLOYEES;
Table HR.JOBS;
Table HR.DEPARTMENTS;
Table HR.LOCATIONS;
Table HR.REGIONS;
edit param eftrinit

Você pode visualizar o arquivo criado em: "/u01/app/oracle/product/ogg/dirprm/eftrinit.prm"

edit param eftrinit

Nota: O Oracle GoldenGate trata as views como tabelas e, portanto, elas devem ser explicitamente excluídas.

Salve e feche o arquivo.


No ambiente de destino ggsrv2, configure o arquivo de parâmetro do initial load delivery adicionando os parâmetros abaixo:


SpecialRun: Esse comando indica que estamos realizando uma execução especial. No contexto do rftrinit, isso geralmente significa que estamos executando uma carga inicial ou uma sincronização específica.


End Runtime: Esse comando indica o fim da execução em tempo real. É usado em conjunto com o SpecialRun para indicar que a execução especial está completa.


USERID ogg, PASSWORD oracle: Essa linha define as credenciais de acesso ao banco de dados. Usuário é "ogg" e a senha é "oracle".


ExtFile ./dirdat/initload.dat: Esse parâmetro especifica o caminho e o nome do arquivo externo que contém os dados a serem carregados na replicação inicial. O arquivo "initload.dat" está localizado no diretório "./dirdat/".


Map HR.*, Target HRTRG.*;: Essa linha define o mapeamento dos objetos a serem replicados. O prefixo "HR." indica que todos os objetos no esquema "HR" serão mapeados. O prefixo "Target HRTRG." indica que esses objetos serão replicados no esquema "HRTRG" do banco de dados de destino.


edit param rftrinit
SpecialRun
End Runtime
USERID ogg, PASSWORD oracle
ExtFile ./dirdat/initload.dat
Map HR.*, Target HRTRG.*;
edit param rftrinit SpecialRun End Runtime

Você pode visualizar o arquivo criado em: "/u01/app/oracle/product/ogg/dirprm/rftrinit.prm"

edit param rftrinit SpecialRun End Runtime

4. Inicie a carga e monitore a operação


Inicie a Extração (Extract) para começar a capturar os dados do banco de dados de origem. A Extração é responsável por ler os logs de transações (redo logs) e enviar os dados para o processo de replicação.


No ggsvr1, execute no prompt de comando shell do sistema operacional o comando abaixo.


A linha de comando executa o processo extract no Oracle GoldenGate utilizando o arquivo de parâmetros "eftrinit.prm" que criamos anteriormente e gera um arquivo de relatório "eftrinit.rpt".


cd $GG_HOME
./extract paramfile dirprm/eftrinit.prm reportfile dirrpt/eftrinit.rpt
./extract paramfile dirprm/eftrinit.prm reportfile dirrpt/eftrinit.rpt

Monitore a operação da Extração para garantir que esteja funcionando corretamente e capturando os dados desejados.


Visualize o relatório da extração da carga inicial. Observe o número ded inserções no final do relatório.

./extract paramfile dirprm/eftrinit.prm reportfile dirrpt/eftrinit.rpt
./extract paramfile dirprm/eftrinit.prm reportfile dirrpt/eftrinit.rpt

Inicie o replicat para começar a aplicar os dados replicados no banco de dados de destino. O replicat é responsável por ler os dados capturados pelo extract e aplicá-los no banco de dados de destino.


No ggsvr2, inicie o processo de replicat no prompt do shell do sistema operacional.


cd $GG_HOME
./replicat paramfile dirprm/rftrinit.prm reportfile dirrpt/rftrinit.rpt
./replicat paramfile dirprm/rftrinit.prm reportfile dirrpt/rftrinit.rpt

Monitore a operação do Replicat para garantir que esteja processando as transações corretamente e replicando os dados conforme o esperado. Visualize o total de inserções no final do relatório.

./replicat paramfile dirprm/rftrinit.prm reportfile dirrpt/rftrinit.rpt
./replicat paramfile dirprm/rftrinit.prm reportfile dirrpt/rftrinit.rpt

Agora conecte em ambos databases e verifique os registros inseridos.


sqlplus system/oracle@db1
select count(*) from hr.employees;
conn system/oracle@db2
select count(*) from hrtrg.employees;
select count(*) from hr.employees;

Após a conclusão do carregamento inicial, é necessário recriar os índices que foram removidos antes do início do carregamento e reativar as constraints para garantir a integridade dos dados e habilitar as triggers.


Chegamos ao fim deste artigo, abordando apenas um dos vários métodos de carregamento disponíveis. Recomendo que você explore a documentação com atenção e experimente outras abordagens em seu ambiente de testes.


É importante ressaltar que o processo de carga inicial desempenha um papel crucial na replicação de dados, pois é durante esse estágio que os dados iniciais são transferidos do banco de dados de origem para o banco de dados de destino. Acompanhar de perto essas etapas é essencial para garantir a consistência dos dados replicados e identificar eventuais problemas que possam surgir ao longo do processo.


Agradeço a todos que acompanharam este artigo. Espero que as informações compartilhadas tenham sido úteis. Se tiver alguma dúvida, não hesite em entrar em contato comigo ou deixar um comentário.


Até a próxima e Hands on!

Post: Blog2_Post
bottom of page