
On a tous vécu cette situation. Votre application se fige, aucune requête ne passe, et après quelques minutes d’investigation vous tombez sur une transaction ouverte depuis 11h45… et il est 12h30. Source du problème : une transaction non commitée lancée juste avant la pause déj 😄.
En tant que DBA, la solution est connue : identifier le bloqueur et killer sa session. Mais comment le faire automatiquement, sans intervention manuelle ? C’est exactement ce que permet le paramètre d’instance MAX_IDLE_BLOCKER_TIME.
Ce que fait ce paramètre
MAX_IDLE_BLOCKER_TIME définit la durée maximale (en minutes) pendant laquelle une session inactive peut bloquer d’autres sessions avant qu’Oracle ne la déconnecte automatiquement.
Contrairement à MAX_IDLE_TIME qui agit sur toutes les sessions inactives celui-ci est ciblé, il n’intervient que lorsqu’il y a blocage actif.
A noter que ce paramètre est disponible à partir de la version 19c, et il est modifiable à chaud.
Démonstration
Vérifier l’état actuel (0 = désactivé par défaut) :
SQL> SHOW PARAMETER max_idle_blocker_time
NAME TYPE VALUE
------------------------- -------- -----
max_idle_blocker_time integer 0Activer à 5 minutes (modifiable à chaud, et au niveau PDB) :
ALTER SYSTEM SET max_idle_blocker_time = 5;
Création d’une table de test et insertion des données :
- Création de la table
CREATE TABLE orders (
id NUMBER PRIMARY KEY,
client VARCHAR2(50),
statut VARCHAR2(20)
);
-- Insertion des données
INSERT INTO orders VALUES (1, 'Société Alpha', 'EN_COURS');
INSERT INTO orders VALUES (2, 'Société Beta', 'EN_ATTENTE');
INSERT INTO orders VALUES (3, 'Société Gamma', 'LIVRÉ');
COMMIT;Langage du code : JavaScript (javascript)Session 1 — UPDATE sans commit (le bloqueur) :
SQL> UPDATE orders SET statut = 'ANNULÉ' WHERE id = 2;
1 row updated.
/*L'utilisateur part sans commiter. Le verrou reste actif.*/Langage du code : JavaScript (javascript)Session 2 — tente de modifier la même ligne :
SQL> UPDATE orders SET statut = 'CONFIRMÉ' WHERE id = 2;
.................................
.................................
/*Bloquée ... jusqu'à ce qu'Oracle intervienne.*/Langage du code : JavaScript (javascript)Après 5 minutes, Oracle (via PMON) déconnecte automatiquement la Session 1 :
ERROR at line 1: ORA-03113: end-of-file on communication channel ProcessLa Session 2 est libérée et finalise son opération :
SQL> UPDATE orders SET statut = 'CONFIRMÉ' WHERE id = 2;
1 row updated.
SQL> COMMIT;
Commit complete.Langage du code : JavaScript (javascript)La déconnexion est tracée dans le fichier Alert de la BDD :
(4):KILL SESSION for sid=(62, 63915):
(4): Reason = max_idle_blocker_time parameter
(4): Mode = KILL HARD SAFE -/-/NO_REPLAY
(4): Requestor = PMON (orapid = 2, ospid = 18382, inst = 1)
(4): Owner = Process: USER (orapid = 86, ospid = 378221)
(4): Result = ORA-0
Langage du code : JavaScript (javascript)
Poster un Commentaire