Transacciones diferidas (SQL Server)Deferred Transactions (SQL Server)

SE APLICA A: síSQL Server noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

En SQL ServerSQL Server Enterprise, una transacción dañada puede ser diferida si los datos necesarios para la reversión se encuentran sin conexión durante el inicio de la base de datos.In SQL ServerSQL Server Enterprise, a corrupted transaction can become deferred if data required by rollback (undo) is offline during database startup. Una transacción diferida es aquella que está sin confirmar cuando termina la fase de puesta al día y que se encuentra con un error que impide que se revierta.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. Si la transacción no se puede revertir, se convierte en una transacción diferida.Because the transaction cannot be rolled back, it is deferred.

Nota

Las transacciones dañadas solo se difieren en SQL ServerSQL Server Enterprise.Corrupted transactions are deferred only in SQL ServerSQL Server Enterprise. En otras versiones de SQL ServerSQL Server, una transacción dañada hace que se produzca un error de inicio.In other editions of SQL ServerSQL Server, a corrupted transaction causes startup to fail.

Normalmente, las transacciones diferidas se producen porque, cuando la base de datos se estaba poniendo al día, un error de E/S impidió que se leyera una página necesaria para la transacción.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. Sin embargo, un error en el nivel de archivo también puede provocar transacciones diferidas.However, an error at the file level can also cause deferred transactions. También puede producirse una transacción diferida cuando una secuencia de restauración parcial se detiene en un punto donde se requiere la reversión de transacciones y una transacción necesita datos que se encuentran sin conexión.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.

Las transacciones de usuario que se están revirtiendo y se encuentran un error de E/S hacen que toda la base de datos se quede sin conexión.User transactions that are rolling back and hit an I/O error cause the whole database to go offline. Cuando la base de datos está en línea de nuevo, la acción de rehacer vuelve a adquirir todos los bloqueos que tenía e intenta revertir todas las transacciones no confirmadas.When the database is brought back online, the redo reacquires all the locks it had and tries to roll back all the uncommitted transactions. Todos los datos modificados por una transacción permanecen adecuadamente bloqueados hasta que la transacción se puede revertir.All data modified by a transaction remains appropriately locked until the transaction can roll back. Las transacciones que no pueden revertirse renuncian a sus bloqueos cuando los daños se arreglan y la base de datos se reinicia o, después de una restauración en línea, cuando las transacciones diferidas se resuelven mientras la base de datos está en línea.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. Hasta ese momento, una transacción diferida puede mantener los bloqueos que impiden ciertas operaciones en la base de datos en su totalidad.Until that point, a deferred transaction can hold locks that prevent certain operations on the database as a whole. Por ejemplo, si una transacción diferida contiene una instrucción CREATE TABLE, ningún usuario puede crear una tabla hasta que la transacción diferida se haya resuelto.For example, if a deferred transaction contains a CREATE TABLE instruction, no user can create a table until the deferred transaction has been resolved.

Las transacciones diferidas pueden producirse también porque una restauración por etapas recupera una base de datos a un punto en que una o varias transacciones activas afectan a un grupo de archivos que todavía no se ha restaurado y sigue estando sin conexión.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. Como las transacciones no se pueden revertir, se convierten en transacciones diferidas.Because the transactions cannot be rolled back, they become deferred.

En la siguiente tabla se enumeran las acciones que hacen que una base de datos lleve a cabo la recuperación y el resultado si se produce un problema de E/S.The following table lists the actions that cause a database to perform recovery and the outcome if an I/O problem occurs.

AcciónAction Resolución (si se producen problemas de E/S o los datos necesarios están sin conexión)Resolution (if I/O problems occur or required data is offline)
Iniciar el servidorServer start transacción diferidaDeferred transaction
RestaurarRestore Transacción diferidaDeferred transaction
AdjuntarAttach Error en la operación de adjuntarAttach fails
Reinicio automáticoAutorestart transacción diferidaDeferred transaction
Crear una base de datos o una instantánea de base de datosCreate database or database snapshot Error en la creaciónCreation fails
Puesta al día en la creación de reflejo de la base de datosRedo on database mirroring transacción diferidaDeferred transaction
Grupo de archivos sin conexiónFilegroup is offline transacción diferidaDeferred transaction

Eliminar el estado DEFERRED de una transacciónMoving a Transaction Out of the DEFERRED State

Importante

Las transacciones diferidas hacen que el registro de transacciones esté activo.Deferred transactions keep the transaction log active. Un archivo de registro virtual que contenga transacciones diferidas no se puede truncar hasta que dichas transacciones salen del estado diferido.A virtual log file that contains any deferred transactions cannot be truncated until those transactions are moved out of the deferred state. Para obtener más información sobre el truncamiento de registros, vea El registro de transacciones (SQL Server).For more information about log truncation, see The Transaction Log (SQL Server).

Para hacer que la transacción salga del estado diferido, la base de datos debe iniciarse correctamente, sin ningún error de E/S.To move the transaction out of the deferred state, the database must start cleanly without any I/O errors. Si existen transacciones diferidas, debe corregir el origen de los errores de E/S.If deferred transactions exist, you must fix the source of the I/O errors. Las soluciones disponibles, que aparecen en la lista en el orden en que se suelen aplicar, son las siguientes:The available solutions, listed in the order in which they are typically tried, are as follows:

  • Reinicie la base de datos.Restart the database. Si el problema fue transitorio, la base de datos se iniciará sin transacciones diferidas.If the problem was transient, the database should start without deferred transactions.

  • Si las transacciones se aplazaron debido a que el grupo de archivos estaba sin conexión, vuelva a ponerlo en línea.If the transactions were deferred because a filegroup was offline, bring the filegroup back online.

    Para volver poner en línea un grupo de archivos sin conexión utilice la siguiente instrucción Transact-SQLTransact-SQL :To bring an offline filegroup back online, use the following Transact-SQLTransact-SQL statement:

    RESTORE DATABASE database_name FILEGROUP=<filegroup_name>  
    
  • Restaure la base de datos.Restore the database. Después de una restauración en línea, se resuelven todas las transacciones diferidas.After an online restore, any deferred transactions are resolved.

    En el modelo de recuperación completa o el modelo de recuperación optimizado para cargas masivas de registros, si las transacciones diferidas se deben a unas pocas páginas dañadas, es posible que una restauración de las páginas en línea resuelva los errores (donde se admita).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).

  • Si ya no necesita un grupo de archivos cuyo estado sin conexión crea transacciones diferidas, haga que el grupo de archivos sin conexión pase a estar inactivo.If you are no longer require a filegroup whose offline status is causing deferred transactions, make the offline filegroup defunct. Las transacciones que estaban diferidas porque el grupo de archivos estaba sin conexión salen del estado diferido una vez que el grupo de archivos queda inactivo.Transactions that were deferred because the filegroup was offline are moved out of the deferred state after the filegroup becomes defunct.

    Importante

    Un grupo de archivos inactivo no puede recuperarse.A defunct filegroup can never be recovered.

    Para obtener más información, vea Quitar grupos de archivos inactivos (SQL Server).For more information, see Remove Defunct Filegroups (SQL Server).

  • Si las transacciones estaban diferidas a causa de de una página dañada y no se dispone de buena copia de seguridad correcta de la base de datos, siga este procedimiento para reparar la base de datos: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:

    • Ponga la base de datos en modo de emergencia mediante la ejecución de la siguiente instrucción Transact-SQLTransact-SQL :First put the database into emergency mode by executing the following Transact-SQLTransact-SQL statement:

      ALTER DATABASE <database_name> SET EMERGENCY  
      

      Para obtener información acerca del modo de emergencia, vea Database States.For information about emergency mode, see Database States.

    • Después, repare la base de datos mediante la opción DBCC REPAIR_ALLOW_DATA_LOSS de una de las siguientes instrucciones DBCC: 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.

      Cuando encuentre la página dañada, DBCC la desasignará y reparará cualquier error relacionado.When DBCC encounters the bad page, DBCC deallocates it and repairs any related errors. Este enfoque permite volver a poner en línea la base de datos en un estado físicamente coherente.This approach enables the database to be brought back online in a physically consistent state. Sin embargo, también podrían perderse otros datos, por lo que este enfoque debe ser el último recurso.However, additional data might also be lost; therefore, this approach should be used as a last resort.

Ver tambiénSee Also

Información general sobre restauración y recuperación (SQL Server) Restore and Recovery Overview (SQL Server)
Quitar grupos de archivos inactivos (SQL Server) Remove Defunct Filegroups (SQL Server)
Restauraciones de archivos (modelo de recuperación completa) File Restores (Full Recovery Model)
Restauraciones de archivos (modelo de recuperación simple) File Restores (Simple Recovery Model)
Restaurar páginas (SQL Server) Restore Pages (SQL Server)
Restauraciones por etapas (SQL Server) Piecemeal Restores (SQL Server)
ALTER DATABASE (Transact-SQL) ALTER DATABASE (Transact-SQL)
RESTORE (Transact-SQL)RESTORE (Transact-SQL)