Поделиться через


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

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

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

Примечание.

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

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

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

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

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

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

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

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

Вывод транзакции из состояния 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 освобождает эту страницу и исправляет связанные с ней ошибки. Такой подход дает возможность возвратить базу данных в режиме «в сети» в физически согласованное состояние. Но при этом могут быть также потеряны дополнительные данные, поэтому этот подход должен применяться только в исключительных случаях.

См. также

Обзор процессов восстановления (SQL Server)
Удаление несуществующих файловых групп (SQL Server)
Восстановление файлов (модель полного восстановления)
Восстановление файлов (простая модель восстановления)
Восстановление страниц (SQL Server)
Восстановление фрагмента (SQL Server)
ALTER DATABASE (Transact-SQL)
RESTORE (Transact-SQL)