terça-feira, 1 de abril de 2014

Oracle GoldenGate - Parte 1



Bom dia Jovens

Nos últimos tempos ganhei uma oportunidade de trabalhar com o Oracle Goldengate.


Ahhh, que bacana!!!!! Ops, mas espera ai. O que é o Oracle Goldengate mesmo?

Óteeeeemaaaaa pergunta jovem...

Bem rapidamente e bem a grosso modo o Oracle GG é uma ferramenta para captura/replicação de dados em tempo real.

Hummmm, legal.. Mas só isso?

Nananinanão.. Ele faz essa replicação entre sistemas de SGBD diferentes, de versões diferentes, plataformas diferentes, tudo diferente...

Agora sim, interessou né?

Se você precisa replicar um SQLSERVER para Oracle, pode. Um MySQL para Oracle, pode também. E um Oracle para Oracle em SO’s e versões diferentes. É claro que pode meu filho.

E se você não quer replicar e sim migrar uma base de um servidor antigo para um novo, sem parada com versões diferentes, SO diferente. Adivinha se pode? Lógico que pode.

Ou seja, podemos replicar/migrar dados entre bases heterogêneas, sem downtime, sem nada.

Na verdade esse produto não foi desenvolvido pela Oracle. Ele faz parte de uma das várias aquisições realizadas nos últimos anos.

Essa é uma explicação realmente simples perante o poder dessa ferramenta. Você consegue muitas informações sobre como o GG funciona e todo o seu potencial:


Antes de começar, é bom que tenhamos pelo menos algum conceito de alguns processos do GG. Lembrando que isso é apenas um overview de um processo específico.

Existem N maneiras de fazer uma replicação com o GG e tudo depende do que você tem como requisitos do trabalho, limitações de espaço, o que o seu cliente quer.

Primeiro, a figura clássica: Como o GG funciona.




Entendeu tudo né. Nem precisamos continuar. AHAHAHHAHA...

Agora sim, os processos que eu acho bacana que você conheça antes de sair tentando replicar os dados por ai:

Processo Manager: esse cara faz um monitoramento dos processos do GG, ou seja, é o processo pai do GG. Ele que faz toda a gestão dos processos e arquivos gerados pelo GG. Antes de criar/iniciar  os processos de Extract e Replicat, esse cara deve estar no ar.

Extract: Como o próprio nome diz, ele extrai/captura os dados e DDL do Source database. Essa extração captura os registros de dados completos ou as alterações desses dados, dependendo das configurações e envia os dados para um trail file..

Data Pump: Não jovem, não confunda com o datapump (expdp/impdp). Esse processo envia os trail's para o target database. Se um processo data Pump não é usado (sim ele é opcional), o extract deve enviar as operações capturadas para um trail file diretamente no Target. No entanto, caso ele exista, o extract cria o trail file  no source. O Data Pump lê este trail e envia as operações através da rede para um trail no Target.

Trails files: É o resultado da extração dos dados do source. Ou seja, tudo o que o extract "pegou", ele vai gravar nesses arquivos que serão utilizados para replicar os dados. São armazenados no disco local temporariamente (caso feito via data pump) até que tenha sido aplicado ao local de destino.

Initial load: Na verdade pode ou não ser um processo realizado pelo GG. Mas coloquei aqui pois de uma forma ou de outra teremos que realizar essa atividade. É a carga inicial dos dados – ou da estrutura da instance no target. Como eu disse, ele pode ser feito via GG (testei e não gostei), ou via um expdp/impdp, rman, etc. Fiz via expdp com flashback_scn e foi o que eu mais gostei.De uma base de 900G, diga-se.

Replicat: Ele replica as informações no lado do target. Esse processo faz a leitura dos trail's enviados pelo datapump do source e faz a replicação.

Checkpoint: Armazenam as posições atuais de leitura/escrita de um processo para fins de recuperação. Esses ceckpoint's garantem que as alterações de dados que estão marcadas para sincronização realmente serão capturados pelo extract e que serão aplicados pelo replicat no target. Além disso ele fornece uma tolerância a falhas, impedindo a perda de dados caso o sistema, a rede, ou um processo do Oracle GoldenGate precise ser reiniciado.

Gente, novamente lembrando antes de continuar: os processos são muito mais completos e complexos do que dito acima. Isso é o resumo de muitas páginas de documentação em 3 ou 4 linhas.



Vou dividir isso em alguns artigos para não ficar chato. 

E lembre-se, eu também estou estudando o GG. Mas como eu sou metido, resolvi compartilhar o pouco que eu sei. Caso tenha alguma barbaridade ai, não se acanhe em apontar.

Alguns sites legais que eu consultei, além da documentação é claro:

http://satya-dba.blogspot.com.br/2012/02/ggsci-goldengate-command-interpreter.html
http://www.juliandyke.com/Blog/?p=301
https://blogs.oracle.com/imc/entry/oracle_goldengate_configuring_ddl_replication
http://www.juliandyke.com/Blog/?p=387
http://jianmingli.com/wp/?p=1532
http://www.profissionaloracle.com.br/gpo/artigo/banco-de-dados/53-golden-gate-instalacao-e-configuracao
http://flaviosoares.com/2011-05/goldengate-bidirecional-oracle-para-oracle/
http://http://gavinsoorma.com


Blogs ótimos que ajudaram demais. Podem ver que tem gente brazuca ai no meio. Visitem essas fontes, não só para o GG. Vale muito a pena.

E não podia esquecer de agradecer um cara que nem me conhece pessoalmente e que me ajudou demais, gente fina mesmo. Quem me "apresentou" a ele foi a Lilian Barroso (http://lilianbarroso.wordpress.com/). Régis Araujo, abraço e obrigado pela ajuda. Obrigado a Lilian também.

Até té té... 

Abraço
Mario

quinta-feira, 20 de junho de 2013

Backup RMAN - Alguns scripts

Boa tarde jovens.

Vou postar aqui um script de backup (e suas variações) que está mais que testado e que me ajuda bastante quando preciso fazer algo rápido e manual.

==================
-- Backup
==================
rman target / << EOF
run {
    allocate channel d1 type disk MAXPIECESIZE 8G;
    SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
    SQL 'ALTER SYSTEM CHECKPOINT';
    backup AS COMPRESSED BACKUPSET format '/backups/PROD/%d_%Y%M%D_%I_%s_%U.dat' database;
    sql 'alter system archive log current';
    backup AS COMPRESSED BACKUPSET format '/backups/PROD/%d_%Y%M%D_%I_%s_%U.dat' archivelog all;
    release channel d1;
}
exit;
EOF


==================
-- Backup deletando archives e backupsets
==================
rman target / <

run {
    allocate channel d1 type disk MAXPIECESIZE 8G;
    SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
    SQL 'ALTER SYSTEM CHECKPOINT';
    backup AS COMPRESSED BACKUPSET format '/backups/PROD/%d_%Y%M%D_%I_%s_%U.dat' database;
    sql 'alter system archive log current';
    backup AS COMPRESSED BACKUPSET format '/backups/PROD/%d_%Y%M%D_%I_%s_%U.dat' archivelog all;
    DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-5';
    DELETE NOPROMPT OBSOLETE DEVICE TYPE DISK;
    release channel d1;
}
exit;
EOF

========================
-- Backup somente de archives
========================
rman target / <

run {
    allocate channel d1 type disk MAXPIECESIZE 8G;
    SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
    SQL 'ALTER SYSTEM CHECKPOINT';
    backup AS COMPRESSED BACKUPSET format '/backups/PROD/%d_%Y%M%D_%I_%s_%U.dat' archivelog all;
    release channel d1;
}
exit;
EOF

Simples e objetivo caso precise rodar algo manualmente.

Abraço
Mario

Formatação de nome de backuppieces do RMAN

Olá pessoal.

Mais uma da séria "Vou postar aqui para não precisar pesquisar depois".

Strings utilizadas para identificar um backuppeace no RMAN.

Syntax:
  %c  The copy number of the backup piece within a set of duplexed backup pieces. If you did not duplex a backup, then this variable is 1 for backup sets and 0 for proxy copies. If one of these commands is enabled, then the variable shows the copy number. The maximum value for %c is 256.

  %d  The name of the database.

  %D  The current day of the month (in format DD)

  %F  Combination of DBID, day, month, year, and sequence into a unique and repeatable generated name.

  %M  The month (format MM)

  %n  The name of the database, padded on the right with x characters to a total length of eight characters. (AKA: Porn star alias name). For example, if the scott is the database name, %n= scottxxx.

  %p  The piece number within the backup set. This value starts at 1 for each backup set and is incremented by 1 as each backup piece is created. Note: If you specify PROXY, then the %p variable must be included in the FORMAT string either explicitly or implicitly within %U.

  %s  The backup set number. This number is a counter in the control file that is incremented for each backup set. The counter value starts at 1 and is unique for the lifetime of the control file. If you restore a backup         control file, then duplicate values can result. Also, CREATE CONTROLFILE initializes the counter back to 1.

  %t  The backup set time stamp, which is a 4-byte value derived as the number of seconds elapsed since a fixed reference time. The combination of %s and %t can be used to form a unique name for  the backup set.

  %T  The year, month, and day (YYYYMMDD)

  %u  An 8-character name constituted by compressed representations of the backup set number and the time the backup set was created.

  %U  A convenient shorthand for %u_%p_%c that guarantees uniqueness in generated backup filenames.
      If you do not specify a format, RMAN uses %U by default.

  %Y  The year (YYYY)

  %%  Specifies the '%' character. e.g. %%Y translates to %Y.

Eu geralmente utilizo: %d_%Y%M%D_%I_%s_%U.rman

Abraço
Mario

quinta-feira, 7 de junho de 2012

Problemas em clonagem EBS R12 - FNDCPASS

Boa noite jovens

Essa semana estava realizando um clone de um EBS R12 e ocorria sempre o erro abaixo na clonagem da aplicação.

Quem trabalha com EBS sabe que é normal termos vários clones em uma mesma máquina. E isso estava me atrapalhando...

O erro:
---------------------------------------------------------------
                   ADX Database Utility
---------------------------------------------------------------
getConnectionUsingAppsJDBCConnector() -->
    APPS_JDBC_URL='null'
    Trying to get connection using SID based connect descriptor
getConnection() -->
    sDbHost    : SERVIDOR
    sDbDomain  : zezinho.com.br
    sDbPort    : 1532
    sDbSid     : ERP
    sDbUser    : apps
    Trying to connect using SID...
getConnectionUsingSID() -->
    JDBC URL: jdbc:oracle:thin:@SERVIDOR.zezinho.com.br:1532:ERP
    Exception occurred: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    Trying to connect using SID as ServiceName
getConnectionUsingServiceName() -->
    JDBC URL: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SERVIDOR.zezinho.com.br)(PORT=1532))(CONNECT_DATA=(SERVICE_NAME=ERP)))
    Exception occurred: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    Trying to connect using SID as ServiceName.DomainName
getConnectionUsingServiceName() -->
    JDBC URL: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SERVIDOR.zezinho.com.br)(PORT=1532))(CONNECT_DATA=(SERVICE_NAME=ERP.zezinho.com.br)))
    Exception occurred: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
    Connection could not be obtained; returning null

-------------------ADX Database Utility Finished---------------
RC-00118: Error occurred during creation of database
Raised by oracle.apps.ad.clone.ApplyDatabase

Depois de pesquisar e verificar N possibilidades, a resolução do problema chegou a ser infantil mas que me fez perder algumas horas preciosas.

A solução: Simples, alterar o owner e direitos do arquivo abaixo:
cd /var/tmp/
chown oraerp:dba .oracle
chmod 777 .oracle

Achei legal passar isso aqui.

Passado esse problema, me deparo com outro problema na hora de fazer a alteração de senha do APPS pelo FNDCPASS. O comando executado era:
 
FNDCPASS apps/pass 0 Y system/pass SYSTEM APPLSYS newpass

Erro: Na verdade foram vários erros, mas o mais normal era esse:
    APP-FND-02704: Unable to alter user XXINT to change password.
    APP-FND-01564: ORACLE error 1403 in changepassword
    Cause: changepassword failed due to ORA-01403: no data found.
   
O problema é que tudo o que eu achei sobre esse erro não funcionou. Depois de muito verificar encontrei o erro.

No momento da clonagem (Aplicação e Banco), ao responder a pergunta abaixo eu errei e coloquei o nome do servidor com o domínio:

Target System Hostname (virtual or normal) [SERVIDOR] : SERVIDOR.zezinho.com.br

Isso fez com que o meu GLOBAL_NAME ficasse como ERP.zezinho.com.br. Não havia percebido ainda, mas a coluna NODE dos meus concurrent's também estavam todos detonados...

Enfim, para corrigir foi simples também:
    Alterei o meu global_name
    Executei FND_CONC_CLONE.SETUP_CLEAN para acertar o nome dos nodes dos concurrents
    Mandei um AUTOCONFIG na base e na aplicação
   
Pronto, tudo certo...

Abraço

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...