Bereinigung des TempDB-Versionsspeichers

7

Soweit ich weiß, werden im Versionsspeicher nur Versionen bereinigt, die älter als die älteste aktive Transaktion sind. Frage: Ist die älteste Transaktionsdatenbank spezifisch oder behält SQL Server alle Versionen unabhängig von der Datenbank bei, wenn noch eine ältere Transaktion aktiv ist?

Hintergrundgeschichte - SQL Server 2005 SP4 Enterprise mit rund 40 Datenbanken. TempDB ist derzeit 102 GB, der Versionsspeicher ist rund 98 GB. Eine der auf der Datenbankinstanz gehosteten Anwendungen verfügt über eine offene Transaktion, die 40 Tage alt ist und auf sys.dm ... database_transactions basiert. Zwei separate große Datenbanken waren im letzten Monat extrem stark ausgelastet, und wir sahen ein konsistentes TempDB-Wachstum, das mit diesen Vorgängen zusammenfiel. Wir haben ein gewisses Wachstum erwartet. Wir haben nicht erwartet, dass es weiter wächst. Frage: Sind die im Versionsspeicher von TempDB gespeicherten Versionen dieser beiden separaten Datenbanken noch vorhanden, da eine dritte unabhängige Datenbank eine Verbindung hat, die 40 Tage alt ist und einen offenen Transaktionsstatus anzeigt?

Perfmon-Zähler: Der Versionsspeicher wächst in den wenigen Stunden, die ich heute Morgen verfolgt habe, kontinuierlich. Versionsgenerierungsrate AVG liegt bei 30 kb / s, die Versionsbereinigungsrate bei 0 kb / s.

Viel Platz für TempDB übrig, es gibt rund 300 GB Gesamtdatendateien für alle Benutzerdatenbanken. TempDB ist seit dem letzten Neustart für jede seiner 8 Datendateien um durchschnittlich 350 MB pro Tag gewachsen. Dieses Verhalten ist abnormal und die Untersuchung ergab, dass der große Versionsspeicher vorhanden ist

Antworten auf Kommentarfragen, um keinen langen Kommentarbereich zu haben:

F: Warum Auto-Wachstum auf Tempdb? A: TempDB wird auf eine Größe initialisiert, die wir für die meiste Zeit als geeignet befunden haben. Wir erlauben automatisches Wachstum, um abnormale Datenbankaktivitäten zu verarbeiten. Wir überwachen auch das automatische Wachstum.

F: Woher wissen Sie, dass die Transaktion aktiv ist und nicht nur eine aktive Verbindung? A: transaction_state sagt aktiv in sys.dm_tran_active_snapshot_database_transactions und anderen Dingen. Aktivitätsmonitor sagt, dass jede Verbindung 1 offene Transaktion hat.

F: Warum ist deine App so dumm? A: Sein Dritter. Einer von vielen in diesem Fall. Ich weiß nicht, ob das Verhalten abnormal ist oder leicht behoben werden kann.

AUFLÖSUNG

Die offenen Transaktionen, bei denen eine Bereinigung des Versionsspeichers verhindert wurde, so dass Jon Recht hatte, werden die Bereinigung des Versionsspeichers unabhängig von den Datenbanken durchgeführt. Durch das Schließen der fehlerhaften Transaktionen konnte die Bereinigung des Versionsspeichers beginnen. Die aktuelle Theorie dahinter stammt von Jon Seigel

Der Versionsspeicher kann nur Versionen löschen, die auf der ältesten aktiven Transaktion innerhalb der gesamten Instanz basieren, um die Verwendung der Snapshot-Isolation auf Transaktionsebene für mehrere Datenbanken gleichzeitig zu unterstützen.

Wenn jemand dies mit Sicherheit weiß oder beweisen kann, tun Sie dies bitte

Referenzierte Frage: Finden Sie Transaktionen, die den Versionsspeicher füllen

Referenzierte Dokumente:
TempDB 2005 WP
Teratrax-Tuning tempDB
Idera Demystify Tempdb

Cougar9000
quelle
2
Nur weil eine Verbindung schon lange offen ist, heißt das noch lange nicht, dass eine Transaktion aktiv ist. Welches ist es? Wollen Sie damit sagen, dass es eine Transaktion gibt, die seit 40 Tagen aktiv ist?
Jon Seigel
1
Warum lässt du tempdb kontinuierlich automatisch wachsen? Ich hoffe, es ist nicht die Standardeinstellung, aber wenn Sie wissen, dass Tempdb mit dieser Geschwindigkeit wächst, bis Sie das Problem mit dem Versionsspeicher gelöst haben, wäre es nicht sinnvoll, es einmal proaktiv zu vergrößern, anstatt um 1000 Autogrows zu sterben?
Aaron Bertrand
@ Cougar9000 aber warum irgendwelche Wachstumsereignisse pro Tag?
Aaron Bertrand
Was ist aus dieser Abfrage der begin_timeWert für die aktive Transaktion?
Jon Seigel
1
" Eine der auf der Datenbankinstanz gehosteten Anwendungen hat eine offene Transaktion, die 40 Tage alt ist. " Dies kann Ihren Backups auch keinen Gefallen tun. Im Ernst, die beste Lösung hier ist, damit aufzuhören . Jedes Programm oder Produkt, das eine Transaktion für so lange Zeiträume offen hält, ist sehr kaputt.
RBarryYoung

Antworten:

5

(Hinweis: Dies ist keine 100% sichere Antwort, und ich habe keine Referenzen. Lassen Sie mich wissen, ob Sie das Gegenteil beweisen können.)

Der Versionsspeicher kann nur Versionen löschen, die auf der ältesten aktiven Transaktion innerhalb der gesamten Instanz basieren , um die Verwendung der Snapshot-Isolation auf Transaktionsebene für mehrere Datenbanken gleichzeitig zu unterstützen. Das würde einfach nicht funktionieren, wenn "alte" Versionen innerhalb einer Datenbank mitten in der Snapshot-Transaktion einer anderen Datenbank gelöscht würden.

Wenn es also eine sehr alte offene Transaktion gibt, kann der Versionsspeicher erst gelöscht werden, wenn diese Transaktion entweder festgeschrieben oder zurückgesetzt wird.

Jon Seigel
quelle
Danke Jon. Ich werde mich mit den App-Benutzern
abstimmen,
@ Cougar9000: Okay. Auch hier wäre ich sehr vorsichtig, wenn ich sie zurücksetzen würde, da das Zurücksetzen viel zusätzliche Arbeit auf der SQL-Seite erfordern könnte.
Jon Seigel
Ja, immer vorsichtig. Ich mache eine ziemlich umfangreiche Untersuchung durch, bevor ich irgendetwas in der Datenbank töte. Ihre Konversation und Kommentare haben mir geholfen, diesen Benutzer und diese Anwendung als Hauptverdächtigen bei der Verhinderung der Bereinigung des
Versionsspeichers zu
4

Ist die älteste Transaktionsdatenbank spezifisch oder behält SQL Server alle Versionen unabhängig von der Datenbank bei, wenn eine ältere Transaktion noch aktiv ist?

SQL Server stellt sicher, dass alle erforderlichen Zeilenversionen beibehalten werden.

  • Der Versionsspeicher wird von allen Datenbanken in der Instanz gemeinsam genutzt.
  • Der Versionsspeicher besteht aus einer Reihe von "nur anhängenden" Speichereinheiten (ASUs).
  • Bei Bedarf wird jede Minute eine neue ASU erstellt.
  • Eine neue ASU wird nicht erstellt, wenn keine Zeilenversionen generiert werden.
  • Die aktuelle ASU ist beim Start einer Transaktion zugeordnet.
  • Eine Transaktion schreibt weiterhin Zeilenversionen in dieselbe ASU, bis sie abgeschlossen ist.
  • Eine ASU enthält im Allgemeinen Zeilenversionen aus vielen Sitzungen, Datenbanken, Tabellen und Indizes.
  • Einzelne Zeilenversionen werden nicht entfernt, sondern nur vollständige ASUs.
  • Eine ASU wird nur entfernt, wenn SQL Server garantieren kann , dass sie nicht mehr benötigt wird.
  • Die ASU-Bereinigung wird von einem Hintergrundthread durchgeführt, der jede Minute aktiviert wird.

Um diesen letzten Punkt zu erweitern, kann eine ASU nur entfernt werden, wenn:

  1. Alle Transaktionen, die auf diese ASU abzielen, wurden abgeschlossen.
  2. Alle Transaktionen, für die möglicherweise Versionen von dieser ASU erforderlich sind, wurden abgeschlossen.
  3. Alle früheren ASUs wurden entfernt.

Weitere Informationen finden Sie in den folgenden Ressourcen:

Ressourcennutzung bei der Zeilenversionierung - MSDN
Arbeiten mit Tempdb in SQL Server 2005 (Word-Dokument)

Eine Reihe von Blog-Artikeln von Sunil Argawal vom SQL Server Storage Engine-Team:

Grundlagen des
Versionsspeichers Logische Struktur des
Versionsspeichers Wachstum des Versionsspeichers und Entfernen veralteter Versionen

Paul White 9
quelle