2008-11-18 6 views
2

En ce moment j'ai quelques nouvelles applications développées contre une base de données d'Oracle, et parfois elles se bloquent ou échouent pour finir correctement, etc ... de toute façon le problème est qu'elles semblent parfois laisser leurs connexions ouvertes, et je dois nettoyer après leur. Ma question est la suivante: y a-t-il un moyen d'identifier les connexions mortes et de les nettoyer?Comment puis-je nettoyer les connexions mortes en utilisant Oracle?

Répondre

3

Voici une page relative aux paramètres de délai de connexion que vous pouvez définir dans Oracle 11g. Je pense que le 'Abandon Connection Timeout' est ce que vous cherchez.

2

Vous pourriez également être intéressé par les tuer. L'exécution de ce script dans SQL * Plus vous donnera une liste d'instructions "kill". Vous pouvez choisir ceux que vous voulez tuer en fonction du Sid et les exécuter. Oracle a ses propres connexions internes, ne les tuez pas.

SELECT 'alter system kill session ''' || sid || ',' || serial# || ''';  ' || sql_id death 
FROM v$session 
/
+0

Merci pour le script! –

1

Je crois que vous êtes à la recherche du paramètre sqlnet.ora EXPIRE_TIME qui indique la base de données d'envoyer une sonde au client toutes les quelques minutes pour vérifier que la connexion est toujours en vie.

0

Voici comment identifier la session à tuer (vous aurez besoin de SID et SERIAL # pour le tuer). Devrais-je mentionner que vous devez vous assurer que vous tuez la bonne session? sys_context('userenv','sid') obtient le SID de votre propre session.

SELECT s.inst_id, 
     s.sid, 
     s.serial#, 
     p.spid, 
     s.username, 
     s.osuser, 
     s.program 
FROM gv$session s 
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id 
WHERE s.type != 'BACKGROUND'; 

Vous pouvez ensuite émettre alter system kill session '[sid],[serial#]' comme suggéré par WW.

Cependant la commande alter system kill session ne tue pas forcement la session, mais demande à la session de mourir. Si la session est vraiment bloquée, vous constaterez que la demande se bloque pendant 60 secondes et renvoie ORA-00031 Session marked for kill. Et la session est toujours là.

Dans ce cas, vérifiez d'abord que la session ne roule pas en arrière une opération importante (référence croisée du SID et de série de ce qui précède):

SELECT s.username, 
     s.osuser, 
     s.sid, 
     s.serial#, 
     t.used_ublk, 
     t.used_urec, 
     rs.segment_name, 
     r.rssize, 
     r.status 
FROM v$transaction t, 
     v$session s, 
     v$rollstat r, 
     dba_rollback_segs rs 
WHERE s.saddr = t.ses_addr 
AND t.xidusn = r.usn 
AND rs.segment_id = t.xidusn 
ORDER BY t.used_ublk DESC; 

Si une transaction roule en arrière, vous verrez USED_UREC décroissant. Laissez-le pour terminer la restauration.

Sinon, ALTER SYSTEM DISCONNECT SESSION '[sid],[serial#]' IMMEDIATE; déconnectera de force la session et annulera la transaction ouverte.

Toutes les informations ci-dessus proviennent de here.

Questions connexes