Отложенные транзакции (SQL Server)

Область применения:SQL Server

В SQL Server Enterprise поврежденная транзакция может быть отложена, если данные, необходимые для отката (отмена), находятся в автономном режиме во время запуска базы данных. Отложенная транзакция — это транзакция, которая остаётся незафиксированной на момент завершения этапа накатки и столкнулась с ошибкой, препятствующей её откату. Поскольку нельзя выполнить откат этой транзакции, она откладывается.

Примечание.

Поврежденные транзакции откладываются только в SQL Server Enterprise. В других выпусках SQL Server поврежденная транзакция приводит к сбою запуска.

Обычно отложенная транзакция возникает из-за того, что во время наката базы данных ошибка ввода-вывода не позволила прочитать страницу, необходимую для транзакции. Еще одной причиной возникновения отложенных транзакций может стать ошибка на файловом уровне. Отложенная транзакция также может возникнуть, если последовательность частичного восстановления останавливается на этапе, когда необходим откат транзакции, а самой транзакции требуются данные, находящиеся вне сети.

Пользовательские транзакции, при откате которых возникает ошибка ввода-вывода, приводят к переходу всей базы данных в состояние «вне сети». Когда база данных снова становится доступной, redo повторно захватывает все ранее удерживаемые блокировки и пытается откатить все неподтвержденные транзакции. Все изменённые транзакцией данные остаются должным образом заблокированными до тех пор, пока транзакцию нельзя будет откатить. Транзакции, для которых невозможно выполнить откат, освобождают блокировки после устранения повреждения и перезапуска базы данных либо, после оперативного восстановления, когда отложенные транзакции завершаются, пока база данных остается в сети. До этого времени отложенная транзакция может удерживать блокировки, препятствующие выполнению определенных операций с базой данных в целом. Например, если отложенная транзакция содержит CREATE TABLE инструкцию, пользователь не сможет создать таблицу до разрешения отложенной транзакции.

Отложенные транзакции могут также возникать, когда поэтапное восстановление восстанавливает базу данных до точки, в которой одна или несколько активных транзакций затрагивают еще не восстановленную файловую группу, находящуюся в режиме «вне сети». Поскольку эти транзакции невозможно откатить, они становятся отложенными.

В следующей таблице перечислены действия, вызывающие восстановление базы данных, а также указан результат в случае возникновения проблемы ввода-вывода.

Действие Решение (если возникают проблемы ввода-вывода или требуемые данные недоступны в сети)
Запуск сервера Отложенная транзакция
Восстановить Отложенная транзакция
Подключить Не удается подключить
Автоматический перезапуск Отложенная транзакция
Создать базу данных или снимок базы данных Создание завершается с ошибкой
Повтор при зеркальном отображении базы данных Отложенная транзакция
Файловая группа находится в режиме «вне сети» Отложенная транзакция

Требования и ограничения

  • База данных должна использовать модель восстановления FULL или BULK_LOGGED.
  • Для базы данных должна быть создана как минимум одна резервная копия базы данных и журнала.
  • Отложенные транзакции не применяются к ошибкам, возникающим во время отката транзакции после того, как база данных снова в сети. (например, ошибка времени выполнения).
  • Невозможно отложить транзакции в случае сбоя восстановления во время подключения базы данных.
  • Некоторые транзакции, такие как системные транзакции (например, выделение страниц) не могут быть отложены

Вывод транзакции из состояния DEFERRED

Внимание

Отложенная транзакция удерживает журнал транзакций активным. Файл виртуального журнала, содержащий все отложенные транзакции, нельзя усекать, пока эти транзакции не выйдут из отложенного состояния. Дополнительные сведения об усечении журнала транзакций см. в разделе Журнал транзакций (SQL Server).

Для вывода транзакции из отложенного состояния база данных должна запуститься без ошибок ввода-вывода. Если есть отложенные транзакции, необходимо устранить причину ошибок ввода-вывода. Ниже приводятся доступные решения, перечисленные в том порядке, в каком они обычно применяются.

  • Перезапуск базы данных. Если проблема временная, база данных должна запускаться без отложенных транзакций.

  • Если транзакции были отложены из-за того, что файловая группа была в режиме «вне сети», вновь переведите файловую группу в режим «в сети».

    Чтобы вернуть автономную файловую группу в режим "в сети", используйте следующую инструкцию Transact-SQL:

    RESTORE DATABASE database_name FILEGROUP=<filegroup_name>  
    
  • восстановить базу данных. После оперативного восстановления устраняются все отложенные транзакции.

    В полной модели восстановления или модели с неполным протоколированием восстановление страницы в режиме «в сети» может решить проблему (там, где это поддерживается), если причиной возникновения отложенных транзакций являются лишь несколько поврежденных страниц.

  • Если файловая группа, состояние «вне сети» которой является причиной отложенных транзакций, больше не требуется, отключите эту файловую группу. Транзакции, отложенные из-за того, что файловая группа находилась в режиме «вне сети», выходят из отложенного состояния после того, как эта файловая группа перестанет функционировать.

    Внимание

    Восстановление уничтоженной файловой группы невозможно.

    Дополнительные сведения см. в разделе "Удаление нефункционированных файловых групп ( SQL Server)".

  • Если транзакции отложены из-за повреждения страницы, а резервная копия базы данных отсутствует, для восстановления базы данных воспользуйтесь следующей процедурой.

    • Сначала разместите базу данных в аварийный режим, выполнив следующую инструкцию Transact-SQL:

      ALTER DATABASE <database_name> SET EMERGENCY  
      

      Сведения об аварийном режиме см. в разделе Database States.

    • Затем восстановите базу данных, используя параметр DBCC REPAIR_ALLOW_DATA_LOSS в одной из следующих инструкций DBCC: DBCC CHECKDB, DBCC CHECKALLOCили DBCC CHECKTABLE.

      Когда DBCC обнаруживает поврежденную страницу, DBCC освобождает ее и исправляет все связанные с ней ошибки. Такой подход дает возможность возвратить базу данных в режиме «в сети» в физически согласованное состояние. Но при этом могут быть также потеряны дополнительные данные, поэтому этот подход должен применяться только в исключительных случаях.