¿Hay un tiempo de espera para una consulta sobre el enlace de la base de datos?

11

Editar / Prefacio: esta pregunta se ha migrado de SO, ya que estoy particularmente interesado en la pregunta sobre los tiempos de espera en las consultas de enlace de base de datos. La solución provista por SO está bastante bien, pero estoy realmente interesado en la pregunta en sí.

Motivación:
tuve una consulta ejecutándose "para siempre" (más de 2 días, hasta que finalicé la sesión), que usaba un enlace de base de datos. El problema parecía ser que la base de datos remota no estaba disponible y, por alguna razón desconocida, no ORA-02068se planteó ninguna (no se discutirá aquí) y la consulta simplemente esperó y esperó.

(La consulta es emitida por un trabajo dbms_scheduler, que ejecuta un procedimiento en un paquete PL / SQL. Como consecuencia, el trabajo también se atascó. Pero eso no es de especial interés para el núcleo de esta pregunta)

Simulé esta situación poniendo uno de mis DB de prueba en modo inactivo y lo consulté a través de un enlace de base de datos. Como se anticipó, la consulta estaba esperando hasta que se cancelara manualmente o la DB remota no fuera inmovilizada.

Pregunta:
No tengo control sobre el comportamiento y el tiempo de actividad de la base de datos remota, por lo que estoy buscando alguna posibilidad de establecer un tiempo de espera en una consulta que utiliza un enlace de base de datos.

Ya he examinado los perfiles ( CPU_PER_CALLetc.), los sqlnet.oraparámetros, agregando parámetros de nombres locales directamente en la cadena de conexión (como agregar (connect_timeout=10)a la definición del enlace de la base de datos), ejecutando un comando con ... for update wait 1, pero funcionan para sesiones ocupadas o inactivas, pero no para sesiones en espera.

Así que estoy buscando alguna opción en el lado "local" del enlace de la base de datos, que establece un tiempo de espera para las consultas sobre los enlaces de la base de datos.
Alguna solución como alter session set xyzo select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)sería apreciada, ya que no tengo derechos de DBA en estos DB en particular.

Actualmente estoy en 10gR2 pero actualizo a 11gR2 en unas pocas semanas, por lo que las ideas para cualquiera de estas versiones serán útiles.

GWu
fuente
¿Cómo se usa la consulta? parte de un procedimiento / paquete más grande, SQL subyacente para una vista mat, ejecutado desde una aplicación externa, ...? No conozco una sintaxis simple de "espera xxx", su solución puede ser parte de un programa más grande, depende de su uso.
La consulta es emitida por un trabajo dbms_scheduler, que ejecuta un procedimiento en un paquete PL / SQL. (pregunta actualizada con eso)
GWu

Respuestas:

4

Como está utilizando dbms_scheduler, puede establecer el atributo max_run_duration del trabajo en algún límite y luego hacer que el planificador le envíe un correo electrónico si se produce ese evento. Detrás de escena, Oracle utiliza tablas de colas (que pueden permitirle crear trabajos que se activan cuando se genera un evento , si desea tomar los pasos adicionales para automatizar más su respuesta). Pero, básicamente, cualquier trabajo que se ejecute sobre la max_run_duration que configuró generará el tipo de evento: JOB_OVER_MAX_DUR

La pieza de correo electrónico está construida en 11gr2, vea aquí para una buena redacción.

Espero que ayude.


fuente
gran idea, gracias! No es exactamente una respuesta a la pregunta específica sobre el tiempo de espera en los enlaces de DB, pero supongo que resuelve mi problema inicial de todos modos, así que +1 :-). No sabía de max_run_duration y, a partir de esto, descubrí cómo detener y soltar el trabajo colgado ( foros.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWu
Por alguna razón, no puedo max_run_durationplantear el evento, así que hice una nueva pregunta aquí
GWu
0

No digo que tenga una solución, pero también me gustaría más discusión sobre cómo controlar un tiempo de espera dblink. Supongo que podría ser concebible escribir código que dispare un evento, o espere un evento de tiempo de espera TNS, y luego ejecute:

ALTER SESSION CLOSE DATABASE LINK dblink;

Por supuesto, puede sondear el servidor remoto antes con:

select * from dual@dblink

para verificar si está disponible, pero eso no soluciona el problema del código que se ejecuta durante mucho tiempo en el control remoto. El código remoto incorrecto debería disparar eventos de espera, por lo que supongo que podrían quedar atrapados (incluso a nivel de clase en 12c). Eso todavía no nos da una solución elegante de forzar una sesión dblink al tiempo de espera.

sandman
fuente