DBAtlas · Atlas für Datenbankbetrieb

Lang laufende Abfrage / lang laufender Job

Symptom

Eine einzelne Abfrage bzw. ein Job läuft seit Stunden, ohne fertig zu werden; sie verbraucht Ressourcen oder beeinträchtigt andere.

1. Abfrage und Laufzeit erfassen

Welche Abfrage, wie lange läuft sie schon, welcher Benutzer bzw. welche Anwendung?

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. Macht sie Fortschritte oder hängt sie

Läuft sie wirklich, oder wartet sie auf einen Lock? Prüfe die Fortschrittsanzeigen (Oracle v$session_longops, PG-Views pg_stat_progress_*). Wartet sie, wechsle zum Blocking-Playbook.

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. Entscheiden: warten oder abbrechen

Macht sie Fortschritte und ist bald fertig, warte (die Rollback-Kosten eines Abbruchs können alles noch verlängern). Hängt sie, läuft sie fehlerhaft oder beeinträchtigt sie die Produktion, beende sie. Bedenke vor dem Abbruch die Rollback-Dauer.

4. Bei Bedarf beenden

Breche bevorzugt nur die Abfrage ab (die Session bleibt bestehen); funktioniert das nicht, beende die 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. Dauerhaft beheben

Optimiere die Abfrage (Index, Plan, Paginierung/Batching), verlege schwere Jobs in lastarme Zeiten und führe sie bei Bedarf in Teilen aus. Erwäge für wiederkehrende Berichte eine Materialized View bzw. Read Replica.

In DBAtlas öffnen →