Mostrando postagens com marcador GG. Mostrar todas as postagens
Mostrando postagens com marcador GG. Mostrar todas as postagens

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

domingo, 4 de maio de 2014

Oracle Goldengate - Parte 4


Jovens

Agora sim. Vamos configurar o EXTRACT e o DATA PUMP.

Prometo, sem enrolação hoje.

Se quiser lembrar onde estamos. Veja aqui [1] e aqui [2] e aqui também [3].

Sem delongas, vamos ao que interessa.

Os procedimentos abaixo devem ser feitos no SOURCE e no TARGET.

1) Criação dos subdiretórios do GoldenGate - Ir até o GG_HOME.

   
cd $GG_HOME
    ./ggsci

    GGSCI (mario) 1> create subdirs

    Creating subdirectories under current directory /oracle/oradata/QSP/gg11

    Parameter files                /oracle/oradata/QSP/gg11/dirprm: already exists
    Report files                   /oracle/oradata/QSP/gg11/dirrpt: created
    Checkpoint files               /oracle/oradata/QSP/gg11/dirchk: created
    Process status files           /oracle/oradata/QSP/gg11/dirpcs: created
    SQL script files               /oracle/oradata/QSP/gg11/dirsql: created
    Database definitions files     /oracle/oradata/QSP/gg11/dirdef: created
    Extract data files             /oracle/oradata/QSP/gg11/dirdat: created
    Temporary files                /oracle/oradata/QSP/gg11/dirtmp: created
    Stdout files                   /oracle/oradata/QSP/gg11/dirout: created

2) Configuração da porta de comunicação do MANAGER.
Lembre-se que o MANAGER deve estar no ar antes de começarmos os procesoss de EXTRACT/REPLICAT.
       
        -- SOmente mostrando o status do MANAGER no momento
        GGSCI (mario) 1> info all
        Program     Status      Group       Lag at Chkpt  Time Since Chkpt
        MANAGER     STOPPED

        -- Vamos editar o arquivo de parâmetros do MANAGER
        GGSCI (mario) 1> edit params mgr
       
        Incluir a linha abaixo:   
        PORT 7090
       
        Importante: Aqui pode ser a porta que quiserem. Eu escolhi essa, mas podem colocar qualquer porta. Salve a alteração.
       
        -- Vamos iniciar o MANAGEr
        GGSCI (mario) 1> start manager
        Manager started.

        GGSCI (mario) 1> info all
        Program     Status      Group       Lag at Chkpt  Time Since Chkpt
        MANAGER     RUNNING

        Importante: Não esqueça de fazer isso no TARGET. Eu espero...
       
3) Configuração do checkpointtable e trandata
       
        -- Lembra que criamos o user lá no artigo 2? Pois é, vamos usar aqui.
        GGSCI (mario) 1> dblogin userid gguser; password COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
        Successfully logged into database.

        -- Imagine que o processo de REPLICAT está replicando os dados para o TARGET, e então ocorre algo inesperado. Imaginamos que o REPLICAT vai para o status ABENDED devido a algum tipo de erro de falta de registro, por exemplo.
       
        O GoldenGate se oriente de quais operações foram replicadas de duas formas. Sempre é gravado um arquivo de controle e verificação em /dirchk . Este arquivo deve existir e se ele for removido o GoldenGate perde o controle de seus processos.
       
        Podemos também criar uma tabela de ponto de verificação (CHECKPOINT TABLE). Criar essa tabela é opcional e pode ser especificado globalmente (através do arquivo GLOBALS que não iremos utilizar nesses artigos) ou para cada processo de replicação.
       
        Quando o processo de REPLICAT é iniciado e se a tabela existe, ele não lê o arquivo de verificação e sim a tabela de ponto de verificação encontrando o ponto de recuperação e começando a reaplicar todas as transações que ocorreram logo após a parada.    
           
       
GGSCI (mario) 1> ADD CHECKPOINTTABLE gguser.checkpoint
        Successfully created checkpoint table gguser.checkpoint.

       
-- Agora vamos executar o trandata para os owner's que vamos replicar. O ADD TRANDATA permiti ao GoldenGate adquirir as informações de transação que ele precisa para replicação a partir dos registros de transações.                                             
       
        GGSCI (mario) 1> add trandata SAPSR3.*

Pessoal, tudo ok até aqui não é? Como eu escrevi antes, essa é uma maneira de ser feito. Você pode preferir não usar a CHECKPOINT TABLE. Ou criar um arquivo GLOBALS para especificar uma tabela global, enfim. Veja o que melhor te atende.
       
Agora, vamos criar o EXTRACT e DATA PUMP no SOURCE. Somente no SOURCE.       
       
4) Ainda conectado com o dblogin
    GGSCI (mario) 1> dblogin userid gguser; password COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
    Successfully logged into database.

5) Configuração do EXTRACT
   
    -- Você se lembra que fizemos um expdp/impdp com o flashback_scn? Pois bem, vamos usar o SCN para adicionar o extract a partir dele.
    GGSCI (mario) 1> ADD EXTRACT extqsp6, TRANLOG, SCN 5600816832
   
    Importante: Se você fez um export com a base fechada, aqui você pode usar um "BEGIN NOW" ao invés do SCN. Ficaria assim:
    GGSCI (mario) 1> ADD EXTRACT extqsp6, TRANLOG, BEGIN NOW
       
    -- Vamos também indicar o nosso arquivo de trail para o EXTRACT. Criaremos arquivos de 512M.
    GGSCI (mario) 1> ADD EXTTRAIL ./dirdat/sc, EXTRACT extqsp6, megabytes 512
   
    -- Agora vamos editar o arquivo de parâmetros so EXTRACT    
       
        Incluir as linhas abaixo no arquivo. Podem tirar os comentários se quiser.
       
        GGSCI (mario) 1> edit params extqsp6
           
        -- Nome do extract
        EXTRACT extqsp6
        -- Usuário e senha para as conexões
        USERID gguser, PASSWORD COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
        -- Trail File
        EXTTRAIL ./dirdat/sc
        -- Indica ao GG que uma operação de TRUNCATE deve ser replicada. Por padrão, o GG não replica truncates.
        GETTRUNCATES
        -- Usamos o DDL para ativar o suporte a DDL, filtrar as operações DDL e configurar uma ação de processamento com base em um DDL. O INCLUDE identifica o início de uma cláusula que contém critérios de filtragem que identificam o escopo DDL que este parâmetro afetará. O MAPPED mapeia o escopo da filtragem.
        DDL INCLUDE MAPPED OBJNAME SAPSR3.*
        -- Tabelas que devem ser extraídas
        TABLE SAPSR3.*;
       
        Salve o arquivo. Esse já está pronto.
       
6) Configuração do Data Pump
       
        -- Vamos fazer o add do pump
        GGSCI (mario) 1> ADD EXTRACT pumpqsp6, EXTTRAILSOURCE ./dirdat/sc, SCN 5637686564
   
        Importante: Se você quiser fazer o pump a partir de um ponto no tempo, pode também. Ficaria assim:
        GGSCI (mario) 1> add extract pumpqsp6, tranlog, begin 2014-04-15 02:00
       
        -- O ADD RMTTRAIL cria uma trilha para o processamento on-line no servidor remoto além de associar um trail a um EXTRACT.
        GGSCI (mario) 1> ADD RMTTRAIL ./dirdat/st, EXTRACT pumpqsp6, megabytes 512
               
        -- Editamos agora o parameter file
        edit params pumpqsp6
       
        -- Nome do pump
        EXTRACT pumpqsp6
       
        -- Usuário e senha para as conexões
        USERID gguser, PASSWORD COLOQUE_UMA_SENHA_DECENTE_POR_FAVOR
       
        -- Especificar o RMTHOST antes da entrada de RMTTRAIL para identificar o servidor remoto e a porta
        RMTHOST 10.193.125.59, MGRPORT 7090
       
        -- Local do trail
        RMTTRAIL ./dirdat/st
       
        -- Indica ao GG que uma operação de TRUNCATE deve ser replicada. Por padrão, o GG não replica truncates.
        GETTRUNCATES
       
        -- Tabelas que devem ser extraídas
        TABLE SAPSR3.*;
       
7) É isso ai. Agora vamos iniciar os dois
    GGSCI (mario) 1> start extract extqsp6
    GGSCI (mario) 1> start extract pumpqsp6
       
8) E listar e ver se está tudo no ar
   
    GGSCI (mario) 1> status manager
    Manager is running (IP port mario.7090).
   
    GGSCI (mario) 1> info all
    Program     Status      Group       Lag           Time Since Chkpt
    MANAGER     RUNNING
    EXTRACT     RUNNING     extqsp6     00:00:00      00:00:09
    EXTRACT     RUNNING     pumpqsp6    00:00:00      00:00:09
   
    Importante: Para uma informação um pouco mais detalhada:
    info extract extqsp6, detail
    info extract pumpqsp6, detail
   
   
    Além de ver o log:
    cd $GG_HOME
    tail -f ggserr.log
   
    ou
   
    GGSCI (mario) 1> VIEW GGSEVT


Agora, vamos criar o REPLICAT no TARGET. Somente no TARGET.       

1) Login, como já feito antes.   
    GGSCI (mario) 1> dblogin userid gguser; password gguserquero

2)     Vamos fazer o add do replicat
    GGSCI (mario) 1> add replicat repqsp6, exttrail ./dirdat/st, CHECKPOINTTABLE GGUSER.checkpoint
   
    Importante: Aqui, se você sabe o momento que deve iniciar o replicat, melhor definir uma data e hora.
    GGSCI (mario) 1> add replicat  repqsp6, ExtTrail ./dirdat/rb, Begin 2014-05-04 03:50:00
   
    -- Editamos agora o parameter file
    edit params repqsp6
   
    -- Nome do replicat
    REPLICAT repqsp6
   
    -- Quando os objetos de origem e destino especificados na instrução MAP têm estrutura exatamente igual. Quando as tabelas de origem e de destino têm estruturas diferentes, devemos criar um arquivo de definições de dados para o objeto de origem e especificar as definições do arquivo com o parâmetro SOURCEDEFS.
    ASSUMETARGETDEFS
   
    -- Muito cuidado aqui jovem. Use as HANDLECOLLISIONS para controlar registros duplicados. Essas duplicidades chamadas de colisões, ocorrem durante uma carga inicial, por exemplo. Quando os dados de tabelas de origem estão sendo carregados e o Oracle GoldenGate está extraindo as alterações transacionais que estão sendo feitas nas tabelas. Quando o GG replicar as alterações após a carga inicial, o HANDLECOLLISIONS fornece ao Replicat uma lógica de tratamento de erros para essas colisões.
    HANDLECOLLISIONS
   
    -- Usuário e senha para as conexões
    USERID gguser, PASSWORD gguserquero
   
    -- Indica ao GG que uma operação de TRUNCATE deve ser replicada. Por padrão, o GG não replica truncates.
    GETTRUNCATES
   
    -- Mapeamento das tabelas de origem e destino
    MAP SAPSR3.*, TARGET SAPSR3.*;
   
    -- Suporte a ddl
    DDL INCLUDE ALL

    -- Aqui vamos ignorar todos os erros, sem tentar novas tentativas de replicação (RETRYOP). Existem várias formas de tratamento desses erros, aqui somente para exemplo, vamos nesse mais genérico. Você pode usar várias instâncias do DDLERROR no mesmo arquivo de parâmetros para lidar com todos os erros que estão previstos.
    DDLERROR DEFAULT IGNORE RETRYOP

3) Agora jovem, basta iniciar...
    start replicat repqsp6, aftercsn 5600816832
   
4) E verificar.
    GGSCI (mario) 1> info all
    Program     Status      Group       Lag           Time Since Chkpt
    MANAGER     RUNNING
    REPLICAT    RUNNING     repqsp6     00:00:00      00:00:19

    -- Um pouco mais detalhado
    stats REPLICAT repqsp6, total, hourly, reportrate min   
    stats REPLICAT repqsp6, total, hourly, table ., reportrate min

   
Ahhhhhhhhhhhhhhhhhhhh meu amigo, estou sentindo a replicação acontecendo.

Se chegamos até aqui é porque conseguimos!!!! Agora é só partir para os testes. Crie tabelas, insira dados, delete, atualize e

Se deu algum erro, repasse os passos. Lembre-se, esse é um cenário específico para as necessidades de um cliente. Pode ser que você precise fazer algum acerto.

Procure nos manuais da Oracle outras opções, veja outros blogs, corra atrás. É muito legal.

Abraço
Mario
   


Postagem em destaque

[ORACLE] Useful scripts for the day-to-day life of a DBA (Part 3) - System metrics

Hello everyone.   Hope you're doing well! As I said here , I've created a repository on GITHUB to share some scripts that I like t...