Odložené transakce (SQL Server)
platí pro:SQL Server
V SQL Server Enterprise může být poškozená transakce odložena, pokud jsou během spuštění databáze offline data potřebná pro vrácení. Odložená transakce je transakce, která zůstává nepotvrzená po dokončení fáze aplikace změn a narazila na chybu, která jí brání v možnosti zpětného vrácení. Vzhledem k tomu, že transakci nelze vrátit zpět, je odložena.
Poznámka
Poškozené transakce jsou odloženy pouze v SYSTÉMU SQL Server Enterprise. V jiných edicích SQL Serveru způsobí poškozená transakce selhání spuštění.
Obecně platí, že odložená transakce nastane, protože zatímco databáze byla vrácena vpřed, vstupně-výstupní chyba zabránila čtení stránky, která byla požadována transakcí. Chyba na úrovni souboru však může také způsobit odložené transakce. Odložená transakce může také nastat, když se částečná sekvence obnovení zastaví v okamžiku, kdy je nutné vrácení transakce zpět a transakce vyžaduje data, která jsou offline.
Uživatelské transakce, které se vracejí zpět, a dojde k chybě při vstupně-výstupní operaci, způsobují, že celá databáze přejde do režimu offline. Při návratu databáze zpět do režimu online znovu vyžádá všechny zámky, které měl, a pokusí se vrátit zpět všechny nepotvrzené transakce. Všechna data upravená transakcí zůstávají odpovídajícím způsobem uzamčena, dokud se transakce nebude moci vrátit zpět. Transakce, které nelze vrátit zpět, se vzdají svých zámků, když je opraveno poškození a databáze se znovu spustí, nebo po online obnovení, když jsou vyřešeny odložené transakce, zatímco databáze zůstane online. Do té doby může odložená transakce uchovávat zámky, které brání určitým operacím v databázi jako celku. Pokud například odložená transakce obsahuje instrukce CREATE TABLE, nemůže žádný uživatel vytvořit tabulku, dokud se odložená transakce nevyřeší.
Odložená transakce může také nastat, protože kusmeální obnovení obnoví databázi v okamžiku, kdy jedna nebo více aktivních transakcí ovlivňuje skupinu souborů, která ještě nebyla obnovena a je offline. Vzhledem k tomu, že transakce nelze vrátit zpět, budou odloženy.
Následující tabulka uvádí akce, které způsobí, že databáze provede obnovení, a výsledek, pokud dojde k problému s vstupně-výstupními operacemi.
Akce | Řešení (pokud dojde k problémům s vstupně-výstupními operacemi nebo jsou požadovaná data offline) |
---|---|
Spuštění serveru | Odložená transakce |
Obnovit | Odložená transakce |
Připojit | Připojení selže |
Automatický restart | Odložená transakce |
Vytvoření databáze nebo snímku databáze | Vytvoření se nezdaří. |
Opětovné zrcadlení databáze | Odložená transakce |
Skupina souborů je offline | Odložená transakce |
Požadavky a omezení
- Databáze musí používat model obnovení FULL nebo BULK-LOGGED.
- Aby databáze byla považována za zálohovanou, musí být dokončena alespoň jedna záloha databáze a jedna záloha protokolu.
- Odložené transakce se nevztahují na chyby, ke kterým došlo při vrácení transakce po zprovoznění databáze. (např. běhová chyba)
- Transakce nelze pro selhání obnovy při připojování databáze odložit.
- Některé transakce, jako jsou systémové transakce (např. přidělení stránky), nelze odložit.
Přesunutí transakce ze stavu DEFERRED
Důležitý
Odložené transakce udržují transakční protokol aktivní. Soubor virtuálního protokolu, který obsahuje všechny odložené transakce, nelze zkrátit, dokud tyto transakce nebudou přesunuty z odloženého stavu. Další informace o zkrácení protokolu naleznete v tématu Transakční protokol (SQL Server).
Pokud chcete přesunout transakci mimo odložený stav, musí databáze začít čistě bez jakýchkoli vstupně-výstupních chyb. Pokud existují odložené transakce, musíte opravit zdroj vstupně-výstupních chyb. Dostupná řešení uvedená v pořadí, ve kterém se obvykle zkouší, jsou následující:
Restartujte databázi. Pokud byl problém přechodný, databáze by se měla spustit bez odložených transakcí.
Pokud byly transakce odloženy, protože skupina souborů byla offline, přeneste skupinu souborů zpět do režimu online.
Pokud chcete přenést offline skupinu souborů zpět do režimu online, použijte následující příkaz Transact-SQL:
RESTORE DATABASE database_name FILEGROUP=<filegroup_name>
Obnovte databázi. Po online obnovení se všechny odložené transakce vyřeší.
Pokud byly odložené transakce způsobeny pouze několika poškozenými stránkami v rámci úplného nebo hromadně protokolovaného modelu obnovení, může online obnovení stránky vyřešit chyby (pokud je to podporováno).
Pokud už nepotřebujete skupinu souborů, jejíž offline stav způsobuje odložené transakce, nastavte ji jako neaktivní. Transakce, které byly odloženy, protože skupina souborů byla offline, se přesunou mimo odložený stav poté, co se skupina souborů stane nefunkční.
Důležitý
Nepoužívanou skupinu souborů nelze nikdy obnovit.
Další informace najdete v tématu Odebrání vyřazených skupin souborů (SQL Server).
Pokud transakce byly odloženy z důvodu chybné stránky a pokud neexistuje dobrá záloha databáze, opravte databázi následujícím postupem:
Nejprve umístěte databázi do režimu tísňového volání spuštěním následujícího příkazu Transact-SQL:
ALTER DATABASE <database_name> SET EMERGENCY
Informace o nouzovém režimu naleznete v tématu Stavy databáze.
Potom opravte databázi pomocí možnosti DBCC REPAIR_ALLOW_DATA_LOSS v jednom z následujících příkazů DBCC: DBCC CHECKDB, DBCC CHECKALLOC, nebo DBCC CHECKTABLE.
Když DBCC narazí na chybnou stránku, DBCC ji deallokuje a opraví všechny související chyby. Tento přístup umožňuje, aby se databáze vrátila do režimu online v fyzicky konzistentním stavu. Mohou však být ztracena i další data; tento přístup by proto měl být použit jako poslední možnost.
Viz také
Přehled obnovení a obnovy (SQL Server)
Odebrání Vyřazených Souborových Skupin (SQL Server)
obnovení souborů (úplný model obnovení)
obnovení souborů (jednoduchý model obnovení)
Obnovení Stránek (SQL Server)
Dílčí obnovení (SQL Server)
ALTER DATABASE (Transact-SQL)