DBAtlas · Atlas d'exploitation des bases de données

Requête / job de longue durée

Symptôme

Une seule requête/un seul job tourne depuis des heures sans se terminer ; il consomme des ressources ou affecte les autres.

1. Identifiez la requête et sa durée

Quelle requête, depuis combien de temps tourne-t-elle, quel utilisateur/quelle application ?

Oracle

SELECT sid, serial#, sql_id, last_call_et/60 running_min, username FROM v$session WHERE status='ACTIVE' AND type='USER' ORDER BY last_call_et DESC;

PostgreSQL

SELECT pid, now()-query_start dur, usename, query FROM pg_stat_activity WHERE state='active' ORDER BY query_start;

MySQL

SELECT id, user, time, state, info FROM information_schema.processlist WHERE command='Query' ORDER BY time DESC;

SQL Server

SELECT session_id, total_elapsed_time/1000 sec, status, command FROM sys.dm_exec_requests WHERE session_id IN (SELECT session_id FROM sys.dm_exec_sessions WHERE is_user_process = 1) ORDER BY total_elapsed_time DESC;

MongoDB

db.currentOp({ active: true, secs_running: { $gt: 60 } })

2. Progresse-t-elle ou est-elle bloquée

S'exécute-t-elle vraiment, ou attend-elle un verrou ? Consultez les indicateurs de progression (Oracle v$session_longops, vues PG pg_stat_progress_*). Si elle attend, passez au playbook Blocages.

Oracle

SELECT sid, opname, sofar, totalwork, ROUND(sofar/NULLIF(totalwork,0)*100,1) pct, time_remaining FROM v$session_longops WHERE sofar<totalwork;

PostgreSQL

SELECT * FROM pg_stat_progress_create_index;  -- or pg_stat_progress_vacuum / _cluster / _analyze

3. Décidez : attendre ou annuler

Si elle progresse et va bientôt se terminer, attendez (le coût du rollback d'une annulation peut prendre encore plus de temps). Si elle est bloquée, s'exécute de manière incorrecte ou affecte la production, terminez-la. Tenez compte de la durée du rollback avant d'annuler.

4. Terminez-la si nécessaire

Préférez annuler uniquement la requête (en conservant la session) ; si cela ne fonctionne pas, tuez la session.

Oracle

ALTER SYSTEM CANCEL SQL 'sid,serial#';  -- 18c+; otherwise KILL SESSION

PostgreSQL

SELECT pg_cancel_backend(pid);  -- otherwise pg_terminate_backend(pid)

MySQL

KILL QUERY <id>;

SQL Server

KILL <session_id>;

MongoDB

db.killOp(<opid>)

5. Corrigez durablement

Optimisez la requête (index, plan, pagination/traitement par lots), déplacez les jobs lourds hors des heures de pointe et, si besoin, exécutez-les par morceaux. Pour les rapports récurrents, envisagez une vue matérialisée / un réplica en lecture.

Ouvrir dans DBAtlas →