Hilfe! Die Protokolldatei für die Datenbank 'tempdb' ist voll. Sichern Sie das Transaktionsprotokoll für die Datenbank, um Speicherplatz freizugeben

7

Wir führen SQL Server 2000 aus. In unserer Datenbank haben wir eine Tabelle "Bestellungen" mit ungefähr 750.000 Zeilen. Wir können einfache SELECT-Anweisungen für diese Tabelle ausführen. Wenn wir jedoch eine Abfrage wie SELECT TOP 100 * FROM Orders ORDER BY Date_Ordered DESC ausführen möchten, erhalten wir die folgende Meldung:

Fehler: 9002, Schweregrad: 17, Status: 6 Die Protokolldatei für die Datenbank 'tempdb' ist voll. Sichern Sie das Transaktionsprotokoll für die Datenbank, um Speicherplatz freizugeben.

Wir haben andere Tabellen in unserer Datenbank, deren Größe der Anzahl der in den Tabellen enthaltenen Datensätze entspricht (dh 700.000 Datensätze). In diesen Tabellen können wir alle Abfragen ausführen, die wir möchten, und wir erhalten nie eine Nachricht über "Tempdb ist voll".

Um dies zu beheben, haben wir unsere Datenbank gesichert, die eigentliche Datenbank verkleinert und auch die Datenbank und die Dateien in der Tempdb-Systemdatenbank verkleinert, aber das Problem wurde dadurch nicht behoben.

Die Größe unserer Protokolldatei ist auf Autogrow eingestellt.

Wir sind uns nicht sicher, wohin wir als nächstes gehen sollen. Gibt es Ideen, warum wir diese Nachricht möglicherweise noch erhalten?

Fehler: 9002, Schweregrad: 17, Status: 6 Die Protokolldatei für die Datenbank 'tempdb' ist voll. Sichern Sie das Transaktionsprotokoll für die Datenbank, um Speicherplatz freizugeben.

michael.lukatchik
quelle

Antworten:

6

Gemäß diesem Artikel wird die temporäre Datenbank verwendet, wenn für die Sortierung mehr Speicher erforderlich ist, als SQL Server zugewiesen hat.

Wenn Sie über eine Spalte sortieren, die nicht indiziert ist, führt der Datenbankserver einen vollständigen Tabellenscan durch und verfolgt alle Date_Ordered-Werte (und Primärschlüsselwerte) aller Datensätze in der Tabelle.

Erstellen Sie einen INDEX für Orders.Date_Ordered, um das Sortieren zu beschleunigen und die Speichernutzung zu reduzieren.

devio
quelle
1

Berücksichtigen Sie zusätzlich zu Devios Rat:

  • Müssen Sie wirklich SELECT * ausführen? Wenn Sie nur einige Spalten benötigen, buchstabieren Sie diese. Wenn Bestellungen eine sehr breite Tabelle sind, erhöht sich der Overhead für die Sortierung. Wenn es Blobs / Textfelder gibt, werden sie für die Fahrt mitgeschleppt.
  • Können Sie eine Datumsauswahl hinzufügen, z. B. WHERE Date_Ordered> getdate () -1; Selbst wenn Sie mehr Datensätze erhalten, als Sie benötigen, muss die gesamte Tabelle nicht nach Tempdb kopiert werden. du könntest so etwas tun

    SELECT TOP 100 * von (wählen Sie * aus Bestellungen, bei denen date_ordered> getdate () - 10) order by date_ordered desc

  • Das Hinzufügen eines Index für date_ordered ist jedoch bei weitem die beste Lösung.

SqlACID
quelle
1

OK, also erstes Problem, Sie benötigen mehr RAM in Ihrem SQL Server. Wie viel RAM ist in der Maschine installiert.

Danach müssen Sie die Größe der Festplatte erhöhen, auf der sich die Tempdb-Datenbank befindet. Diese Datenbank wird für alle Arten von Dingen verwendet und muss voll funktionsfähig sein, damit der gesamte SQL Server ordnungsgemäß funktioniert.

Starten Sie kurzfristig den SQL-Dienst neu, der die Tempdb-Datenbank löscht und sie in ihrer ursprünglichen Größe neu erstellt. Langfristig müssen Sie die Festplattengröße erhöhen, damit die Tempdb auf die Größe anwachsen kann, die sie benötigt.

mrdenny
quelle
0

Haben Sie genug Speicherplatz auf Ihrer Festplatte, der Tempdb-Dateien enthält?

Versuchen Sie, dieselbe Abfrage ohne order by-Klausel auszuführen, und prüfen Sie, ob der Fehler behoben ist.

Vinay Thakur
quelle