Uppskjutna transaktioner (SQL Server)
gäller för:SQL Server
I SQL Server Enterprise kan en skadad transaktion skjutas upp om data som krävs av återställning (ångra) är offline under databasstarten. En uppskjuten transaktion är en transaktion som förblir obekräftad när framåtrullningsfasen är klar och som har påträffat ett fel som förhindrar att den rullas tillbaka. Eftersom transaktionen inte kan återställas skjuts den upp.
Not
Korrupta transaktioner skjuts endast upp i SQL Server Enterprise. I andra utgåvor av SQL Server gör en skadad transaktion att start misslyckas.
I allmänhet inträffar en uppskjuten transaktion eftersom ett I/O-fel förhindrade läsning av en sida som krävdes av transaktionen medan databasen rullades framåt. Ett fel på filnivå kan dock också orsaka uppskjutna transaktioner. En uppskjuten transaktion kan också inträffa när en partiell återställningssekvens stoppas vid en punkt där transaktionsåterställningen är nödvändig och en transaktion kräver data som är offline.
Användartransaktioner som återkallas och drabbas av ett I/O-fel orsakar att hela databasen går offline. När databasen är online igen, återtar redo alla lås den hade och försöker rulla tillbaka alla ogenomförda transaktioner. Alla data som ändras av en transaktion förblir korrekt låsta tills transaktionen kan återställas. Transaktioner som inte kan återställas ger upp sina lås när skadan har åtgärdats och databasen startas om eller, efter en onlineåterställning, när de uppskjutna transaktionerna löses medan databasen förblir online. Fram till dess kan en uppskjuten transaktion innehålla lås som förhindrar vissa åtgärder i databasen som helhet. Om en uppskjuten transaktion till exempel innehåller en CREATE TABLE-instruktion kan ingen användare skapa en tabell förrän den uppskjutna transaktionen har lösts.
Uppskjuten transaktion kan också inträffa eftersom en bitåterställning återställer en databas till en punkt där en eller flera aktiva transaktioner påverkar en filgrupp som ännu inte har återställts och är offline. Eftersom transaktionerna inte kan återställas skjuts de upp.
I följande tabell visas de åtgärder som gör att en databas utför återställning och resultatet om ett I/O-problem uppstår.
Åtgärd | Lösning (om I/O-problem uppstår eller nödvändiga data är offline) |
---|---|
Serverstart | Uppskjuten transaktion |
Återställa | Uppskjuten transaktion |
Bifoga | Det går inte att ansluta |
Starta automatiskt | Uppskjuten transaktion |
Skapa databas- eller databasögonblicksbild | Skapandet misslyckas |
Omstart av databasspegling | Uppskjuten transaktion |
Filgruppen är offline | Uppskjuten transaktion |
Krav och begränsningar
- Databasen måste använda återställningsmodellen FULL eller BULK-LOGGED.
- Minst en databas och loggsäkerhetskopia måste ha slutförts för databasen
- Uppskjutna transaktioner gäller inte för fel som påträffas under en återställning av en transaktion när databasen är online. (t.ex. ett körfel)
- Transaktioner kan inte skjutas upp för återställningsfel under en databasanslutning
- Vissa transaktioner som systemtransaktioner (t.ex. sidallokering) kan inte skjutas upp
Flytta en transaktion från uppskjuten status
Viktig
Uppskjutna transaktioner håller transaktionsloggen aktiv. En virtuell loggfil som innehåller uppskjutna transaktioner kan inte trunkeras förrän dessa transaktioner har flyttats från det uppskjutna läget. Mer information om loggtrunkering finns i Transaktionsloggen (SQL Server).
För att flytta transaktionen från det uppskjutna läget måste databasen starta rent utan några I/O-fel. Om det finns uppskjutna transaktioner måste du åtgärda källan till I/O-felen. De tillgängliga lösningarna, som anges i den ordning de vanligtvis provas, är följande:
Starta om databasen. Om problemet var tillfälligt bör databasen starta utan uppskjutna transaktioner.
Om transaktionerna sköts upp på grund av att en filgrupp var offline kan du aktivera filgruppen igen.
Om du vill ansluta en offlinefilgrupp igen använder du följande Transact-SQL-instruktion:
RESTORE DATABASE database_name FILEGROUP=<filegroup_name>
Återställ databasen. Efter en onlineåterställning löses eventuella uppskjutna transaktioner.
Om de uppskjutna transaktionerna bara orsakades av några skadade sidor under den fullständiga eller massloggade återställningsmodellen kan en återställning av onlinesidan lösa felen (där det stöds).
Om du inte längre behöver en filgrupp vars offline-status orsakar uppskjutna transaktioner, gör offline-filgruppen oanvändbar. Transaktioner som skjutits upp eftersom filgruppen var offline flyttas från det uppskjutna tillståndet efter att filgruppen har upphört att fungera.
Viktig
En nedlagd filgrupp kan aldrig återställas.
Mer information finns i Remove Defunct Filegroups (SQL Server).
Om transaktionerna har skjutits upp på grund av en felaktig sida och en bra säkerhetskopia av databasen inte finns använder du följande process för att reparera databasen:
Placera först databasen i nödläge genom att köra följande Transact-SQL-instruktion:
ALTER DATABASE <database_name> SET EMERGENCY
Information om nödläge finns i Database States.
Reparera sedan databasen med hjälp av alternativet DBCC REPAIR_ALLOW_DATA_LOSS i någon av följande DBCC-instruktioner: DBCC CHECKDB, DBCC CHECKALLOCeller DBCC CHECKTABLE.
När DBCC påträffar den felaktiga sidan avallokerar DBCC den och reparerar relaterade fel. Med den här metoden kan databasen åter vara online i ett fysiskt konsekvent tillstånd. Ytterligare data kan dock också gå förlorade. Därför bör detta tillvägagångssätt användas som en sista utväg.
Se även
Översikt över återställning och återhämtning (SQL Server)
Ta bort avvecklade filgrupper (SQL Server)
Filåterställningar (Fullständig Återställningsmodell)
Fil återställningar (enkel återställningsmodell)
Återställ Sidor (SQL Server)
Stegvisa återställningar (SQL Server)
ÄNDRA DATABAS (Transact-SQL)
RESTORE (Transact-SQL)