Bom dia!
Pessoal, tenho um problema casca para resolver e não estou conseguindo.
Tenho uma package PL/SQL, onde há um cursor lendo duas tabelas via DBLINK. E o restante da rotina faz vários inserts e updates em tabelas do proprio banco de dados, ou seja, o DBLINK é só para leitura.
O processo começa funcionando bem, é executado algumas vezes, e de repente..... TRAVA.
Depois disso não funciona mais, o engraçado é que não fica nenhuma sessão presa no banco, mas o processo só volta a funcionar se baixar o DB.
E tem mais, todos os outros processos e transações continuam funcionando normalmente, só pára de funcionar a rotina que lê o DBlink, inclusive se você rodar o mesmo select do cursor onde acesso o DBlink, retorna extremamente rápido, ou seja, a query não trava.
Um DBA analisou e disse que esse processo está enchendo a cache do DB, não sou DBA, mas se isso fosse verdade o DB todo pararia? Por que somente um processo fica travado?
alguém tem uma luz no fim do túnel, aí? rs
Desde já, muito obrigado.
Adriano Barone
Procedure com DBLink
- stcoutinho
- Moderador
- Mensagens: 850
- Registrado em: Qua, 11 Mai 2011 5:15 pm
- Localização: são Paulo - SP
Adriano,
Posso dar uma sugestão?
Se você está usando o DBLINK para ser executado dentro de procedures, eu sugeriria para você "forçar" o fechamento do DBLINK depois de seu uso na procedure.
Basicamente, você utilizaria o seguinte comando dentro do PL/SQL:
Se você está usando o DBLINK em queries do SQL*PLus, então tente executar este comando:
Verifique se tomando este cuidado você consegue reduzir as ocorrências onde o DBLINK "trava".
Tanto em caso positivo como negativo, poste aquí o resultado.
Abraços,
Sergio Coutinho
Posso dar uma sugestão?
Se você está usando o DBLINK para ser executado dentro de procedures, eu sugeriria para você "forçar" o fechamento do DBLINK depois de seu uso na procedure.
Basicamente, você utilizaria o seguinte comando dentro do PL/SQL:
EXECUTE IMEDIATE('ALTER SESSION CLOSE DATABASE LINK <nome_dblink>');
ALTER SESSION CLOSE DATABASE LINK <nome_dblink>;
Tanto em caso positivo como negativo, poste aquí o resultado.
Abraços,
Sergio Coutinho
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Ter, 08 Jan 2008 8:33 am
- Localização: SP
Adriano Barone
Ok, obrigado pela dica.
Mas tenho umas dúvidas em relação a este procedimento.
Hoje eu tenho uma package compilada no banco de dados onde existe um cursor que acessa das views do dblink.
Caso eu feche o dblink, essa view não vai ficar inválida e deixar de compilar?
Caso não tenha esse problema, a idéia seria no incício da procedure eu inciaria o dblink e no término eu o fecharia, seria isso?
Obrigado.
Adriano Barone
Mas tenho umas dúvidas em relação a este procedimento.
Hoje eu tenho uma package compilada no banco de dados onde existe um cursor que acessa das views do dblink.
Caso eu feche o dblink, essa view não vai ficar inválida e deixar de compilar?
Caso não tenha esse problema, a idéia seria no incício da procedure eu inciaria o dblink e no término eu o fecharia, seria isso?
Obrigado.
Adriano Barone
- stcoutinho
- Moderador
- Mensagens: 850
- Registrado em: Qua, 11 Mai 2011 5:15 pm
- Localização: são Paulo - SP
Adriano,
O fechamento do DBLINK não significa que o mesmo deixará de existir, ou que as views que se utilizam dele ficarão inválidas.
O objetivo de se fechar um DBLINK é o de somente garantir que não existam transãções ou sessões de DBLINK pendentes, após o uso do DBLINK.
Faça o seguinte teste, se ainda está com dúvidas.
- Abra uma sessão SQL;
- Faça um select em uma view que acesse o DBLINK;
- Feche a sessão de DBLINK com o comando ALTER SESSION ...
- Execute novamente o SELECT na view;
Abraços,
Sergio Coutinho
O fechamento do DBLINK não significa que o mesmo deixará de existir, ou que as views que se utilizam dele ficarão inválidas.
O objetivo de se fechar um DBLINK é o de somente garantir que não existam transãções ou sessões de DBLINK pendentes, após o uso do DBLINK.
Faça o seguinte teste, se ainda está com dúvidas.
- Abra uma sessão SQL;
- Faça um select em uma view que acesse o DBLINK;
- Feche a sessão de DBLINK com o comando ALTER SESSION ...
- Execute novamente o SELECT na view;
Abraços,
Sergio Coutinho
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Ter, 08 Jan 2008 8:33 am
- Localização: SP
Adriano Barone
Entendi, perfeito.
Mas só uma outra dúvida, como fazer isso dentro da rotina pl/sql, o comando
não compilou na procedure.
Se eu rodar isso no forms, funciona do mesmo jeito?
Outra coisa, eu tenho que enviar o comando para "abrir" o dblink antes de usa-lo, ou não é necessário?
Muito obrigado.
Adriano Barone
Mas só uma outra dúvida, como fazer isso dentro da rotina pl/sql, o comando
EXECUTE IMEDIATE('ALTER SESSION CLOSE DATABASE LINK <nome_dblink>')
Se eu rodar isso no forms, funciona do mesmo jeito?
forms_ddl('ALTER SESSION CLOSE DATABASE LINK <nome_dblink>');
Muito obrigado.
Adriano Barone
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Ter, 08 Jan 2008 8:33 am
- Localização: SP
Adriano Barone
Já vi o motivo de não compilar, o comando correto é EXECUTE IMMEDIATE.
Só fica a duvida do forms (se posso executar pelo forms) e a de "abrir" o dblink antes do uso.
Obrigado.
Adriano Barone
Só fica a duvida do forms (se posso executar pelo forms) e a de "abrir" o dblink antes do uso.
Obrigado.
Adriano Barone
- stcoutinho
- Moderador
- Mensagens: 850
- Registrado em: Qua, 11 Mai 2011 5:15 pm
- Localização: são Paulo - SP
Olá Adriano,
Desculpe o deslize pela grafia incorreta do comando do EXECUTE.
Não sou especialista em forms, mas se você pode executar procedures pelo forms, conseguirá executar o EXECUTE IMMEDIATE.
O DBLINK será "reativado" quando você executar o SELECT na VIEW pela primeira vez após ter executado o comando de CLOSE do DBLINK. Para o banco, isso é um processo transparente.
Abraços,
Sergio
Desculpe o deslize pela grafia incorreta do comando do EXECUTE.
Não sou especialista em forms, mas se você pode executar procedures pelo forms, conseguirá executar o EXECUTE IMMEDIATE.
O DBLINK será "reativado" quando você executar o SELECT na VIEW pela primeira vez após ter executado o comando de CLOSE do DBLINK. Para o banco, isso é um processo transparente.
Abraços,
Sergio
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Ter, 08 Jan 2008 8:33 am
- Localização: SP
Adriano Barone
Bom dia!
Imagine, não esquenta, obrigado pela ajuda!
Entendi o conceito do comando, inclusive já alterei a rotina para executá-lo ao término do processamento.
Agora como o problema é itermitente não consigo ter certeza que resolvel, só em alguns dias de uso, se não travar mais é que funcionou.
De qualquer maneira, muito obrigado pela ajuda.
Um bom natal e ano novo para todos!
Adriano Barone
Imagine, não esquenta, obrigado pela ajuda!
Entendi o conceito do comando, inclusive já alterei a rotina para executá-lo ao término do processamento.
Agora como o problema é itermitente não consigo ter certeza que resolvel, só em alguns dias de uso, se não travar mais é que funcionou.
De qualquer maneira, muito obrigado pela ajuda.
Um bom natal e ano novo para todos!
Adriano Barone
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Bing [Bot] e 4 visitantes