SQL Server: Was ist zu tun, wenn ein Prozess einen anderen Prozess blockiert?

7

Ich bin ein versehentlicher DBA und lerne immer noch.

Was ist zu tun, wenn ich von DMV: s oder Activity Monitor sehe, dass ein Prozess einen anderen Prozess blockiert?

Sollte ich diese Prozesse einfach beenden oder gibt es eine Möglichkeit, diese Blockierung "freizugeben" oder vielleicht präventiv zu verhindern?

jrara
quelle

Antworten:

5

TÖTEN

Manchmal, ultra Gewalt ist die Antwort

Wie auch immer, ein Block ist nur eine Sperre, die zu lange andauert. "Zu lang" ist natürlich variabel. Wenn Sie Blockierungen über Sys-Prozesse oder DMVs sehen, ist diese fast immer "zu lang", da Blöcke vorübergehend und sehr kurz sein sollten

Wenn Sie eine messbare Blockierung haben, müssen Sie untersuchen, warum z. B. eine Transaktion mit langer Laufzeit

gbn
quelle
2
Sehr zitierfähige Antwort.
Nick Chammas
Vielen Dank, wenn die Blockierung beendet wird, wird die Transaktion zurückgesetzt (wie es nie geschehen ist) und die Daten (z. B. blockierte INSERT-Anweisung) werden nicht in die Datenbank geschrieben?
Jrara
@ jrara: ja und ja
gbn
7

Obwohl diese Frage bereits beantwortet und die Antwort akzeptiert wurde, werde ich versuchen, für den gegenteiligen Ansatz einzutreten ...

TÖTEN SIE NIEMALS EIN SPID BLIND

Wenn Sie nicht wissen, welche Arbeit SPID geleistet hat, haben Sie kein Verständnis für den Umfang des Rollbacks, den Sie einleiten möchten.

Die schlimmste Art von Blockierketten sind solche, die Ihr 24/7-System unerwartet in die Knie gezwungen haben. In 99% der Fälle handelt es sich bei der Abfrage am Anfang dieser Blockierungskette um eine einfache alte Auswahlabfrage, bei der alle Schreibaktivitäten dahinter in die Warteschlange gestellt werden. Unter diesen Umständen wird ein KILL den Tag retten.

In den anderen 1% der Fälle ist diese unerwünschte Abfrage der letzte Schritt in einer lang laufenden Transaktion, deren Rollback genauso lange dauert wie das Erreichen der aktuellen Phase. Es ist in 99% der Fälle unnötig, sich einen Moment Zeit zu nehmen, um zu verstehen, wie Sie hierher gekommen sind. In 1% der Fälle können Sie Minuten / Stunden / Tage Ausfallzeit sparen.

Mark Storey-Smith
quelle
1
+1. Es ist ein guter Punkt, um festzustellen, welcher Prozess aufgrund des Rollback-Problems abgebrochen werden muss.
Stanley Johns
Ein lang laufender TXN ist normalerweise kein großer TXN: Er kann beispielsweise durch ein Client-Befehlszeitüberschreitungsereignis verursacht werden. Und Sie müssen die SPID immer noch töten und sie muss in allen Fällen immer noch zurückgesetzt werden.
Gbn
Sie müssen es immer noch TÖTEN, es sei denn, Sie können den Block freigeben, beispielsweise durch ein Commit. Wenn Sie dies nicht können, haben Sie nicht viele Möglichkeiten: Wenn Sie SQL Server nicht stoppen möchten, löschen Sie MDF / LDF, starten Sie SQL Server neu und stellen Sie die Datenbank wieder her.
Gbn
1
Ich bin nicht einverstanden @gbn. Wenn der Prozess an der Spitze einer Blockierkette kurz vor dem Abschluss steht, warum sollte er dann beendet und ein Rollback erzwungen werden? Mein Punkt ist, dass es sich lohnt, sich einen Moment Zeit zu nehmen, um zu beurteilen, ob es kurz vor dem Abschluss steht, und daher die blockierenden Sperren freizugeben, anstatt es nur zu töten. Es kann sein, dass Töten die beste Option ist, aber es sollte nicht die Standardreaktion sein.
Mark Storey-Smith
4

Blockieren an und für sich ist nicht schlecht .

Das Problem tritt auf, wenn Sie Leistungsprobleme bei lang laufenden Transaktionen haben, die andere Transaktionen blockieren.

In diesem Fall würde ich versuchen, lang laufende Abfragen / Transaktionen zu identifizieren und diese Probleme zu beheben.

Wenn Sie Leistungsprobleme haben, versuchen Sie, die Grundursache und nicht das Symptom zu beheben.


Wenn Sie jedoch ein Problem mit der Produktion haben und es unbedingt stoppen müssen, verwenden Sie die KILL-Routine. (wie erwähnt).

Richard
quelle
1

Das Sperren ist normal. Es passiert die ganze Zeit mit Konflikten. Es ist das ständige Deadlocking, das ein Problem darstellt, da das Datenbankmodul einen Opferprozess auswählt, um die Transaktion zu beenden und zurückzusetzen. Statistiken belegen, dass dies zwangsläufig der Fall ist. Wenn dies jedoch ständig geschieht, müssen Sie einen Drilldown zu den Ursachen durchführen und Abfragen und Codelogik neu schreiben.

Thomas Stringer
quelle