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


Используйте помеченные транзакции для согласованного восстановления связанных баз данных.

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

Этот раздел относится только к базам данных SQL Server, использующим полные или массовые модели восстановления.

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

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

Примечание.

Резервные копии журнала в различных базах данных могут быть созданы независимо друг от друга и не обязательно должны быть одновременными.

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

  • Один или несколько журналов транзакций разрушены. Необходимо восстановить набор баз данных до согласованного состояния во время резервного копирования последнего журнала.

  • Необходимо восстановить весь набор баз данных до взаимно стабильного состояния на более раннем этапе.

Внимание

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

Дополнительные сведения о создании помеченных транзакций см. в теме «Создание помеченных транзакций» далее в разделе.

Типичные сценарии для использования помеченных транзакций

Типичные сценарии для использования помеченных транзакций включают следующие шаги.

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

  2. Отметьте блок транзакций во всех базах данных.

  3. Резервное копирование журнала транзакции во всех базах данных.

  4. Восстановление резервных копий базы данных с ключевым словом WITH NORECOVERY.

  5. Восстановление журналов с параметром WITH STOPATMARK.

Соображения для использования помеченных транзакций

Перед вставкой именованных меток в журнал транзакций следует учесть следующее:

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

  • После фиксации помеченной транзакции в таблицу logmarkhistory базы данных msdb вставляется строка.

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

Создайте помеченные транзакции

Чтобы создать помеченную транзакцию, используйте инструкцию BEGIN TRANSACTION и условие WITH MARK [description]. Необязательное описание представляет собой текстовое описание метки. Для транзакции обязательно требуется название метки. Имя метки может быть использовано повторно. В журнале транзакций записываются имя метки, описание, база данных, пользователь, дата и время, а также номер последовательности журнала (LSN). Данные datetime используются наряду с именем метки, чтобы уникально идентифицировать метку.

Создание помеченных транзакций в наборе баз данных

  1. Дайте имя транзакции в инструкции BEGIN TRAN и используйте клаузу WITH MARK.

    Можно вложить инструкцию BEGIN TRAN new_mark_name WITH MARK в существующую транзакцию. Значение параметра new_mark_name является названием метки для транзакции, даже если у транзакции есть собственное имя.

    Примечание.

    Если вызывается вторая вложенная инструкция BEGIN TRAN...WITH MARK, эта инструкция пропускается, но возникает предупреждающее сообщение.

  2. Выполните обновление всех баз данных в наборе.

    Метка указанной транзакции добавлена в журналы транзакций только на экземпляре сервера, где выполнена инструкция BEGIN TRAN...WITH MARK. Метка транзакции размещается только в журнале транзакции каждой базы данных, обновленной помеченной транзакцией на данном экземпляре сервера. Если базы данных постоянно находятся на различных экземплярах сервера, идентичные метки должны быть созданы на каждом из них.

Примеры

В следующем примере журнал транзакций восстанавливается до метки в помеченной транзакции с именем ListPriceUpdate.

USE AdventureWorks2022;
GO  
BEGIN TRANSACTION ListPriceUpdate  
   WITH MARK 'UPDATE Product list prices';  
GO  
  
UPDATE Production.Product  
   SET ListPrice = ListPrice * 1.10  
   WHERE ProductNumber LIKE 'BK-%';  
GO  
  
COMMIT TRANSACTION ListPriceUpdate;  
GO  
  
-- Time passes. Regular database   
-- and log backups are taken.  
-- An error occurs in the database.  
USE master  
GO  
  
RESTORE DATABASE AdventureWorks  
FROM AdventureWorksBackups  
WITH FILE = 3, NORECOVERY;  
GO  
  
RESTORE LOG AdventureWorks  
   FROM AdventureWorksBackups   
   WITH FILE = 4,  
   RECOVERY,   
   STOPATMARK = 'UPDATE Product list prices';  

Принудительное распространение метки на другие серверы

В процессе распространения транзакции имя отметки транзакции не передается автоматически на другой сервер. Чтобы заставить отметку распространиться на другие сервера, хранимая процедура должна содержать инструкцию BEGIN TRAN имя WITH MARK. Затем эту хранимую процедуру необходимо выполнить на удаленном сервере в рамках транзакции, осуществляемой на исходном сервере.

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

CREATE PROCEDURE sp_SetMark  
@name nvarchar (128)  
AS  
BEGIN TRANSACTION @name WITH MARK  
UPDATE coyote.dbo.Marks SET one = 1  
COMMIT TRANSACTION;  
GO  

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

CREATE PROCEDURE sp_MarkAll  
@name nvarchar (128)  
AS  
BEGIN TRANSACTION  
EXEC instance0.coyote.dbo.sp_SetMark @name  
EXEC instance1.coyote.dbo.sp_SetMark @name  
EXEC instance2.coyote.dbo.sp_SetMark @name  
COMMIT TRANSACTION;  
GO  

двухфазная фиксация

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

Следующие шаги выполняются во время фиксации помеченной транзакции.

  1. Фаза подготовки транзакции блокирует все новые операции подготовки и фиксации.

  2. Разрешено продолжать только выполнение уже подготовленных транзакций.

  3. Маркировка транзакций завершается, после чего ожидается завершение всех подготовленных транзакций в течение заданного времени.

  4. Помеченная транзакция готова и зафиксирована.

  5. Задержка новых подготовок и фиксаций была устранена.

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

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

Восстановление помеченной транзакции

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

См. также

НАЧАТЬ РАСПРЕДЕЛЕННУЮ ТРАНЗАКЦИЮ (Transact-SQL)
Резервное копирование и восстановление системных баз данных (SQL Server)
BEGIN TRANSACTION (Transact-SQL)
Применение резервных копий журналов транзакций (SQL Server)
Полные резервные копии баз данных (SQL Server)
RESTORE (Transact-SQL)
Восстановление связанных баз данных, которые содержат помеченную транзакцию