Transazioni posticipate (SQL Server)Deferred Transactions (SQL Server)

In SQL ServerSQL Server Enterprise una transazione danneggiata può diventare posticipata se i dati necessari per il rollback (annullamento) sono offline durante l'avvio del database.In SQL ServerSQL Server Enterprise, a corrupted transaction can become deferred if data required by rollback (undo) is offline during database startup. Una transazione posticipata è una transazione di cui non è stato eseguito il commit al termine della fase di rollforward e per la quale si è verificato un errore che ne impedisce il rollback.A deferred transaction is a transaction that is uncommitted when the roll forward phase finishes and that has encountered an error that prevents it from being rolled back. Non essendo possibile eseguire il rollback, la transazione viene posticipata.Because the transaction cannot be rolled back, it is deferred.

Nota

Le transazioni danneggiate vengono posticipate solo in SQL ServerSQL Server Enterprise.Corrupted transactions are deferred only in SQL ServerSQL Server Enterprise. Nelle altre edizioni di SQL ServerSQL Serveruna transazione danneggiata causa un errore di avvio.In other editions of SQL ServerSQL Server, a corrupted transaction causes startup to fail.

In genere, una transazione posticipata si verifica perché durante il rollforward del database un errore di I/O ha impedito la lettura di una pagina necessaria per la transazione.Generally, a deferred transaction occurs because, while the database was being rolled forward, an I/O error prevented reading a page that was required by the transaction. Anche un errore a livello di file può tuttavia determinare transazioni posticipate.However, an error at the file level can also cause deferred transactions. Una transazione posticipata si può verificare anche quando una sequenza di ripristino parziale si arresta in un punto in cui è necessario eseguire il rollback della transazione e i dati richiesti dalla transazione sono offline.A deferred transaction can also occur when a partial restore sequence stops at a point at which transaction rollback is necessary and a transaction requires data that is offline.

Se si verifica un errore di I/O durante il rollback delle transazioni utente, verrà attivata la modalità offline per l'intero database.User transactions that are rolling back and hit an I/O error cause the whole database to go offline. Quando viene riattivata la modalità online per il database, il rollforward riacquisisce tutti i blocchi precedenti e tenta di eseguire il rollback delle transazioni di cui non è stato eseguito il commit.When the database is brought back online, the redo reacquires all the locks it had and tries to roll back all the uncommitted transactions. Tutti i dati modificati da una transazione rimangono bloccati nel modo appropriato fino a quando non è possibile eseguire il rollback della transazione.All data modified by a transaction remains appropriately locked until the transaction can roll back. Le transazioni di cui non è possibile eseguire il rollback rilasciano i relativi blocchi quando il problema di danneggiamento viene risolto e il database viene riavviato oppure, dopo un ripristino online, quando le transazioni posticipate vengono risolte mentre il database rimane online.Transactions that cannot be rolled back will give up their locks when the corruption is fixed and the database restarted or, after an online restore, when the deferred transactions are resolved while the database remains online. Fino a quel momento, una transazione posticipata può mantenere attivi blocchi che impediscono l'esecuzione di determinate operazioni sull'intero database.Until that point, a deferred transaction can hold locks that prevent certain operations on the database as a whole. Ad esempio, se una transazione posticipata contiene un'istruzione CREATE TABLE, verrà impedito agli utenti di creare una tabella fino alla risoluzione della transazione posticipata.For example, if a deferred transaction contains a CREATE TABLE instruction, no user can create a table until the deferred transaction has been resolved.

Una transazione posticipata si può anche verificare quando un ripristino a fasi recupera un database fino a un punto in cui una o più transazioni attive influiscono su un filegroup che non è ancora stato ripristinato ed è offline.Deferred transaction can also occur because a piecemeal restore recovers a database to a point at which one or more active transactions are affecting a filegroup that has not yet been restored and is offline. Non essendo possibile eseguire il rollback, le transazioni diventano posticipate.Because the transactions cannot be rolled back, they become deferred.

Nella tabella seguente sono illustrate le azioni che determinano l'esecuzione di un recupero in un database e il risultato ottenuto nel caso si verifichi un errore di I/O.The following table lists the actions that cause a database to perform recovery and the outcome if an I/O problem occurs.

AzioneAction Risoluzione (se si verificano problemi di I/O oppure i dati necessari sono offline)Resolution (if I/O problems occur or required data is offline)
Avvio del serverServer start transazione posticipataDeferred transaction
RestoreRestore transazione posticipataDeferred transaction
CollegaAttach Il collegamento ha esito negativoAttach fails
Riavvio automaticoAutorestart transazione posticipataDeferred transaction
Creazione di database o di snapshot del databaseCreate database or database snapshot La creazione ha esito negativoCreation fails
Rollforward nel mirroring del databaseRedo on database mirroring transazione posticipataDeferred transaction
Filegroup offlineFilegroup is offline transazione posticipataDeferred transaction

Annullamento dello stato di transazione posticipataMoving a Transaction Out of the DEFERRED State

Importante

Le transazioni posticipate mantengono attivo il log delle transazioni.Deferred transactions keep the transaction log active. Un file di log virtuale contenente transazioni posticipate non può essere troncato fino a quando lo stato di transazione posticipata non viene annullato.A virtual log file that contains any deferred transactions cannot be truncated until those transactions are moved out of the deferred state. Per altre informazioni sul troncamento del log, vedere Log delle transazioni (SQL Server).For more information about log truncation, see The Transaction Log (SQL Server).

Per annullare lo stato di transazione posticipata, è necessario che durante l'avvio del database non si verifichino errori di I/O.To move the transaction out of the deferred state, the database must start cleanly without any I/O errors. Se sono presenti transazioni posticipate, è necessario correggere l'origine degli errori di I/O.If deferred transactions exist, you must fix the source of the I/O errors. Di seguito sono riportate le soluzioni possibili, elencate nell'ordine in cui solitamente vengono tentate:The available solutions, listed in the order in which they are typically tried, are as follows:

  • Riavviare il database.Restart the database. Se il problema era temporaneo, il database verrà avviato senza transazioni posticipate.If the problem was transient, the database should start without deferred transactions.

  • Se le transazioni sono state posticipate a causa di un filegroup offline, attivare di nuovo la modalità online per il filegroup.If the transactions were deferred because a filegroup was offline, bring the filegroup back online.

    Per attivare di nuovo la modalità online per un filegroup, utilizzare l'istruzione Transact-SQLTransact-SQL seguente:To bring an offline filegroup back online, use the following Transact-SQLTransact-SQL statement:

    RESTORE DATABASE database_name FILEGROUP=<filegroup_name>  
    
  • Ripristinare il database.Restore the database. Dopo un ripristino online, eventuali transazioni posticipate vengono risolte.After an online restore, any deferred transactions are resolved.

    In base al modello di recupero con registrazione completa o con registrazione minima delle operazioni bulk, se le transazioni posticipate sono causate da un numero ridotto di pagine danneggiate, un ripristino delle pagine online può risolvere gli errori (se supportato).Under the full or bulk-logged recovery model, if the deferred transactions were caused by only a few corrupted pages, an online page restore might resolve the errors (where supported).

  • Se non è più necessario un filegroup offline che causa transazioni posticipate, è possibile renderlo inattivo.If you are no longer require a filegroup whose offline status is causing deferred transactions, make the offline filegroup defunct. Quando il filegroup in questione diventa offline, lo stato di transazione posticipata viene annullato.Transactions that were deferred because the filegroup was offline are moved out of the deferred state after the filegroup becomes defunct.

    Importante

    Un filegroup inattivo non può in alcun modo essere recuperato.A defunct filegroup can never be recovered.

    Per altre informazioni, vedere Rimuovere filegroup inattivi (SQL Server).For more information, see Remove Defunct Filegroups (SQL Server).

  • Se le transazioni sono state posticipate a causa di una pagina danneggiata e non è disponibile un backup valido del database, eseguire le operazioni seguenti per correggere gli errori del database:If transactions were deferred because of a bad page and if a good backup of the database does not exist, use the following process to repair the database:

    • Attivare innanzitutto la modalità di emergenza del database eseguendo l'istruzione Transact-SQLTransact-SQL seguente:First put the database into emergency mode by executing the following Transact-SQLTransact-SQL statement:

      ALTER DATABASE <database_name> SET EMERGENCY  
      

      Per informazioni sulla modalità di emergenza, vedere Stati del database.For information about emergency mode, see Database States.

    • Correggere quindi gli errori del database usando l'opzione DBCC REPAIR_ALLOW_DATA_LOSS in una delle istruzioni DBCC seguenti: DBCC CHECKDB, DBCC CHECKALLOCo DBCC CHECKTABLE.Then, repair the database by using the DBCC REPAIR_ALLOW_DATA_LOSS option in one of the following DBCC statements: DBCC CHECKDB, DBCC CHECKALLOC, or DBCC CHECKTABLE.

      Quando rileva la pagina danneggiata, DBCC ne esegue la deallocazione e corregge gli eventuali errori correlati.When DBCC encounters the bad page, DBCC deallocates it and repairs any related errors. Questo approccio consente di attivare di nuovo la modalità online per il database in uno stato fisicamente consistente.This approach enables the database to be brought back online in a physically consistent state. È tuttavia possibile che vengano persi dati aggiuntivi. Utilizzare pertanto questo approccio solo se strettamente necessario.However, additional data might also be lost; therefore, this approach should be used as a last resort.

Vedere ancheSee Also

Panoramica del ripristino e del recupero (SQL Server) Restore and Recovery Overview (SQL Server)
Rimuovere filegroup inattivi (SQL Server) Remove Defunct Filegroups (SQL Server)
Ripristini di file (modello di recupero con registrazione completa) File Restores (Full Recovery Model)
Ripristini di file (modello di recupero con registrazione minima) File Restores (Simple Recovery Model)
Ripristinare pagine (SQL Server) Restore Pages (SQL Server)
Ripristini a fasi (SQL Server) Piecemeal Restores (SQL Server)
ALTER DATABASE (Transact-SQL) ALTER DATABASE (Transact-SQL)
RESTORE (Transact-SQL) RESTORE (Transact-SQL)