Delen via


Uitgestelde transacties (SQL Server)

Van toepassing op:SQL Server

In SQL Server Enterprise kan een beschadigde transactie worden uitgesteld als gegevens die nodig zijn voor terugdraaien (ongedaan maken) offline zijn tijdens het opstarten van de database. Een uitgestelde transactie is een transactie die niet wordt doorgevoerd wanneer de roll forward-fase is voltooid en die een fout heeft aangetroffen die verhindert dat deze wordt teruggedraaid. Omdat de transactie niet kan worden teruggedraaid, wordt deze uitgesteld.

Opmerking

Beschadigde transacties worden alleen uitgesteld in SQL Server Enterprise. In andere edities van SQL Server zorgt een beschadigde transactie ervoor dat het opstarten mislukt.

Over het algemeen treedt er een uitgestelde transactie op omdat, terwijl de database werd voortgezet, een I/O-fout verhinderde dat een vereiste pagina werd gelezen voor de transactie. Een fout op bestandsniveau kan echter ook uitgestelde transacties veroorzaken. Een uitgestelde transactie kan ook optreden wanneer een gedeeltelijke herstelreeks stopt op een punt waarop het terugdraaien van transacties noodzakelijk is en een transactie gegevens vereist die offline zijn.

Wanneer gebruikerstransacties worden teruggedraaid en een I/O-fout optreden, zorgt dit ervoor dat de hele database offline gaat. Wanneer de database weer online wordt gebracht, verwerft de redo opnieuw alle vergrendelingen die het had en voert het terugdraaien van alle niet-doorgevoerde transacties uit. Alle gegevens die door een transactie worden gewijzigd, blijven op de juiste wijze vergrendeld totdat de transactie kan worden teruggedraaid. Transacties die niet kunnen worden teruggedraaid, geven hun vergrendelingen op wanneer de beschadiging is opgelost en de database opnieuw is opgestart of, na een online herstel, wanneer de uitgestelde transacties worden opgelost terwijl de database online blijft. Tot dat moment kan een uitgestelde transactie vergrendelingen bevatten die voorkomen dat bepaalde bewerkingen in de database als geheel worden uitgevoerd. Als een uitgestelde transactie bijvoorbeeld een CREATE TABLE-instructie bevat, kan geen gebruiker een tabel maken totdat de uitgestelde transactie is opgelost.

Uitgestelde transacties kunnen ook optreden omdat een gedeeltelijke herstelactie een database herstelt naar een moment waarop een of meer actieve transacties van invloed zijn op een bestandsgroep die nog niet werd hersteld en offline is. Omdat de transacties niet kunnen worden teruggedraaid, worden ze uitgesteld.

De volgende tabel bevat de acties die ertoe leiden dat een database herstel uitvoert en het resultaat als er een I/O-probleem optreedt.

Handeling Oplossing (als er I/O-problemen optreden of vereiste gegevens offline zijn)
Server starten Uitgestelde transactie
Restore Uitgestelde transactie
Bijvoegen Bijvoegen mislukt
Autorestart Uitgestelde transactie
Database of momentopname van database maken Maken mislukt
Opnieuw uitvoeren bij databasespiegeling Uitgestelde transactie
Bestandsgroep is offline Uitgestelde transactie

Vereisten en beperkingen

  • De database moet het herstelmodel FULL of BULK-LOGGED gebruiken.
  • Ten minste één database- en logback-up moet zijn voltooid voor de database.
  • Uitgestelde transacties zijn niet van toepassing op fouten die zijn opgetreden tijdens het terugdraaien van een transactie nadat de database online is. (bijvoorbeeld een runtimefout)
  • Transacties kunnen niet worden uitgesteld voor herstelfouten tijdens een databasekoppeling
  • Sommige transacties zoals systeemtransacties (bijvoorbeeld paginatoewijzing) kunnen niet worden uitgesteld

Een transactie uit de DEFERRED-status verplaatsen

Belangrijk

Uitgestelde transacties houden het transactielogboek actief. Een virtueel logboekbestand dat uitgestelde transacties bevat, kan pas worden afgekapt als deze transacties buiten de uitgestelde status worden verplaatst. Zie Het transactielogboek (SQL Server) voor meer informatie over het afkappen van logboeken.

Als u de transactie uit de uitgestelde status wilt verplaatsen, moet de database zonder I/O-fouten op schone wijze worden gestart. Als er uitgestelde transacties bestaan, moet u de bron van de I/O-fouten oplossen. De beschikbare oplossingen, vermeld in de volgorde waarin ze doorgaans worden geprobeerd, zijn als volgt:

  • Start de database opnieuw op. Als het probleem tijdelijk was, moet de database beginnen zonder uitgestelde transacties.

  • Als de transacties zijn uitgesteld omdat een bestandsgroep offline was, brengt u de bestandsgroep weer online.

    Als u een offlinebestandsgroep weer online wilt brengen, gebruikt u de volgende Transact-SQL-instructie:

    RESTORE DATABASE database_name FILEGROUP=<filegroup_name>  
    
  • Herstel de database. Na een online herstel worden alle uitgestelde transacties opgelost.

    Als onder het volledige of bulksgewijs vastgelegde herstelmodel de uitgestelde transacties zijn veroorzaakt door slechts enkele beschadigde pagina's, kan een onlinepaginaherstel de fouten oplossen (indien ondersteund).

  • Als u geen bestandsgroep meer nodig hebt waarvan de offlinestatus uitgestelde transacties veroorzaakt, moet u de offline bestandsgroep defunct maken. Transacties die zijn uitgesteld omdat de bestandsgroep offline was, worden verplaatst uit de uitgestelde status nadat de bestandsgroep is afgetrokken.

    Belangrijk

    Een inactieve bestandsgroep kan nooit worden hersteld.

    Zie Defunct Filegroups (SQL Server) verwijderen voor meer informatie.

  • Als transacties zijn uitgesteld vanwege een slechte pagina en als er geen goede back-up van de database bestaat, gebruikt u het volgende proces om de database te herstellen:

    • Plaats de database eerst in de noodmodus door de volgende Transact-SQL instructie uit te voeren:

      ALTER DATABASE <database_name> SET EMERGENCY  
      

      Zie Databasestatussen voor informatie over de noodmodus.

    • Herstel vervolgens de database met behulp van de optie DBCC REPAIR_ALLOW_DATA_LOSS in een van de volgende DBCC-instructies: DBCC CHECKDB, DBCC CHECKALLOC of DBCC CHECKTABLE.

      Wanneer DBCC de onjuiste pagina tegenkomt, dealloceert DBCC deze en herstelt het eventuele gerelateerde fouten. Met deze methode kan de database weer online worden gebracht in een fysiek consistente status. Er kunnen echter ook extra gegevens verloren gaan; daarom moet deze aanpak als laatste redmiddel worden gebruikt.

Zie ook

Overzicht van herstel en herstel van gegevens (SQL Server)
Defunct-bestandsgroepen verwijderen (SQL Server)
Bestandsherstelacties (Volledig Herstelmodel)
Bestandsherstel (eenvoudig herstelmodel)
Pagina's herstellen (SQL Server)
Piecemeal Restores (SQL Server)
ALTER DATABASE (Transact-SQL)
RESTORE (Transact-SQL)