Teilen über


Verkleinern der tempdb-Datenbank

Gilt für: SQL Server Azure SQL Managed Instance

In diesem Artikel werden verschiedene Methoden erläutert, mit denen Sie die tempdb Datenbank in SQL Server verkleinern können.

Sie können eine der folgenden Methoden verwenden, um die Größe von tempdb zu verändern. Die ersten drei Optionen werden in diesem Artikel beschrieben. Wenn Sie SQL Server Management Studio (SSMS) verwenden möchten, befolgen Sie die Anweisungen unter Datenbank verkleinern.

Methode Neustart erforderlich? Weitere Informationen
ALTER DATABASE Ja Bietet vollständige Kontrolle über die Größe der Standarddateien tempdb (tempdev und templog).
DBCC SHRINKDATABASE No Arbeitet auf Datenbankebene.
DBCC SHRINKFILE No Mit dieser Option können Sie einzelne Dateien verkleinern.
SQL Server Management Studio No Verkleinern sie Datenbankdateien über eine grafische Benutzeroberfläche.

Hinweise

Standardmäßig ist die tempdb Datenbank so konfiguriert, dass sie bei Bedarf automatisch wächst. Daher kann diese Datenbank unerwartet auf eine Größe größer als die gewünschte Größe wachsen. Größere tempdb Datenbankgrößen wirken sich nicht negativ auf die Leistung von SQL Server aus.

Wenn SQL Server gestartet wird, wird mithilfe einer Kopie der model Datenbank tempdb neu erstellt und tempdb auf die zuletzt konfigurierte Größe zurückgesetzt. Die konfigurierte Größe ist die letzte explizite Größe, die mithilfe eines Vorgangs zum Ändern der Dateigröße festgelegt wurde, z. B. ALTER DATABASE, die die MODIFY FILE Option oder die DBCC SHRINKFILE oder DBCC SHRINKDATABASE Anweisungen verwendet. Es sei denn, Sie müssen unterschiedliche Werte verwenden oder eine sofortige Auflösung für eine große tempdb Datenbank erhalten, können Sie auf den nächsten Neustart des SQL Server-Diensts warten, bis die Größe verringert wird.

Sie können tempdb verkleinern, während die tempdb Aktivität fortgesetzt wird. Es kann jedoch vorkommen, dass andere Fehler auftreten, z. B. Blockieren, Deadlocks usw., die verhindern können, dass die Verkleinerung nicht abgeschlossen wird. Um sicherzustellen, dass eine Verkleinerung von tempdb erfolgreich ist, empfehlen wir daher, dies zu tun, während sich der Server im Einzelbenutzermodus befindet oder wenn Sie alle tempdb Aktivitäten beenden.

SQL Server zeichnet nur genügend Informationen im tempdb Transaktionsprotokoll auf, um ein Rollback einer Transaktion durchzuführen, aber nicht zum Wiederholen von Transaktionen während der Datenbankwiederherstellung. Dieses Feature erhöht die Leistung von INSERT Anweisungen in tempdb. Darüber hinaus müssen Sie keine Informationen protokollieren, um Transaktionen zu wiederholen, da tempdb jedes Mal neu erstellt wird, wenn Sie SQL Server neu starten. Daher gibt es keine Transaktionen zum Weiterleiten oder Zurücksetzen.

Weitere Informationen zum Verwalten und Überwachen von tempdb finden Sie unter Kapazitätsplanung und Überwachen der tempdb-Verwendung.

Verwenden Sie den ALTER DATABASE-Befehl

Hinweis

Dieser Befehl wird nur für die logischen Standarddateien tempdb tempdev und templog ausgeführt. Wenn weitere Dateien zu tempdb hinzugefügt werden, können Sie sie nach dem Neustart von SQL Server als Dienst verkleinern. Alle tempdb Dateien werden während des Starts neu erstellt. Sie sind jedoch leer und können entfernt werden. Wenn Sie weitere Dateien in tempdb entfernen möchten, verwenden Sie den ALTER DATABASE Befehl mit der REMOVE FILE Option.

Für diese Methode müssen Sie SQL Server neu starten.

  1. Beenden Sie SQL Server.

  2. Starten Sie an einer Eingabeaufforderung die Instanz im Minimalkonfigurationsmodus. Gehen Sie dazu wie folgt vor:

    1. Ändern Sie an einer Eingabeaufforderung in den Ordner, in dem SQL Server installiert ist (<VersionNumber> und <InstanceName> im folgenden Beispiel ersetzen):

      cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binn
      
    2. Wenn es sich bei der Instanz um eine benannte Instanz von SQL Server handelt, führen Sie den folgenden Befehl aus (<InstanceName> im folgenden Beispiel ersetzen):

      sqlservr.exe -s <InstanceName> -c -f -mSQLCMD
      
    3. Wenn die Instanz die Standardinstanz von SQL Server ist, führen Sie den folgenden Befehl aus:

      sqlservr -c -f -mSQLCMD
      

      Hinweis

      Die Parameter -c und -f führen dazu, dass SQL Server in einem Minimalkonfigurationsmodus mit einer tempdb Größe von 1 MB für die Datendatei und 0,5 MB für die Protokolldatei gestartet wird. Der -mSQLCMD Parameter verhindert, dass eine andere Anwendung als sqlcmd die Einzelbenutzerverbindung übernimmt.

  3. Stellen Sie eine Verbindung mit sqlcmd her und führen Sie dann die folgenden Transact-SQL-Befehle aus. <target_size_in_MB> durch die gewünschte Größe ersetzen:

    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'tempdev', SIZE = <target_size_in_MB>);
    
    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'templog', SIZE = <target_size_in_MB>);
    
  4. Beenden Sie SQL Server. Drücken Sie dazu Ctrl+C im Eingabeaufforderungsfenster, starten Sie SQL Server als Dienst neu, und überprüfen Sie dann die Größe der Dateien tempdb.mdf und templog.ldf.

Verwenden des BEFEHLS DBCC SHRINKDATABASE

DBCC SHRINKDATABASE empfängt den Parameter target_percent. Dies ist der gewünschte Prozentsatz an freiem Speicherplatz, der in der Datenbankdatei übrig ist, nachdem die Datenbank verkleinert wurde. Wenn Sie DBCC SHRINKDATABASE verwenden, müssen Sie SQL Server möglicherweise neu starten.

  1. Ermitteln Sie den aktuell in tempdb verwendeten Speicherplatz mithilfe der sp_spaceused gespeicherten Prozedur. Berechnen Sie dann den Prozentsatz des freien Speicherplatzes, der als Parameter für DBCC SHRINKDATABASE verwendet werden soll. Diese Berechnung basiert auf der gewünschten Datenbankgröße.

    Hinweis

    In einigen Fällen müssen Sie möglicherweise sp_spaceused @updateusage = true ausführen, um den verwendeten Speicherplatz neu zu berechnen und einen aktualisierten Bericht zu erhalten. Weitere Informationen finden Sie unter sp_spaceused.

    Betrachten Sie das folgende Beispiel:

    Gehen Sie davon aus, dass in tempdb zwei Dateien vorhanden sind: die primäre Datendatei (tempdb.mdf), die 1.024 MB beträgt, und die Protokolldatei (tempdb.ldf), die 360 MB beträgt. Gehen Sie davon aus, dass in sp_spaceused die primäre Datendatei mit 600 MB Daten enthalten ist. Gehen Sie außerdem davon aus, dass Sie die primäre Datendatei auf 800 MB verkleinern möchten. Berechnen Sie den gewünschten Prozentsatz des freien Speicherplatzes nach dem Verkleinern: 800 MB - 600 MB = 200 MB. Teilen Sie jetzt 200 MB durch 800 MB = 25 Prozent, und das ist Ihre target_percent. Die Transaktionsprotokolldatei wird entsprechend verkleinert, sodass 25 Prozent oder 200 MB Speicherplatz frei bleiben, nachdem die Datenbank verkleinert wurde.

  2. Stellen Sie eine Verbindung mit SQL Server mit SSMS, Azure Data Studio oder sqlcmd her, und führen Sie dann den folgenden Transact-SQL-Befehl aus. <target_percent> durch den gewünschten Prozentsatz ersetzen:

    DBCC SHRINKDATABASE (tempdb, '<target_percent>');
    

Es gibt Einschränkungen mit dem DBCC SHRINKDATABASE Befehl auf tempdb. Die Zielgröße für Daten- und Protokolldateien darf nicht kleiner als die Größe sein, die beim Erstellen der Datenbank angegeben wurde, oder kleiner als die letzte Größe, die explizit mit einem Dateigrößenänderungsvorgang festgelegt wurde, z . B. ALTER DATABASE, die die Option MODIFY FILE verwendet. Eine weitere Einschränkung von DBCC SHRINKDATABASE ist die Berechnung des target_percentage Parameters und dessen Abhängigkeit vom aktuellen Raum, der verwendet wird.

Verwenden des Befehls DBCC SHRINKFILE

Verwenden Sie den DBCC SHRINKFILE Befehl, um die einzelnen tempdb Dateien zu verkleinern. DBCC SHRINKFILE bietet mehr Flexibilität als DBCC SHRINKDATABASE, weil Sie sie in einer einzelnen Datenbankdatei verwenden können, ohne dass sich dies auf andere Dateien auswirkt, die derselben Datenbank angehören. DBCC SHRINKFILE empfängt den target_size Parameter. Dies ist die gewünschte endgültige Größe für die Datenbankdatei.

  1. Bestimmen Sie die gewünschte Größe für die primäre Datendatei (tempdb.mdf), die Protokolldatei (templog.ldf) und zusätzliche Dateien, die tempdb hinzugefügt werden. Stellen Sie sicher, dass der in den Dateien verwendete Speicherplatz kleiner oder gleich der gewünschten Zielgröße ist.

  2. Stellen Sie eine Verbindung mit SQL Server mit SSMS, Azure Data Studio oder sqlcmd her und führen Sie dann die folgenden Transact-SQL-Befehle für die spezifischen Datenbankdateien aus, die Sie verkleinern möchten. <target_size_in_MB> durch die gewünschte Größe ersetzen:

    USE tempdb;
    GO
    
    -- This command shrinks the primary data file
    DBCC SHRINKFILE (tempdev, '<target_size_in_MB>');
    GO
    
    -- This command shrinks the log file, examine the last paragraph.
    DBCC SHRINKFILE (templog, '<target_size_in_MB>');
    GO
    

Ein Vorteil von DBCC SHRINKFILE ist, dass die Größe einer Datei auf eine Größe reduziert werden kann, die kleiner als die Originalgröße ist. Sie können DBCC SHRINKFILE auf einer der Daten- oder Protokolldateien erstellen. Sie können die Datenbank nicht kleiner als die Größe der model Datenbank machen.

Fehler 8909 beim Ausführen von Verkleinerungsvorgängen

Wenn tempdb verwendet wird und Sie versuchen, sie mithilfe der Befehle DBCC SHRINKDATABASE oder DBCC SHRINKFILE zu verkleinern, erhalten Sie möglicherweise Nachrichten, die in Abhängigkeit von der verwendeten SQL Server-Version wie folgt aussehen:

Server: Msg 8909, Level 16, State 1, Line 1 Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (6:8040) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).

Dieser Fehler zeigt keine echte Beschädigung in tempdb. Es kann jedoch andere Gründe für physische Datenbeschädigungsfehler wie Fehler 8909 geben, und es kann sein, dass diese Gründe E/A-Subsystemprobleme enthalten. Wenn der Fehler außerhalb von Verkleinerungsvorgängen auftritt, sollten Sie daher weitere Untersuchungen durchführen.

Obwohl eine 8909-Nachricht an die Anwendung oder an den Benutzer zurückgegeben wird, der den Verkleinerungsvorgang ausführt, schlagen die Verkleinerungsvorgänge nicht fehl.