21/04/2022Voici une requête listant les verrous (locks) posés sur les tables d'une base de données Oracle.
Cette requête croise les tables contenant les requêtes exécutées et les sessions en cours afin de déterminer quelle requête de quelle session provoque un blocage.
WITH liste_requetes AS
(
SELECT s.sql_text, s.address, s.hash_value, s.piece
FROM v$sqltext s
ORDER BY s.piece
)
SELECT
prev_exec_start, c.owner, c.object_type, c.object_name,
b.status, b.machine, b.osuser, b.program,
b.SID ||','|| b.SERIAL# ||',@'|| b.INST_ID AS ident_session,
(SELECT LISTAGG(sql_text, ', ') WITHIN GROUP (ORDER BY piece) FROM
liste_requetes r WHERE r.address = b.sql_address AND r.hash_value =
b.sql_hash_value ) AS SQL
FROM v$locked_object a
INNER JOIN gv$session b ON b.sid = a.session_id
INNER JOIN dba_objects c ON a.object_id = c.object_id
WHERE b.STATUS = 'ACTIVE'
ORDER BY logon_time
Si besoin, en utilisant le champ concaténant SID, SERIAL et INST_I (nommé ident_session), il est possible de fermer la session bloquante :
ALTER system DISCONNECT SESSION '<ident_session>' IMMEDIATE
La requête suivante permet de générer les lignes pour fermer les sessions ouvertes depuis plus de 5 minutes (300 secondes) :
SELECT 'ALTER system DISCONNECT SESSION ''' || SID ||','|| SERIAL# ||',@'|| INST_ID || ''' IMMEDIATE;'
FROM gv$session
WHERE (SYSDATE - LOGON_TIME)*86400 > 300
Dernière modification le 21/04/2022 - Quillevere.net