Existe um tempo limite para uma consulta no link do banco de dados?

11

Editar / Prefácio: Esta questão foi migrada do SO, pois estou particularmente interessado na questão de tempos limite nas consultas de link do banco de dados. A solução fornecida pela SO é um tanto aceitável, mas estou realmente interessado na pergunta em si.

Motivação:
tive uma consulta em execução "para sempre" (mais de 2 dias, até que eu encerrei a sessão), que estava usando um link de banco de dados. O problema parecia ser que o banco de dados remoto ficou indisponível e, por algum motivo ainda desconhecido, não ORA-02068foi levantado (não deve ser discutido aqui) e a consulta apenas aguardou.

(A consulta é emitida por um trabalho dbms_scheduler, que executa um procedimento em um pacote PL / SQL. Como conseqüência, o trabalho também foi interrompido. Mas isso não é de interesse especial para o núcleo desta questão)

Simulei essa situação colocando um dos meus bancos de dados de teste no modo quiesce e consultei-o em um link de banco de dados. Conforme previsto, a consulta estava aguardando até que o cancelamento manual ou o banco de dados remoto não fossem acionados.

Pergunta:
Não tenho controle sobre o comportamento e o tempo de atividade do banco de dados remoto; portanto, estou em busca de alguma possibilidade de definir um tempo limite em uma consulta que esteja usando um link de banco de dados.

Eu já examinei perfis ( CPU_PER_CALLetc), sqlnet.oraparâmetros, adicionando parâmetros de nomenclatura local diretamente à string de conexão (como adicionar (connect_timeout=10)à definição de link do banco de dados), executando um comando com ... for update wait 1, mas eles funcionam em sessões ocupadas ou inativas, mas não para sessões em espera.

Portanto, estou procurando alguma opção no lado "local" do link do banco de dados, que define um tempo limite para consultas nos links do banco de dados.
Alguma solução como alter session set xyzou select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)seria apreciada, pois não tenho direitos de DBA nesses bancos de dados específicos.

Atualmente, estou em 10gR2, mas atualizo para 11gR2 em algumas semanas, portanto, idéias para qualquer uma dessas versões serão úteis.

GWu
fonte
como a consulta é usada? parte de um procedimento / pacote maior, SQL subjacente para uma visualização de esteira, executado a partir de um aplicativo externo, ...? Não conheço uma sintaxe simples "aguarde xxx", sua solução pode precisar fazer parte de um programa maior, depende do uso que você faz.
A consulta é emitida por um trabalho dbms_scheduler, que executa um procedimento em um pacote PL / SQL. (pergunta atualizado com isso)
GWU

Respostas:

4

Como você está usando dbms_scheduler, é possível definir o atributo max_run_duration da tarefa como um limite e, em seguida, enviar o agendador por e-mail se esse evento for gerado. Nos bastidores, o Oracle usa tabelas de filas (que podem permitir a criação de tarefas que são acionadas quando um evento é gerado , se você desejar executar as etapas extras para obter mais automação em sua resposta). Porém, basicamente, qualquer trabalho executado com o max_run_duration que você configurar aumentará o tipo de evento: JOB_OVER_MAX_DUR

O email é construído em 11gr2, veja aqui para obter uma boa redação.

Espero que ajude.


fonte
ótima ideia, obrigado! Não é exatamente uma resposta para a pergunta específica sobre o tempo limite nos links do banco de dados, mas acho que resolve o meu problema inicial de qualquer maneira, então +1 :-). Eu não sabia de max_run_duration e, a partir disso eu só descobri como parar e soltar o trabalho hung ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWU
Por alguma razão eu não posso começar max_run_durationa aumentar o evento, então eu bifurcada uma nova pergunta aqui
GWU
0

Não estou dizendo que tenho uma solução, mas também gostaria de mais discussões sobre como controlar um tempo limite de dblink. Suponho que seja concebível escrever código que dispara um evento ou aguarde um evento de tempo limite do TNS e, em seguida, execute:

ALTER SESSION CLOSE DATABASE LINK dblink;

Obviamente, você pode pesquisar o servidor remoto antes com:

select * from dual@dblink

para verificar se está disponível, mas isso não resolve o problema do código em execução por muito tempo no controle remoto. O código remoto incorreto deve disparar eventos de espera, então suponho que eles possam estar presos (mesmo no nível da classe em 12c). Isso ainda não nos fornece uma solução elegante para forçar o tempo limite de uma sessão dblink.

sandman
fonte