Отложенные транзакции

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

ПримечаниеПримечание

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

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

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

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

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

Действие

Разрешение (если возникает проблема ввода-вывода или нужные данные находятся в автономном режиме)

Запуск сервера

Отложенная транзакция

Восстановление

Отложенная транзакция

Присоединение

Присоединение завершается с ошибкой

Автоматический перезапуск

Отложенная транзакция

Создание базы данных или моментального снимка базы данных

Создание завершается с ошибкой

Повтор при зеркальном отображении базы данных

Отложенная транзакция

Файловая группа находится в автономном режиме

Отложенная транзакция

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

Важное примечаниеВажно!

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

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

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

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

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

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

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

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

    Важное примечаниеВажно!

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

    Дополнительные сведения см. в разделе Уничтоженные файловые группы.

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

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

      ALTER DATABASE <database_name> SET EMERGENCY
      

      Сведения об аварийном режиме см. в разделе Состояния базы данных.

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

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