Problemumgehung für SQL Server Frozen Ghost Cleanup erforderlich

15

Ich habe mehrere Tabellen mit einer Zeilenanzahl zwischen 5 und 1,5 GB

Jede Tabelle hat ein BLOB-Feld, dessen Größe von 100 Byte bis 30 MByte variiert und das als 'große Werttypen außerhalb der Zeile' = ON gespeichert wird

Tabellen werden in verschiedenen Dateigruppen mit jeweils 3-4 Dateien auf unterschiedlichen Platten @ unterschiedlichen LUNs @ sehr schnellem SAN gespeichert

Täglich wachsen diese Tabellen mit einer Größe von 5 bis 100 GB und 600.000 bis 1,5 Millionen Zeilen

Nach einer bestimmten Zeitspanne , die zwischen 2 Wochen und 6 Monaten liegt, werden einige der Zeilen gelöscht oder in die Archiv-DB verschoben. In Arbeitstabellen, die älter als 6 Monate sind, sind also keine Zeilen mehr vorhanden.

Aktuelle Konfiguration des Servers:

  • Das SQL Server-Modul ist 2008 R2 SP1 Enterprise mit 24 Kernen und 64 GB RAM
  • SQL Server wird mit zusätzlichen Startflags ausgeführt:

-T 3640; (Beseitigt das Senden von DONE_IN_PROC-Nachrichten an den Client für jede Anweisung in einer gespeicherten Prozedur. Dies ähnelt der Sitzungseinstellung von SET NOCOUNT ON, aber wenn es als Ablaufverfolgungsflag festgelegt ist, wird jede Clientsitzung auf diese Weise behandelt.)

-T 1118; (Ändert die Zuordnungen in tempDB von jeweils 1 pg (für die ersten 8 Seiten) in einem bestimmten Umfang.)

-T 2301; (Ermöglicht erweiterte Optimierungen, die für Entscheidungsunterstützungsabfragen spezifisch sind. Diese Option gilt für die Entscheidungsunterstützungsverarbeitung großer Datenmengen.)

-T 1117; (Vergrößert alle Datendateien auf einmal, ansonsten wechselt es ab.)

-E; (Erhöht die Anzahl der Speicherbereiche, die jeder Datei in einer Dateigruppe zugewiesen werden. Diese Option kann für Data Warehouse-Anwendungen hilfreich sein, bei denen eine begrenzte Anzahl von Benutzern Index- oder Datenscans ausführt.)

-T 834; (Veranlasst SQL Server, Windows-Zuordnungen für große Seiten für den für den Pufferpool zugewiesenen Speicher zu verwenden: http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )

  • SQL Server verwendet große Seitenerweiterungen
  • SQL Server verwendet die Option zur schnellen Dateiinitialisierung
  • AUTOSHRINK ist für alle Datenbanken deaktiviert

Das Problem ist, dass ab einem bestimmten Zeitpunkt der Server-Betriebszeit (von ein paar Tagen bis zu Monaten) GHOST CLEANUPkeine erzwungenen Bereinigungen durchgeführt werden müssen, sondern lediglich die üblichen Aufgaben ausgeführt werden müssen. Dies which is seen thru Extended Eventsist nicht geeignet , da mehrere Seiten in mehreren Sekunden bereinigt werden müssen ( ) Es ist nicht möglich, alle gelöschten Zeilen zu bereinigen

Das Problem besteht seit den Zeiten von SQL Server 2005 RTM Enterprise

Wie ich versucht habe, das Problem zu lösen:

  • Versucht, SCAN-Vorgänge für Clustered-Indizes der Tabellen zu erzwingen
  • Versucht, SCAN-Vorgänge zu erzwingen, die den gesamten Inhalt der BLOB-Spalte in Clustered-Indizes der Tabellen einbeziehen
  • system sp_clean_db_free_space & sp_clean_db_file_free_space
  • Manuelles Dbcc-Cleanpage (@dbid, @fileid, @page) für alle Dateien und Seiten in der Datenbank
  • Clustered-Index wird neu erstellt und organisiert
  • Datenbank neu erstellen
  • DBCC FORCEGHOSTCLEANUP

  • Wenn ich die Abfrage starte:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')

    Ich sehe Millionen und Dutzende von Millionen Geisterdatensätzen, aber nur für den Zuordnungseinheitentyp von LOB_DATA

Die einzigen Dinge, die helfen:

  • Stoppen des Servers mit dem Befehl SHUTDOWN oder Neustarten des gesamten Hosts - dies hilft, wenn nach dem Neustart der Prozess GHOST CLEANUP einige Stunden lang ausgeführt wird und alle Geisteraufzeichnungen tatsächlich bereinigt werden
  • DBCC SHRINKFILE mit EMPTYFILE-Option - Durch das Verschieben aller Daten von einer Datei in eine andere oder neu erstellte Datei werden nur Geisterdatensätze in dieser Datei bereinigt. Das Problem ist, dass ich Verkleinerungsoperationen wirklich hasse. Und das dauert 3-4 Tage für EINE Datei

Die Frage ist, ob es eine programmatische (vorzuziehende) oder wartungsbedingte Möglichkeit gibt, GHOST CLEANUP überhaupt ohne Serverausfall zu erzwingen, da Serverausfallzeiten zu viel kosten, auch wenn sie nicht akzeptabel sind. Sie liegen zwischen Tausenden und Zehntausenden US-Dollar pro Stunde

Probleme wurden gleichermaßen bemerkt, meine sind hier:

Und genau das ist hier:

Oleg Dok
quelle

Antworten:

12

Schließlich hat MS das Problem als Fehler erkannt: http://support.microsoft.com/kb/2622823

Kurz: Es ist behoben in

  • SQL Server 2008 SP3 CU4
  • SQL Server 2008 R2 CU10
  • SQL Server 2008 R2 SP1 CU4

In SQL Server 2012 SP1 tritt das Problem erst nach mehr als einem Jahr Laufzeit auf.

Oleg Dok
quelle
3

Dies ist die Art von Frage, die an CSS weitergeleitet werden sollte, damit diese das Problem mit Ihnen lösen können. Sie haben wahrscheinlich Software Assurance und einen Supportvertrag. Wenn Sie dies nicht tun, sollten ein paar hundert Dollar nicht so wichtig sein, wenn ein Neustart der Instanz Sie Tausende von Dollar pro Stunde kostet.

Haben Sie versucht, die Datenbank schließen und dann online schalten zu lassen? Dadurch wird die Wiederherstellung nach einem Absturz ausgeführt und möglicherweise wird die Geisterbereinigung ausgelöst.

Schreiben Sie häufig an den Tisch? Mit häufig meine ich die ganze Zeit?

In Bezug auf MSKB 932115 werden die Geisteraufzeichnungen nur in allen Dateien angezeigt, oder wird die erste Datei in der Dateigruppe bereinigt?

Warum die Verwendung von -T1117 und Instant File Init?

mrdenny
quelle
1. Ich werde auf jeden Fall zum MS-Support gehen. 2. Wenn ich die DB schließe, werden ca. 10 bis 30 Minuten vor und zurück gerollt, was nicht akzeptabel ist. 3. Der GC wird ausgeführt, verarbeitet jedoch keine gelöschten Off-Row-LOB-Einträge. 4. Schreiben in Tabellen, die abhängig von der Tageszeit ständig zwischen 20 und 600 Schreibvorgänge pro Sekunde ausführen. 5. Die erste Datei von DB wird nicht verwendet - sie hat keine großen Tabellen und wird nur als Systemspeicher verwendet. Es gibt also einfach keine Geisteraufzeichnungen.
Oleg Dok
mit -T1117 möchte ich nur die gesamte Last auf mehrere Dateien verteilen, stattdessen, wenn nur noch eine Datei aus der Dateigruppe übrig ist, wo noch freier Speicherplatz vorhanden ist - dies verlangsamt sich auf den LATCHes von PFS. weil ein Inkrement auf 10-50 GB pro Umdrehung eingestellt ist. Ich kann die Dateien nicht einfach so groß einstellen, wie ich kann, da dies völlig unvorhersehbar ist - welche Dateien erhalten ihre Daten heute und auf welchem ​​Datenträger. Es ist einfacher, SAN-Administratoren aufzufordern, mehr Speicherplatz hinzuzufügen, als vorherzusagen, zu wem ich den Speicherplatz hinzufügen soll.
Oleg Dok