Verzögerte Transaktionen

In SQL Server 2005 Enterprise Edition und höheren Versionen kann eine beschädigte Transaktion verzögert werden, wenn die für das Rollback (Rückgängig machen) erforderlichen Daten während des Starts offline sind. Bei einer verzögerten Transaktion handelt es sich um eine Transaktion, für die kein Commit ausgeführt wird, wenn die Rollforwardphase beendet wird, und bei der ein Fehler auftritt, sodass für die Transaktion kein Rollback ausgeführt werden kann. Da kein Rollback ausgeführt werden kann, wird die Transaktion verzögert.

HinweisHinweis

Beschädigte Transaktionen werden nur in SQL Server 2005 Enterprise Edition und höheren Versionen verzögert. In anderen Editionen von SQL Server kann eine beschädigte Transaktion nicht gestartet werden.

Eine verzögerte Transaktion tritt normalerweise dann auf, wenn für eine Datenbank ein Rollforward ausgeführt wird und durch einen E/A-Fehler verhindert wird, dass eine Seite, die für die Transaktion erforderlich ist, gelesen werden kann. Doch auch ein Fehler auf Dateiebene kann verzögerte Transaktionen zur Folge haben. Eine verzögerte Transaktion kann auch auftreten, wenn eine Teilwiederherstellungssequenz an einem Punkt angehalten wird, an dem ein Transaktionsrollback erforderlich ist und für eine Transaktion Daten erforderlich sind, die offline sind.

Bei Benutzertransaktionen, bei denen während des Rollbacks ein E/A-Fehler auftritt, wird die gesamte Datenbank in den Offlinezustand versetzt. Wird die Datenbank zurück in den Onlinezustand versetzt, werden beim Wiederherstellungsvorgang alle vorherigen Sperren wiederhergestellt, und es wird versucht, für alle Transaktionen, für die kein Commit ausgeführt wurde, ein Rollback auszuführen. Alle durch eine Transaktion geänderten Daten bleiben entsprechend gesperrt, bis für die Transaktion ein Rollback ausgeführt werden kann. Für Transaktionen, für die kein Rollback ausgeführt werden kann, werden die Sperren freigegeben, sobald der Fehler behoben und die Datenbank neu gestartet wurde, oder nachdem eine Onlinewiederherstellung erfolgt, wenn die verzögerten Transaktionen gelöst werden, während die Datenbank online bleibt. Bis zu diesem Zeitpunkt können die Sperren von einer verzögerten Transaktion aufrecht erhalten werden, wodurch bestimmte Vorgänge in der gesamten Datenbank verhindert werden. Wenn eine verzögerte Transaktion beispielsweise eine CREATE TABLE-Anweisung enthält, können Benutzer Tabellen erst nach dem Auflösen der verzögerten Transaktion erstellen.

Eine verzögerte Transaktion kann auch auftreten, weil eine Datenbank mit einer schrittweisen Wiederherstellung bis zu einem Zeitpunkt wiederhergestellt wird, an dem sich eine oder mehrere aktive Transaktionen auf eine Dateigruppe auswirken, die bislang nicht wiederhergestellt wurde und offline ist. Da kein Rollback ausgeführt werden kann, werden die Transaktionen verzögert.

In der folgenden Tabelle sind die Aktionen aufgeführt, die einen Wiederherstellungsvorgang der Datenbank verursachen. Die Tabelle veranschaulicht außerdem das Ergebnis von E/A-Fehlern.

Aktion

Lösung (bei E/A-Fehlern oder wenn erforderliche Daten offline sind)

Serverstart

Verzögerte Transaktion

Wiederherstellen

Verzögerte Transaktion

Anfügen

Anfügen erzeugt einen Fehler

AutoNeustart

Verzögerte Transaktion

Erstellen einer Datenbank oder eines Datenbanksnapshots

Erstellen erzeugt einen Fehler

Wiederholen bei Datenbankspiegelung

Verzögerte Transaktion

Dateigruppe ist offline

Verzögerte Transaktion

Beenden des VERZÖGERTEN Zustands einer Transaktion

Wichtiger HinweisWichtig

Das Transaktionsprotokoll bleibt bei verzögerten Transaktionen aktiv. Eine virtuelle Protokolldatei, in der verzögerte Transaktionen enthalten sind, kann erst abgeschnitten werden, wenn sich diese Transaktionen nicht mehr im Verzögerungsmodus befinden. Weitere Informationen zur Protokollkürzung finden Sie unter Abschneiden des Transaktionsprotokolls.

Damit der verzögerte Zustand der Transaktion beendet wird, muss die Datenbank ordnungsgemäß und ohne E/A-Fehler gestartet werden. Falls verzögerte Transaktionen vorhanden sind, müssen Sie die Ursache der E/A-Fehler beheben. Die verfügbaren Lösungen werden nachfolgend in der Reihenfolge aufgelistet, in der sie normalerweise versucht werden:

  • Starten Sie die Datenbank neu. Wenn es sich um ein vorübergehendes Problem gehandelt hat, sollte die Datenbank ohne verzögerte Transaktionen gestartet werden.

  • Wenn die Transaktionen verzögert wurden, weil eine Dateigruppe offline war, schalten Sie die Dateigruppe wieder online.

    Mithilfe der folgenden Transact-SQL-Anweisung können Sie eine Offlinedateigruppe wieder in den Onlinezustand versetzen:

    RESTORE DATABASE database_name FILEGROUP=<filegroup_name>
    
  • Stellen Sie die Datenbank wieder her. Nach einer Onlinewiederherstellung werden alle verzögerten Transaktionen aufgelöst.

    Wurden die verzögerten Transaktionen im Rahmen des Modells der vollständigen oder massenprotokollierten Wiederherstellung von einigen wenigen beschädigten Seiten verursacht, können die Fehler möglicherweise durch eine Onlinewiederherstellung der entsprechenden Seiten behoben werden (sofern diese unterstützt wird).

  • Wenn keine Dateigruppe mehr erforderlich ist, deren Offlinestatus zu verzögerten Transaktionen führt, setzen Sie die offline geschaltete Dateigruppe außer Kraft. Transaktionen, die sich verzögert haben, weil eine Dateigruppe offline ist, befinden sich, nachdem eine Dateigruppe außer Kraft gesetzt wird, nicht mehr im Verzögerungsmodus.

    Wichtiger HinweisWichtig

    Eine außer Kraft gesetzte Dateigruppe kann nicht wiederhergestellt werden.

    Weitere Informationen finden Sie unter Veraltete Dateigruppen.

  • Wenn Transaktionen aufgrund einer beschädigten Seite verzögert wurden und keine gute Sicherung der Datenbank vorhanden ist, müssen Sie zum Reparieren der Datenbank wie folgt vorgehen:

    • Versetzen Sie die Datenbank zunächst in den Notfallmodus. Führen Sie dazu die folgende Transact-SQL-Anweisung aus:

      ALTER DATABASE <database_name> SET EMERGENCY
      

      Informationen zum Notfallmodus finden Sie unter Datenbankstatus.

    • Reparieren Sie anschließend die Datenbank, indem Sie die Option DBCC REPAIR_ALLOW_DATA_LOSS in einer der folgenden DBCC-Anweisungen verwenden: DBCC CHECKDB, DBCC CHECKALLOC oder DBCC CHECKTABLE.

      Sobald DBCC auf die beschädigte Seite stößt, wird ihre Zuordnung aufgehoben, und es werden alle damit verbundenen Fehler repariert. Durch diesen Ansatz kann die Datenbank in einem physisch konsistenten Status wieder online geschaltet werden. Allerdings können dabei weitere Daten verloren gehen. Aus diesem Grund sollte dieser Ansatz nur als letzte Möglichkeit verwendet werden.