sábado, 5 de novembro de 2016

sexta-feira, 4 de novembro de 2016

Replicação de dados - GoldenGate

Olá pessoal, como  estão?

Espero que todos estejam muito bem.

Eu já publiquei uma série de artigos de GoldenGate a algum tempo atrás - Parte 1Parte 2Parte 3 e Parte 4.

Só que lá, confesso, o texto ficou um pouco grande e também muito pulverizado. 

Outro ponto é que a instalação era feita via linha de comando, enfim, chegou o momento de fazer algo mais direto.

Não vou detalhar comando a comando, acho desnecessário. 

Mas os nomes e processos são bem intuitivos, então basta dar uma olhada nos manuais aqui que você será feliz, tenho certeza.

Vamos começar.

====================================================================
-- Versões e downloads
====================================================================
- Sistema Operacional: Oracle Linux 6.5
- Bases de dados: GGPRD e GGCOPY
- Versão do Oracle: 11.2.0.4
- Versão do GG: 12.2.0.1.1
- Usuário do GG: dbagate           Senha: aaa123
- Usuário a ser replicado: SCOTT   Senha: aaa123
- Download do GG: Aqui

Nosso instalador, ficará nesse local: /home/oracle/GoldenGate

====================================================================
-- Instalação do GG (SOURCE e TARGET)
====================================================================
1) Criar o GG_HOME.

    mkdir -p /oracle/app/oracle/product/11.2.0/gghome

2) Descompactar o instalador e iniciar a instalação

    cd /home/oracle/GoldenGate 
    unzip fbo_ggs_Linux_x64_shiphome.zip

    cd /home/oracle/GoldenGate/fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller

Abaixo a sequência de telas da instalação:






3) Adicionar o GG_HOME ao bash_profile

    cd ~
    vi .bash_profile
    GG_HOME=/oracle/app/oracle/product/11.2.0/gghome 

4) Agora é só testar a instalação
     
    cd $GG_HOME
    ./ggsci

   Oracle GoldenGate Command Interpreter for Oracle
   Version 12.2.0.1.1 OGGCORE_12.2.0.1.0_PLATFORMS_151211.1401_FBO
   Linux, x64, 64bit (optimized), Oracle 12c on Dec 12 2015 02:56:48
   Operating system character set identified as UTF-8.
   Copyright (C) 1995, 2015, Oracle and/or its affiliates. All 
   rights reserved.

   GGSCI (rac12c1) 2> info all
   Program    Status      Group       Lag at Chkpt  Time Since Chkpt
   MANAGER    RUNNING
     
5) Caso seja necessário, alterar a porta do manager

    GGSCI (rac12c1) 3> stop manager
    edit params mgr
PORT 7889
    start manager

====================================================================
-- Preparação das bases (SOURCE e TARGET)
====================================================================

1) Pré-requisitos que devem ser configurados

   ALTER DATABASE FORCE LOGGING;
   ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
   ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=SPFILE;
   ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;
   ALTER SYSTEM SET STREAMS_POOL_SIZE=256M SCOPE=SPFILE;
   SHUTDOWN IMMEDIATE;
   STARTUP;

   SELECT SUPPLEMENTAL_LOG_DATA_MIN,LOG_MODE FROM V$DATABASE;

Importante: as bases devem estar em modo Archive.

2) Criar user, tablespace para o GG e liberar os grant's

-- GGPRD CREATE TABLESPACE GGATE datafile '/u01/oradata/ggprd/ggate01.dbf' SIZE 1G AUTOEXTEND on NEXT 512M maxsize 8G; -- GGCOPY CREATE TABLESPACE GGATE datafile '/u01/oradata/ggcopy/ggate01.dbf' SIZE 1G AUTOEXTEND on NEXT 512M maxsize 8G; CREATE USER DBAGATE IDENTIFIED BY aaa123 DEFAULT TABLESPACE GGATE TEMPORARY TABLESPACE TEMP; GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO DBAGATE; GRANT EXECUTE ON UTL_FILE TO DBAGATE; GRANT DBA TO dbagate; GRANT SELECT ANY DICTIONARY TO dbagate; GRANT EXECUTE ON dbms_flashback TO dbagate; 

3) Criar a estrutura interna do GG. Para isso, devemos estar no diretório do HOME_GATE

    cd $GGHOME

    @marker_setup.sql
Enter Oracle GoldenGate schema name: dbagate

    @ddl_setup.sql
Enter Oracle GoldenGate schema name: dbagate

    @role_setup.sql
Enter GoldenGate schema name: dbagate

Liberar o GRANT para o user do GG
GRANT GGS_GGSUSER_ROLE TO dbagate

    @ddl_enable.sql

4) Criar os diretórios

    ./ggsci

    GGSCI (rac12c1) 4> create subdirs

5) Preparando a tabela de checkpoint e registrando as informações do schema a ser replicado

    GGSCI (rac12c1) 5> EDIT PARAMS ./GLOBALS
    GGSCI (rac12c1) 6> GGSCHEMA DBAGATE
    GGSCI (rac12c1) 7> CHECKPOINTTABLE DBAGATE.checkpoint

    -- Precisamos estar logados com o dbagate nesse ponto
    GGSCI (rac12c1) 8> DBLOGIN USERID dbagate, PASSWORD aaa123

    GGSCI (rac12c1) 9>  ADD CHECKPOINTTABLE dbagate.checkpoint

    GGSCI (rac12c1) 10> ADD SCHEMATRANDATA scott ALLCOLS

============================================================
Somente no source
=============================================================

1) Configurar o extract. Ele é responsável pela extração dos dados que serão replicados e vai gerar os trailfiles localmente.

    GGSCI (rac12c1) 1> dblogin userid dbagate, password aaa123
    
    GGSCI (rac12c1) 2> add extract extract1, tranlog, begin now

    GGSCI (rac12c1) 3> 
    add exttrail /oracle/app/oracle/product/11.2.0/gghome/dirdat/lt, extract extract1, megabytes 50

    GGSCI (rac12c1) 4> 
    add rmttrail /oracle/app/oracle/product/11.2.0/gghome/dirdat/rt, extract extract1, megabytes 50
    
    GGSCI (rac12c1) 5> edit params extract1
    extract extract1
    userid dbagate@GGPRD, password aaa123
    EXTTRAIL /oracle/app/oracle/product/11.2.0/gghome/dirdat/lt
    TRANLOGOPTIONS EXCLUDEUSER DBAGATE
    GETTRUNCATES
    ddl include mapped objname scott.*;
    table SCOTT.*;


    GGSCI (rac12c1) 6> info extract extract1, detail

2) Configurar o datapump. Ele é responsável pela envio dos trailfiles para o servidor remoto.

    GGSCI (rac12c1) 7> ADD EXTRACT dtpump1, EXTTRAILSOURCE /oracle/app/oracle/product/11.2.0/gghome/dirdat/lt, BEGIN now

    GGSCI (rac12c1) 8> 
    ADD RMTTRAIL /oracle/app/oracle/product/11.2.0/gghome/dirdat/rt, EXTRACT dtpump1, megabytes 50

    GGSCI (rac12c1) 9> edit params dtpump1
    EXTRACT dtpump1
    RMTHOST 192.168.1.32, mgrport 7809
    RMTTRAIL /oracle/app/oracle/product/11.2.0/gghome/dirdat/rt
    PASSTHRU
    GETTRUNCATES
    TABLE SCOTT.*;


    GGSCI (rac12c1) 10> info all

============================================================
Somente no target
=============================================================
1) Adicionar o replicat

    ./ggsci
    
    GGSCI (rac12c2) 1> dblogin userid dbagate; password aaa123

    GGSCI (rac12c2) 2> add replicat replic1, exttrail /oracle/app/oracle/product/11.2.0/gghome/dirdat/rt, begin now, CHECKPOINTTABLE dbagate.checkpoint, 

    GGSCI (rac12c2) 3> edit params replic1
    REPLICAT replic1
    ASSUMETARGETDEFS
    GETTRUNCATES
    HANDLECOLLISIONS
    USERID dbagate, PASSWORD aaa123
    discardfile /oracle/app/oracle/product/11.2.0/gghome/dircrd/replic1_discard.txt, append, megabytes 50
    MAP SCOTT.*, TARGET SCOTT.*;
    DDL INCLUDE ALL
    DDLERROR DEFAULT IGNORE RETRYOP MAXRETRIES 10 RETRYDELAY 30 


    GGSCI (rac12c2) 4> info all

============================================================
Iniciar os serviços do SOURCE
=============================================================

    ./ggsci

    GGSCI (rac12c1) 1> dblogin userid dbagate; password aaa123




    GGSCI (rac12c1) 2> start er *

    GGSCI (rac12c1) 3> info all

    GGSCI (rac12c1) 4> info extract extract1, detail

    GGSCI (rac12c1) 5> info extract dtpump1, detail


    GGSCI (rac12c1) 6> stats extract extract1

============================================================
Migrar o schema do source para o target - INITIAL LOAD
=============================================================

Nesse ponto iremos executar a carga inicial (INITIAL LOAD) no target. 

Essa etapa pode ser feita de várias formas. Poderíamos somente criar a estrutura de tabelas no target e fazer um INITIAL LOAD via GoldenGate mesmo. Ou fazer via EXPDP/IMPDP.

Eu prefiro sempre fazer via EXPDP/IMPDP. Então é essa forma que vamos utilizar.

1) Identificando o scn

    SELECT TO_CHAR(CURRENT_SCN) FROM V$DATABASE;

    No nosso exemplo, o SCN sera esse: 970349

2) Executar o EXPDP com FLASHBACK_SCN no source

    expdp \"/ as sysdba\" directory=EXPDP_DIR DUMPFILE=SCOTT_%U.dmp LOGFILE=scott.log owner=scott filesize=8192m  FLASHBACK_SCN=970349



3) Realizar o IMPDP no target
    impdp \"/ as sysdba\" directory=EXPDP_DIR dumpfile=SCOTT_1.dmp logfile=impdp.log SCHEMAS='SCOTT'

============================================================
Somente no target
=============================================================
1) Iniciar o replicat. Esse processo é o responsável por ler e aplicar os trailfiles enviados pelo processo datapump do source.

    ./ggsci

    GGSCI (rac12c2) 1> dblogin userid dbagate; password aaa123

    GGSCI (rac12c2) 2> start er *

    Importante:
    Caso queira iniciar a partir do SCN (eu acho mais seguro)
    GGSCI (rac12c2) 2> start replicat replic1, ATCSN 970349

    GGSCI (rac12c2) 3> info all

    GGSCI (rac12c2) 4> info replicat replic1, detail


    GGSCI (rac12c2) 5> stats REPLICAT replic1, total, hourly, reportrate min    

Agora meus queridos, basta executar os testes na origem e ver a mágica acontecer no destino.

Lembre-se que esse é um cenário simples, porém um cenário maior acaba seguindo os mesmos passos. Consulte o manual, são opções diversas para replicação.

Espero que gostem.

Abraço
Mario

Postagem em destaque

[ORACLE] Quick tips: Autonomous Health Framework (AHF) files cleanup.

Hello everyone.   How are you doing?   Today, I going to show you a quick tip about the AHF - Autonomous Health Framework.   In case your au...