Esiste un timeout per una query sul collegamento al database?


11

Modifica / Prefazione: questa domanda è stata migrata da SO poiché sono particolarmente interessato alla domanda sui timeout nelle query dei collegamenti DB. La soluzione fornita da SO è in qualche modo OK, ma sono davvero interessato alla domanda stessa.

Motivazione:
ho avuto una query in esecuzione "per sempre" (più di 2 giorni, fino a quando ho ucciso la sessione), che utilizzava un collegamento al database. Il problema sembrava essere che il database remoto non era disponibile e per qualche motivo ancora sconosciuto non è ORA-02068stato sollevato (da non discutere qui) e la query ha semplicemente atteso e atteso.

(La query viene emessa da un lavoro dbms_scheduler, che esegue una procedura in un pacchetto PL / SQL. Di conseguenza, anche il lavoro è stato bloccato. Ma questo non è di particolare interesse per il nocciolo di questa domanda)

Ho simulato questa situazione mettendo uno dei miei DB di test in modalità di sospensione e lo ho interrogato su un collegamento al database. Come anticipato, la query era in attesa di annullamento manuale o di annullamento del DB remoto.

Domanda:
Non ho alcun controllo sul comportamento e sul tempo di attività del database remoto, quindi sono alla ricerca di una possibilità per impostare un timeout su una query che utilizza un collegamento al database.

Ho già esaminato i profili ( CPU_PER_CALLecc.), I sqlnet.oraparametri, l'aggiunta di parametri di denominazione locali direttamente nella stringa di connessione (come l'aggiunta (connect_timeout=10)alla definizione del collegamento al database), l'esecuzione di un comando con ... for update wait 1, ma funzionano per sessioni occupate o inattive, ma non per sessioni in attesa.

Quindi sono alla ricerca di qualche opzione sul lato "locale" del collegamento al database, che imposta un timeout per le query sui collegamenti al database.
Alcune soluzioni gradiscono alter session set xyzo select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)sarebbero apprezzate, poiché non ho diritti DBA su questi DB particolari.

Sono attualmente su 10gR2 ma l'aggiornamento a 11gR2 in poche settimane, quindi le idee per una di queste versioni saranno utili.


come viene utilizzata la query? parte di una procedura / pacchetto più ampia, sottostante SQL per una vista mat, eseguito da un'app esterna, ...? Non conosco una semplice sintassi "wait xxx", potrebbe essere necessario che la tua soluzione faccia parte di un programma più ampio, a seconda del tuo utilizzo.

La query viene emessa da un processo dbms_scheduler, che esegue una procedura in un pacchetto PL / SQL. (domanda aggiornata con quello)
GWu

Risposte:


4

Dato che stai usando dbms_scheduler, puoi impostare l' attributo max_run_duration del lavoro su un certo limite, e quindi avere lo scheduler e-mail se l'evento viene generato. Dietro le quinte Oracle utilizza tabelle di accodamento (che possono consentire di creare processi che si attivano quando viene generato un evento , se si desidera intraprendere ulteriori passaggi per eseguire una maggiore automazione sulla risposta). Ma fondamentalmente qualsiasi lavoro che esegue il max_run_duration impostato genererà il tipo di evento: JOB_OVER_MAX_DUR

Il pezzo di posta elettronica è costruito in 11gr2, vedi qui per una buona scrittura.

Spero possa aiutare.


ottima idea, grazie! Non è esattamente una risposta alla domanda specifica sul timeout sui collegamenti DB, ma suppongo che risolva comunque il mio problema iniziale, quindi +1 :-). Non sapevo di max_run_duration e partendo da questo ho appena scoperto come interrompere e rilasciare il lavoro sospeso ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWu

Per qualche motivo non riesco max_run_durationa sollevare l'evento, quindi ho fatto una nuova domanda qui
GWu

0

Non sto dicendo che ho una soluzione, ma vorrei anche ulteriori discussioni su come controllare un timeout doppio. Suppongo che sia concepibile scrivere codice che genera un evento o in attesa di un evento di timeout del TNS, quindi esegue:

ALTER SESSION CLOSE DATABASE LINK dblink;

Naturalmente è possibile eseguire il polling del server remoto prima con:

select * from dual@dblink

per verificare se è disponibile, ma ciò non risolve il problema del codice in esecuzione troppo a lungo sul telecomando. Il cattivo codice remoto dovrebbe generare eventi di attesa, quindi suppongo che potrebbero essere intrappolati (anche a livello di classe in 12c). Ciò non ci fornisce ancora un'elegante soluzione per forzare una sessione di dblink al timeout.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.