2010-10-03 22 views
4

J'ai une base de données principale avec seulement des données de configuration au siège social et plusieurs bases de données dans différentes succursales, j'ai créé un lien de base de données pour chaque serveur de succursale. Dans certains cas, je voudrais interroger tous les liens valides (comme certains liens pourraient être invalides en raison de problèmes de connexion ou toute autre chose), donc ma question est Comment vérifier si le lien de base de données est valide sans entrer dans Timeout Connection Problèmes, Existe-t-il une instruction SQL permettant au serveur principal d'Oracle de vérifier et de renvoyer uniquement les liens de base de données valides?Comment vérifier si un lien de base de données est valide dans Oracle?

Merci d'avance.

Répondre

2

Je ne suis pas sûr que vous pouvez créer une requête pour vérifier les liens en direct db. Une chose que vous pourriez faire est de créer une table mise à jour par un processus d'arrière-plan avec la liste des liens db et pour chacun d'entre eux un timestamp 'last time seen alive'

+0

Cela pourrait être une solution aussi, thnx vc74 – Khaled

2

Tous les liens peuvent avoir un problème en raison de différentes catégories de problèmes :

  • définition de lien invalide: mauvais nom d'utilisateur, mot de passe (le cas échéant), le service nom

  • compte à distance verrouillé

  • configuration db distante (par ex. sessions par utilisateur ont dépassé)

  • indisponibilité db ou hôte distant

  • connectivité réseau

Compte tenu de la nature changeante de ces modes de défaillance, il ne peut pas être vue dictionnaire (par exemple) qui décrit la état du lien. Un processus asynchrone qui vérifie en arrière-plan aura également une chance d'être obsolète. Probablement le test le plus léger que vous pouvez faire est un "select sysdate de dual @ remote_db" avant de devoir utiliser le lien dans votre code

+1

Merci pour ur réponse, mais le problème que je face à cette approche est en attente jusqu'à ce que je reçois le délai d'attente exception.so si des liens de base de données ne sont pas disponibles pour tous raison, je vais devoir attendre que le serveur arrête d'essayer de se connecter! – Khaled

1

Vous pouvez écrire un script de niveau OS qui effectue un tnsping, puisque les liens db habituellement dépend du tnsnames.ora de toute façon.

+0

Cela semble être une bonne idée, mais comment le faire? – Khaled

+0

Pour Windows ... tnsping ... vérifiez la valeur% errorlevel% immédiatement après le tnsping. Si c'est 0 == OK, 1 == ERREUR. Pour UNIX, le code de retour est $? (équivalent errorlevel). – Stellios

+0

je vais essayer cela, thanx – Khaled

0

Je ne sais pas si vous avez réussi à faire cela, mais je voulais faire quelque chose comme ça et vérifier quels liens de base de données sont actifs. J'ai trouvé ceci sur un autre forum

Select * from v$dblink 

qui montre seulement des dblinks actifs. Encore une fois, cela ne fonctionnera que si vous avez l'autorisation d'accéder à v$dblink.

0

@Sushant Nayak Oui, je l'ai fait.

J'ai essayé "Select * de v $ dblink" mais cela ne fonctionne pas, peut-être parce que la permission. J'ai été capable de le faire en créant une table avec les bases de données de destination contenant le dblink de chacun .. alors j'ai utilisé le dll Quartz pour exécuter une fonction selon un intervalle, cette fonction est exécutée dans un fil séparé, il vérifie le lien de base de données en interrogeant n'importe quelle table système..s'il répond avant un temps spécifique (en millisecondes) alors il règle l'état du dblink dans la table à true..si je ferme le thread de la fonction et règle le statut à faux .. alors dans l'une des requêtes, j'exclus les dblinks inactifs.

J'espère que cela aide

Khaled

4

Vous pouvez vérifier le lien db en exécutant:

select * from [email protected]_db_link; 

Pour peut créer la fonction qui vérifie lien db:

function is_link_active(
    p_link_name varchar2 
) return number is 
    v_query_link varchar2(100) := 'select count(*) alive from [email protected]'||p_link_name; 
    type db_link_cur is REF CURSOR; 
    cur db_link_cur; 
    v_status number; 
begin 
    open cur FOR v_query_link; 
    loop 
    fetch cur INTO v_status; 
    exit when cur%notfound; 
    dbms_output.put_line('v_status='||v_status); 
    return v_status; 
    end loop; 
    close cur; 
exception when others then 
    close cur; 
    return 0; 
end is_link_active; 

Enfin, vous pouvez créer une table my_db_links (id, name, status (0,1)) et le mettre à jour:

update 
    my_db_links mdl 
set 
    mdl.status = is_link_active(mdl.name);