Pular para o conteúdo
  • Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 6 meses atrás por Avatar photoRegis Araujo.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #106904
    Raphael Fernandes
    Participante

      Bom dia, a todos!

      Estou tendo dificuldade para fazer uma configuração de um Oracle Streams.

      A questão é a seguinte. Surgiu a necessidade de se criar uma Staging Area para um BI, e a solução adotada foi utilizar relplicação com Oracle Streams.

      Iniciei a configuração em 3 bancos (todos com Oracle EE 10.2.0.4 – 64bit, rodando em SO Windows 2003) que são minhas origens dos dados, para minha base destino (também com Oracle EE 10.2.0.4.0 – 64bit, rodando em SO Windows 2003).

      Fiz uma configuração por vez, criando um usuário administrador do streams em cada ambiente e a capture e propagation na origem e o apply no destino. Fiz um schedule para a propagation, tudo conforme script gerado pelo OEM (Oracle Enterprise Manager) versão console JAVA.

      Essa configuração está funcionando corretamente, atendendo às espectativas. Meu problema está quando precisei fazer uma configuração de streams com um outro banco Oracle (Oracle EE 11.2.0.3.0 – 64bit, rodando em SO Linux Red Hat). Meu banco de origem está no ambiente Oracle 11G e meu destino o 10G.

      Fiz a configuração desse Streams semelhante aos demais que, inclusive, estão funcionando. a única alteração foi a condição adicional: “and_condition => ‘:ddl.get_compatible() <= dbms_streams.compatible_10_2'". Alguns scripts estão abaixo: --SCRIPT EXECUTADO NO AMBIENTE DESTINO --Mesmo sendo o destino um ambiente Oracle 10G, coloquei a condição de compatibilidade. BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => ‘”INTPORTAL”.”ESCOLA”‘,
      streams_type => ‘APPLY’,
      streams_name => ‘STREAMS_APP_INTPORTAL’,
      queue_name => ‘”USER_STRMADMIN”.”STRM_QUEUE_INTPORTAL”‘,
      include_dml => true,
      include_ddl => true,
      source_database => ‘GRPROD’,
      and_condition => ‘:ddl.get_compatible() <= dbms_streams.compatible_10_2'); END; / --SCRIPTS EXECUTADOS NO AMBIENTE ORIGEM: ORACLE 11G CREATE DATABASE LINK "DBLINK_STREAM_XYZ" connect to "USER_STRMADMIN" identified by "USER_STRMADMIN" using 'XYZ_PROD'; BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name => ‘”INTPORTAL”.”ESCOLA”‘,
      streams_type => ‘CAPTURE’,
      streams_name => ‘STREAMS_CAP_INTPORTAL’,
      queue_name => ‘”USER_STRMADMIN”.”STRM_QUEUE_INTPORTAL”‘,
      include_dml => true,
      include_ddl => true,
      source_database => ‘GRPROD’,
      and_condition => ‘:ddl.get_compatible() <= dbms_streams.compatible_10_2'); END; / BEGIN DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES( table_name => ‘”INTPORTAL”.”ESCOLA”‘,
      streams_name => ‘STREAMS_PROP_INTPORTAL’,
      source_queue_name => ‘”USER_STRMADMIN”.”STRM_QUEUE_INTPORTAL”‘,
      destination_queue_name => ‘”USER_STRMADMIN”.”STRM_QUEUE_INTPORTAL”@DBLINK_STREAM_XYZ’,
      include_dml => true,
      include_ddl => true,
      source_database => ‘GRPROD’);
      END;
      /

      –APÓS A CONFIGURAÇÃO, HABILITEI A APPLY (DESTINO), CAPTURE (ORIGEM) E AGENDEI UMA PROPAGATION (ORIGEM)

      DECLARE
      v_started number;
      BEGIN
      SELECT decode(status, ‘ENABLED’, 1, 0) INTO v_started
      FROM DBA_APPLY WHERE APPLY_NAME = ‘STREAMS_APP_INTPORTAL’;

      if (v_started = 0) then
      DBMS_APPLY_ADM.START_APPLY(apply_name => ‘STREAMS_APP_INTPORTAL’);
      end if;
      END;

      DECLARE
      v_started number;
      BEGIN
      SELECT decode(status, ‘ENABLED’, 1, 0) INTO v_started
      FROM DBA_CAPTURE WHERE CAPTURE_NAME = ‘STREAMS_CAP_INTPORTAL’;

      if (v_started = 0) then
      DBMS_CAPTURE_ADM.START_CAPTURE(capture_name => ‘STREAMS_CAP_INTPORTAL’);
      end if;
      END;

      begin
      dbms_aqadm.SCHEDULE_PROPAGATION(‘USER_STRMADMIN.STRM_QUEUE_INTPORTAL’,
      ‘DBLINK_STREAM_XYZ’,
      to_date(’28/08/2014 16:45:00′,’DD/MM/YYYY HH24:MI:SS’),
      null,
      ‘sysdate+1/24′,
      ’60’,
      ‘USER_STRMADMIN.STRM_QUEUE_INTPORTAL’
      );
      end;

      Com essa configuração, está tudo “funcionando” (não apresenta erro na captura nem na aplicação), porém não propaga as mensagens.

      Quando consulto a propagação com a query abaixo, apresenta o seguinte resultado:

      col START_DATE format A20
      col PROPAGATION_WINDOW format A8
      col NEXT_TIME format A12
      col LATENCY format A6
      col SCHEDULE_DISABLED format A6
      col PROCESS_NAME format A6
      col FAILURES format A6
      col ERROR_MESSAGE format A6

      SELECT DISTINCT to_char(s.START_DATE,’dd/mm/yyyy hh24:mi:ss’) as START_DATE,
      s.PROPAGATION_WINDOW,
      s.NEXT_TIME,
      s.LATENCY,
      s.SCHEDULE_DISABLED,
      s.PROCESS_NAME,
      s.FAILURES,
      P.ERROR_MESSAGE
      FROM DBA_QUEUE_SCHEDULES s, DBA_PROPAGATION p
      WHERE s.SCHEMA = p.SOURCE_QUEUE_OWNER
      AND s.QNAME = p.SOURCE_QUEUE_NAME;

      START_DATE PROPAGATION_WINDOW NEXT_TIME LATENCY SCHEDULE_DISABLED PROCESS_NAME FAILURES ERROR_MESSAGE
      —————————————————————————————————————————————–
      28/08/2014 16:45:00 null sysdate+1/24 60 N J003 0 NULL

      Quando fui verificar no OEM JAVA Console, na aba de topologia da propagação, a comunicação entre minha fila de origem e destino apresentava-se com erro, que de acordo com a legenda é : “Vínculo de Banco de Dados com Erros”. Testei meu DBLINK e o mesmo estava funcionando. Em comparação com outros ambientes (que estão funcionando), percebi que o gráfico da topologia apresentava na origem o nome da fila (STRM_QUEUE_DIA) e no destino apenas o nome do DBLINK (DBLINK_STREAM_DIA). Já na configuração do ambiente que não está funcionando, a origem está o nome da fila (STRM_QUEUE_INTPORTAL) e no destino apresenta o nome da fila do ambiente utilizando o DBLINK (“USER_STRMADMIN”.”STRM_QUEUE_INTPORTAL”@DBLINK_STREAM_XYZ). Esse é o nome da “destination_queue_name” na propagation.

      Pois bem.

      A verdade é que não estou conseguindo replicar meus dados de um ambiente para o outro.

      Alguém que domina melhor Oracle Streams, pode me orientar a fazer algo?

      Grato desde Já!

      #106911
      Avatar photoRegis Araujo
      Participante

        @ROAF

        Bom dia!

        Primeiro pelo que vi, sua replicação é UNI-DIRECIONAL.

        Vamos lá, uma coisa que eu notei que pode estar errada.

        O campo source_database você precisa informar o nome do DBLINK.

        GRPROD é o nome do DBLINK do banco ORIGEM?

        Na tabela DBA_APPLY_ERROR de ambos os bancos, possui alguma informação?

        Rode a query abaixo em ambos os bancos e me mostre o resultado.

        SELECT CAPTURE_NAME, STATUS, ERROR_MESSAGE FROM DBA_CAPTURE
        UNION ALL
        SELECT APPLY_NAME, STATUS, ERROR_MESSAGE FROM DBA_APPLY
        UNION ALL
        SELECT PROPAGATION_NAME, STATUS, ERROR_MESSAGE FROM DBA_PROPAGATION

        Uma dica, sempre antes de adicionar o streams a uma nova instância e/ou adicionar apenas 1 tabela, rode a rotina abaixo, pois é necessário para o Streams a geração do dicionário de dados.

        Rode no banco Origem.

        begin
        dbms_capture_adm.build;
        end;

        A disposição

        Regis Araujo

        #106917
        Raphael Fernandes
        Participante

          Olá @Régis,

          Minha replicação é unidirecional sim!

          No parâmetro source_database => ‘GRPROD’, é informado o nome da minha instância de origem, e não o dblink.

          Minha origem tem conhecimento DO destino através da fila de mensagens, no parâmetro destination_queue_name => ‘”USER_STRMADMIN”.”STRM_QUEUE_INTPORTAL”@DBLINK_STREAM_XYZ’.

          Meu DBLINK é “DBLINK_STREAM_XYZ”.

          Quanto a query que você recomendou, estão todos os processos habilitados e sem erro: na origem tenho a captura e propagação e no destino tenho a aplicação.

          Esse é meio maior problema, pois não existe nenhum erro para me auxiliar.

          Na verdade o Enterprise Manager está acusando o erro da imagem.

          Attachments:
          #106918
          Avatar photoRegis Araujo
          Participante

            @ROAF

            Você adicionou o supplemental log nesta tabela no banco Origem, fez o set_instantiation na tabela??

            Para verificar quais os supplemental logs setados, use a query abaixo..

            select * from dba_log_groups where table_name = ”;

            Da um STOP e um START nos serviços de CAPTURE/PROPAG na Origem e no APPLY do destino, mas antes fica monitorando o Alert de ambos os bancos, muitos erros são gerados no ALERT e não nas tabelas de erro…

            Sinceramente, eu refaria esta replicação.. Caso queira, siga os passos abaixo:

            ### BANCO ORIGEM

            begin
            dbms_capture_adm.build;
            end;

            alter table add supplemental log data (all) columns;

            begin
            dbms_capture_adm.build;
            end;

            … dbms_streams_adm.add_table_rules … — CAPTURE PROCESS
            … dbms_streams_adm.add_table_propagation_rules … — PROPAGATION PROCESS
            … dbms_aqadm.disable_propagation_schedule … — PROPAGATION PROCESS

            ### BANCO DESTINO
            —– Sincronizar a tabela do banco Destino com o banco Origem (Se possível fazer via DATAPUMP)

            … dbms_streams_adm.add_table_rules … — APPLY PROCESS
            … dbms_apply_adm.set_table_instantiation_scn@ …

            ### BANCO ORIGEM
            … dbms_aqadm.enable_propagation_schedule … — PROPAGATION PROCESS

            ———————————

            Monitorar as tabelas de ERRO e ALERT de ambos os bancos..!!

            Abraços..!

            Regis Araujo

            #106919
            Raphael Fernandes
            Participante

              @Régis,

              O comando que usei para adicionar o os campos nos logs foi:

              ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY,UNIQUE INDEX) COLUMNS;

              Consultei a view dba_log_groups, e as tabelas estão lá.

              Até ai tudo certo!

              O que não fiz foi usar a instrução: dbms_capture_adm.build;

              O que ela faz exatamente?

              Nas configurações que fiz anteriormente (origem 10g e destino 10g) não utilizei isso.

              Vou seguir seu conselho e refazer a configuração, adicionando essa instrução.

              #106920
              Raphael Fernandes
              Participante

                Outra coisa…

                Quando devo executar o comando “dbms_capture_adm.build” ???

                Antes ou depois de configurar a captura?

                Preciso informar o SCN inicial?

                #106921
                Avatar photoRegis Araujo
                Participante

                  @ROAF

                  O comando BUILD gera no REDO/archive, informações de dicionário de dados(metadados) das tabelas..
                  Uma boa pratica é rodar este BUILD uma vez por dia, pois caso haja algum problema na sua replicação, o CAPTURE não procure informações em archivelogs muito antigos para iniciar o processo de CAPTURE/APPLY..

                  Basta fazer da maneira que passei.. sem passar SCN, ele automaticamente pega o SCN corrente e carrega as informações..

                  Se houver alguma transação nas tabelas que possuem Supplemental log, ele vai ficar em LOCK aguardando a transação ser concluída…

                  Então, você deve rodar o BUILD antes de configurar o CAPTURE…!!

                  Após rodar o capture, você pode verificar em qual sequence ele foi gerado com o comando abaixo..

                  select * from v$archived_log where dictionary_begin = ‘YES’;

                  Após tudo configurado, para você acompanhar qual archive está sendo lido e qual archive foi gerado pelo banco, você pode usar a query abaixo…

                  Eu uso ela constantemente no meu ambiente… Basta vc alterar o valor do para o nome do seu Capture_Name…

                  SELECT ‘ORIGEM -> DESTINO ‘ BANCO,
                  A.SEQAPPLY SEQUENCE_APPLICADA,
                  B.SEQARCH SEQUENCE_GERADA,
                  (B.SEQARCH – A.SEQAPPLY) DIF_APPLY
                  FROM (SELECT MAX(R.SEQUENCE#) SEQAPPLY
                  FROM DBA_REGISTERED_ARCHIVED_LOG R, DBA_CAPTURE C
                  WHERE R.CONSUMER_NAME = C.CAPTURE_NAME
                  AND C.CAPTURE_NAME = ”) A,
                  (SELECT MAX(SEQUENCE#) SEQARCH FROM V$ARCHIVED_LOG) B

                  Meu ambiente de Oracle Streams é BI-DIRECIONAL e para 3 ambientes.. da forma abaixo…

                  BD1 MATRIZ BD2

                  Ou seja, replicação triangular e BI-DIRECIONAL…

                  Constantemente preciso adicionar tabelas na replicação e o procedimento que você seguiu é o que eu faço, com a unica diferença de rodar o BUILD antes..!!

                  Abraços..!

                  #106922
                  Raphael Fernandes
                  Participante

                    @Régis,

                    Seu ambiente é muito mais complexo que o meu.

                    Estava conversando com um colega, e nos veio uma dúvida…

                    Na configuração da tabela com o pacote DBMS_STREAMS_ADM.ADD_TABLE_RULES o parâmetro source_database está com o SID do banco de origem.

                    Em todas as configurações que fiz anteriormente, ambos ambientes (origem e destino) estavam em um mesmo servidor. Já neste caso, os bancos de origem (11g)e destino (10g) encontram-se em redes distintas e em domínios diferentes.

                    O valor do parâmetro que estou usando é o SID. Será que devo alterá-lo para um endereço de domínio (criando uma entrada no DNS) ou até mesmo utilizar a entrada disponível no TNSNAMES?

                    Ex.:
                    alterar de: source_database => ‘GRPROD’ [SID do banco de origem]
                    para: source_database => ‘GRPROD.COM.BR’ [existe essa entrada no TNSNAMES]
                    ou
                    para: source_database => ‘GRPROD.DOMINIO.COM.BR’ [criando este endereço no DNS]

                    #106923
                    Avatar photoRegis Araujo
                    Participante

                      @ROAF

                      No parâmetro source_database, você tem que especificar o GLOBAL_NAME do banco… Rode o comando abaixo e insira o resultado no parâmetro…

                      select * from global_name;

                      Eu normalmente crio o DBLINK com o mesmo nome do GLOBAL_NAME..

                      Abraços..!

                      Regis Araujo

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.