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-02068
foi 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_CALL
etc), sqlnet.ora
parâ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 xyz
ou 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.
Respostas:
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
max_run_duration
a aumentar o evento, então eu bifurcada uma nova pergunta aquiNã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:
Obviamente, você pode pesquisar o servidor remoto antes com:
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.
fonte