Y a-t-il un délai d'attente pour une requête sur le lien de la base de données?


11

Modifier / Préface: Cette question a été migrée depuis SO car je suis particulièrement intéressé par la question des délais d'attente sur les requêtes de lien DB. La solution de contournement fournie par SO est quelque peu correcte, mais je suis vraiment intéressé par la question elle-même.

Motivation:
j'ai eu une requête exécutée "pour toujours" (plus de 2 jours, jusqu'à ce que j'ai tué la session), qui utilisait un lien de base de données. Le problème semble être que la base de données distante est devenue indisponible et pour une raison inconnue, aucune n'a ORA-02068été soulevée (à ne pas discuter ici) et la requête a simplement attendu et attendu.

(La requête est émise par un travail dbms_scheduler, qui exécute une procédure dans un package PL / SQL. Par conséquent, le travail a également été bloqué. Mais cela n'a pas un intérêt particulier pour le cœur de cette question)

J'ai simulé cette situation en mettant une de mes bases de données de test en mode repos et en la questionnant sur un lien de base de données. Comme prévu, la requête attendait jusqu'à ce qu'elle soit annulée manuellement ou que la base de données distante soit suspendue.

Question:
Je n'ai aucun contrôle sur le comportement et la disponibilité de la base de données distante, je suis donc à la recherche d'une possibilité de définir un délai d'expiration sur une requête qui utilise un lien de base de données.

J'ai déjà examiné les profils ( CPU_PER_CALLetc.), les sqlnet.oraparamètres, l'ajout de paramètres de dénomination locaux directement dans la chaîne de connexion (comme l'ajout (connect_timeout=10)à la définition de lien de base de données), l'exécution d'une commande avec ... for update wait 1, mais ils fonctionnent soit pour les sessions occupées soit inactives, mais pas pour les sessions en attente.

Je suis donc à la recherche d'une option du côté "local" du lien de base de données, ce qui définit un délai d'attente pour les requêtes sur les liens de base de données.
Une solution comme alter session set xyzou select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)serait appréciée, car je n'ai aucun droit DBA sur ces bases de données particulières.

Je suis actuellement sur 10gR2 mais je passe à 11gR2 dans quelques semaines, donc des idées pour l'une de ces versions seront utiles.


comment la requête est-elle utilisée? partie d'une procédure / d'un package plus vaste, SQL sous-jacent pour une vue mat, exécuté à partir d'une application externe, ...? Je ne connais pas de syntaxe simple "attendre xxx", votre solution devra peut-être faire partie d'un programme plus vaste, cela dépend de votre utilisation.

La requête est émise par un travail dbms_scheduler, qui exécute une procédure dans un package PL / SQL. (question mise à jour avec ça)
GWu

Réponses:


4

Puisque vous utilisez dbms_scheduler, vous pouvez définir l' attribut max_run_duration du travail à une certaine limite, puis demander au planificateur de vous envoyer un e-mail si cet événement est déclenché. Dans les coulisses, Oracle utilise des tables de mise en file d'attente (qui peuvent vous permettre de créer des travaux qui se déclenchent lorsqu'un événement est déclenché , si vous souhaitez prendre les mesures supplémentaires pour effectuer plus d'automatisation autour de votre réponse). Mais fondamentalement, tout travail qui s'exécute sur la durée max_run_duration que vous configurez augmentera le type d'événement: JOB_OVER_MAX_DUR

L'e-mail est construit en 11gr2, voir ici pour une bonne rédaction.

J'espère que cela pourra aider.


bonne idée, merci! Ce n'est pas exactement une réponse à la question spécifique sur le délai d'expiration des liens DB, mais je suppose que cela résout mon problème initial, alors +1 :-). Je ne connaissais pas max_run_duration et à partir de cela, je viens de trouver comment arrêter et supprimer le travail suspendu ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWu

Pour une raison quelconque, je ne parviens pas max_run_durationà soulever l'événement, j'ai donc
envoyé

0

Je ne dis pas que j'ai une solution mais j'aimerais aussi plus de discussion sur la façon de contrôler un délai d'attente de clignotement. Je suppose qu'il pourrait être envisageable d'écrire du code qui déclenche un événement, ou attend un événement d'expiration TNS, puis exécute:

ALTER SESSION CLOSE DATABASE LINK dblink;

Vous pouvez bien sûr interroger le serveur distant auparavant avec:

select * from dual@dblink

pour vérifier si elle est disponible, mais cela ne résout pas le problème du code exécuté trop longtemps sur la télécommande. Le mauvais code distant devrait déclencher les événements d'attente, donc je suppose que ceux-ci pourraient être piégés (même au niveau de la classe en 12c). Cela ne nous donne toujours pas une solution élégante pour forcer une session dblink à expirer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.