atualizar algumas tabelas em outro servidor

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

Eu trabalho na minha empresa com 0racle 10g instalado num ibm e tenho outro oracle numa maquina linux. Como no ibm o oracle tem o trafego muito grande, e eu so uso cinco tabelas que estão la, eu salvei estas tabelas no oracle que esta no linux. Ate tudo bem, so que eu gostaria que esse processo fosse automatico e estas tabelas fossem atualizadas diariamete. alguém tem algum exemplo de script ou algum programa externo que faça esta manutenção.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, segue uma dica:

Passos:

1) Criar uma procedure PL/SQL, comDbLinhks, que verifique a diferença das tabelas e faça o "MERGE" delas.
2) Criar um Job, que processe esta procedure de tempos em tempos.

Sobre a criação da procedure com merge, e o job, dê uma procurada aqui no fórum mesmo, que irá achar tópicos interessantes.

Qualquer coisa, manda ai.
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

Amigo,

fiz este sql com o merge, mas este erro.
ora-00969 na linha 2 coluna 14 falta do ON
eu to com o manual do oracle aqui e a sintaxe me parece correta.
aqui vai o script se pode me ajudar neste caso.

Selecionar tudo

Merge
INTO sisesgoto.stc_agua_tratada d USING stc.stc_agua.tratada s ON(s.cod_us = d.cod_us
 AND s.cod_eta = d.cod_eta
 AND s.dt_agua_trat = d.dt_agua_trat)
WHEN matched THEN

UPDATE
SET d.cod_us = s.cod_us,
  d.cod_eta = s.cod_eta,
  d.dt_agua_trat = s.dt_agua_trat,
  d.vol_agua_tratada = s.vol_agua_tratada,
  d.qtd_filtros_servico = s.qtd_filtros_servico,
  d.nro_filtro_analisado = s.nro_filtro_analisado,
  d.cons_agua_lavagem = s.cons_agua_lavagem,
  d.pe_cons_agua_lavagem = s.pe_cons_agua_lavagem,
  d.dt_inclusao = s.dt_inclusao,
  d.dt_alteracao = s.dt_alteracao,
  d.usuario = s.usuario,
  d.evento = s.evento,
  d.hrs_recalque_hhh = s.hrs_recalque_hhh,
  d.hrs_recalque_mm = s.hrs_recalque_mm,
  d.carreira_md_filtros_lavado_hhh = s.carreira_md_filtros_lavado_hhh,
  d.carreira_md_filtros_lavado_mm = s.carreira_md_filtros_lavado_mm

WHEN NOT matched THEN
INSERT
VALUES(s.cod_us,   s.cod_eta,   s.dt_agua_trat,   s.vol_agua_tratada,   s.qtd_filtros_servico,   s.nro_filtro_analisado,   s.cons_agua_lavagem,   s.pe_cons_agua_lavagem,   s.dt_inclusao,   s.dt_alteracao,   s.usuario,   s.evento,   s.hrs_recalque_hhh,   s.hrs_recalque_mm,   s.carreira_md_filtros_lavado_hhh,   s.carreira_md_filtros_lavado_mm);
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Segue um exemplo do MERGE:

Selecionar tudo

MERGE INTO bonuses D
 USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
 ON (D.employee_id = S.employee_id)
 WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
 WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
  VALUES (S.employee_id, S.salary*0.1);
Realmente o ON não estava na sintaxe q me passou.
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

cara, fiz o q você disse mas me da um erro que não consigo achar a resposta.

Selecionar tudo

MERGE INTO sisesgoto.stc_agua_tratada1 D
 USING (SELECT
  cod_us,
  cod_eta,
  dt_agua_trat,
  vol_agua_tratada,
  qtd_filtros_servico,
  nro_filtro_analisado,
  qtd_filtros_lavado,
  cons_agua_lavagem,
  pe_cons_agua_lavagem,
  dt_inclusao,
  dt_alteracao,
  usuario,
  evento,
  hrs_recalque_hhh,
  hrs_recalque_mm,
  carreira_md_filtros_lavado_hhh,
  carreira_md_filtros_lavado_mm

  FROM sisesgoto.stc_agua_tratada d
  WHERE cod_us = 27) S
 
 ON (s.cod_us=d.cod_us) /* erro acontece aqui */

 WHEN MATCHED THEN UPDATE SET

  d.cod_us = s.cod_us,
  d.cod_eta = s.cod_eta,
  d.dt_agua_trat = s.dt_agua_trat,
  d.vol_agua_tratada = s.vol_agua_tratada,
  d.qtd_filtros_servico = s.qtd_filtros_servico,
  d.nro_filtro_analisado = s.nro_filtro_analisado,
  d.qtd_filtros_lavado= s.qtd_filtros_lavado,
  d.cons_agua_lavagem = s.cons_agua_lavagem,
  d.pe_cons_agua_lavagem = s.pe_cons_agua_lavagem,
  d.dt_inclusao = s.dt_inclusao,
  d.dt_alteracao = s.dt_alteracao,
  d.usuario = s.usuario,
  d.evento = s.evento,
  d.hrs_recalque_hhh = s.hrs_recalque_hhh,
  d.hrs_recalque_mm = s.hrs_recalque_mm,
  d.carreira_md_filtros_lavado_hhh = s.carreira_md_filtros_lavado_hhh,
  d.carreira_md_filtros_lavado_mm = s.carreira_md_filtros_lavado_mm

  WHEN NOT MATCHED THEN INSERT
  (
  d.cod_us,
  d.cod_eta,
  d.dt_agua_trat,
  d.vol_agua_tratada,
  d.qtd_filtros_servico,
  d.nro_filtro_analisado,
  d.qtd_filtros_lavado,
  d.cons_agua_lavagem,
  d.pe_cons_agua_lavagem,
  d.dt_inclusao,
  d.dt_alteracao,
  d.usuario,
  d.evento,
  d.hrs_recalque_hhh,
  d.hrs_recalque_mm,
  d.carreira_md_filtros_lavado_hhh,
  d.carreira_md_filtros_lavado_mm)

  VALUES

  (s.cod_us,
  s.cod_eta,
  s.dt_agua_trat,
  s.vol_agua_tratada,
  s.qtd_filtros_servico,
  s.nro_filtro_analisado,
  s.qtd_filtros_lavado,
  s.cons_agua_lavagem,
  s.pe_cons_agua_lavagem,
  s.dt_inclusao,
  s.dt_alteracao,
  s.usuario,
  s.evento,
  s.hrs_recalque_hhh,
  s.hrs_recalque_mm,
  s.carreira_md_filtros_lavado_hhh,
  s.carreira_md_filtros_lavado_mm
    );
é o seguinte

Selecionar tudo

ON (s.cod_us=d.cod_us) /* erro acontece aqui */
com a linha como esta da erro de nome invalido de coluna.
mas se eu alterar aqui

Selecionar tudo

ON (s.cod_us=27)  /* isso funciona mas não me serve */
deveria funcionar

Selecionar tudo

 s.cod_us=d.cod_us
vê se da uma luz.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, bom dia.

Posta o erro aqui pra gente analisar.
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

o erro é este aqui.

Selecionar tudo

Error at Command Line:2 Column:15
Error report:
SQL Error: ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

desculpe, postei o erro inconrreto, desconsidere o acima.

Selecionar tudo

Error at Command Line:25 Column:15
Error report:
SQL Error: ORA-00904: nome inválido de coluna
00904. 00000 -  "%s: invalid identifier"
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Esta tabela abaixo:

Selecionar tudo

sisesgoto.stc_agua_tratada1 
Possui o campo Cod_US ?
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

trevisolli,
Cara é o seguinte, já consegui fazer funcionar, não como deveria mas
substitui as linha aonde deveria comparar o numero da us por estas

Selecionar tudo

 WHERE cod_us between 1 and 500)
 

 ON(s.cod_us between 1 and 500)
como eu tenho 500 codigo de us, então mando procurar todas as alterações. Com a tabela vazia fica facil e rapido, por ele so fazer o insert, mas o update ficou demorado. Vou rever isso.

Bem aqui acabou a etapa de desenvolvimento, agora vem o dificl para mim , eu acho.

tenho dois servidores oracle, um num ibm e outro no linux em lugares distantes com tns difrentes.

IBM

Selecionar tudo

IBM.WORLD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = IBM.oracle.CIA.CIA)(PORT = 1524))
    (CONNECT_DATA = (SID = IBM) (SERVER=DEDICATED))
LINUX

Selecionar tudo

linux.cia2.cia2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = servidorlinux)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = linux)
    )
  )
Pergunta??

Como faço para fazer o merge das tabelas do IBM para as tabelas no servidorlinux??

a tabela stc_agua_tratada esta no IBM e
a tabela stc_agua_tratada1 esta no servidorlinux

como faço para o select achar as tabelas nos devido servidores??
isso aqui tentei e não funcionou

Selecionar tudo

ibm.stc_agua_tratada (IBM)
linux.stc_agua_tratada1(linux)
obs. estes nomes de maquina são so exemplos (ficticios).

aqui eu pesso agua!!! hehehehe
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Então brother,

Pra se realizar este select, em bases distintas, tem que ser criado um DBLink (Database Link) entre os servidores.

Isso deve ser analisado com o DBA responsável na empresa, que deverá criar este link pra você.

Aqui no fórum, existem exemplos interessantes de utilização e de criação.

Procure aqui por DBLink que irá achar tópicos interessantes, como este.

Qualquer dúvida, manda ai.
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

Trevisolli,
esta tudo certo com o merge, funcionou beleza. So uma duvida quanto ao dblink, eu so preciso criar um dblink so para o servidor destino ou para as duas maquinas??


o oracle no ibm eu tenho as tabelas que quero selecionar, então devo criar o dblink para a maquina linux e rodar o script no oracle ibm ou vice versa ou seja crio na maquina linux aonde estao as tabelas destinos um dblink para o oracle ibm e rodo o script na maquina linux??
henrique290
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Ter, 09 Out 2007 11:36 pm
Localização: Porto Alegre - RS

Trevissoli,

Muito obrigado pelas dicas e gostaria finalizar este topico. já criei os dblink e o merge esta funcionado e agendado.

Att
Henrique
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, demorei um pouco pois estava num projeto...
Que bom que deu certo, se puder, detalhe os passos aqui , para quem mais necessitar de ajuda.
Muito obrigado,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante