Согласованное восстановление связанных баз данных с помощью помеченных транзакцийUse Marked Transactions to Recover Related Databases Consistently

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions)

Этот раздел относится только к тем базам данных SQL ServerSQL Server , которые используют модель полного восстановления или модель восстановления с неполным протоколированием.This topic is relevant only for SQL ServerSQL Server databases that are using the full or bulk-logged recovery models.

При выполнении связанных обновлений двух или более баз данных, связанных баз данных, можно использовать метки транзакции, чтобы возвратить их к логически непротиворечивой точке.When you make related updates to two or more databases, related databases, you can use transaction marks to recover them to a logically consistent point. Однако при восстановлении транзакция, совершенная после метки, используемой в качестве точки восстановления, теряется.However, this recovery loses any transaction that is committed after the mark that was used as the recovery point. Маркировка транзакций подходит только для проверки связанных баз данных или отмены недавно совершенной транзакции.Marking transactions is suitable only when you are testing related databases or when you are willing to lose recently committed transactions.

Обычно пометка связанных транзакций в каждой связанной базе данных устанавливает ряд общих точек восстановления в базе данных.Routinely marking related transactions in every related database establishes a series of common recovery points in the databases. Метки транзакции записываются в журнал транзакций и включаются в резервные копии журнала.The transaction marks are recorded in the transaction log and included in log backups. При возникновении аварийной ситуации можно восстановить каждую из баз данных к одной метке транзакции, чтобы возвратить их к соответствующей точке.In the event of a disaster, you can restore each of the databases to the same transaction mark to recover them to a consistent point.

Примечание

Резервные копии журнала в различных базах данных могут быть созданы независимо друга от друга и могут не быть совместными.Log backups on the different databases can be created independently of each other and do not have to be simultaneous.

Восстановление связанных баз данных в следующих сценариях требует наличия помеченных транзакций в каждой связанной базе данных.Recovering related databases in the following scenarios requires that you have already marked transactions in every related database:

  • Один или несколько журналов транзакций разрушены.One or more transaction logs are destroyed. Необходимо восстановить набор баз данных до согласованного состояния во время резервного копирования последнего журнала.You have to restore the set of databases to a consistent state at the time of your last log backup.

  • Необходимо восстановить весь набор баз данных до взаимно стабильного состояния на более раннем этапе.You have to restore the entire set of databases to a mutually consistent state at some earlier point in time.

Важно!

Восстановление связанных баз данных возможно только до помеченной транзакции, а не до определенного момента времени.You can recover related databases only to a marked transaction, not to a specific point in time.

Дополнительные сведения о создании помеченных транзакций см. в теме «Создание помеченных транзакций» далее в разделе.For information about how to create marking transactions, see "Creating the Marked Transactions," later in this topic.

Типичные сценарии для использования помеченных транзакцийTypical Scenario for Using Marked Transactions

Типичные сценарии для использования помеченных транзакций включают следующие шаги.A typical scenario for using marked transactions includes the following steps:

  1. Создание полной или разностной резервной копии каждой связанной базы данных.Create a full or differential database backup of each of the related databases.

  2. Пометка блока транзакций во всех базах данных.Mark a transaction block in all the databases.

  3. Резервное копирование журнала транзакции во всех базах данных.Back up the transaction log for all the databases.

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

  5. Восстановление журналов с ключевым словом WITH STOPATMARK.Restore logs WITH STOPATMARK.

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

Перед вставкой именованных меток в журнал транзакций следует учесть следующее:Before inserting named marks into the transaction log, consider the following:

  • Метки транзакций занимают место в журнале, поэтому их следует использовать только для транзакций, играющих важную роль в стратегии восстановления базы данных.Because transaction marks consume log space, use them only for transactions that play a significant role in the database recovery strategy.

  • После фиксации помеченной транзакции в таблицу logmarkhistory базы данных msdbвставляется строка.After a marked transaction commits, a row is inserted in the logmarkhistory table in msdb.

  • Если в помеченной транзакции задействованы несколько баз данных на одном сервере баз данных или на разных серверах, то метки должны записываться в журналах всех задействованных баз данных.If a marked transaction spans multiple databases on the same database server or on different servers, the marks must be recorded in the logs of all the affected databases.

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

Чтобы создать помеченные транзакции, используйте инструкцию BEGIN TRANSACTION и предложение WITH MARK [description].To create a marked transaction, use the BEGIN TRANSACTION statement and the WITH MARK [description] clause. Необязательное описание представляет собой текстовое описание метки.The optional description is a textual description of the mark. Имя метки для транзакции указывается обязательно.A mark name for the transaction is required. Имя метки может быть использовано повторно.A mark name can be reused. В журнале транзакций записывается имя метки, описание, база данных, пользователь, данные datetime и порядковый номер транзакции в журнале (LSN).The transaction log records the mark name, description, database, user, datetime information, and the log sequence number (LSN). Данные datetime используются наряду с именем метки, чтобы уникально идентифицировать метку.The datetime information is used along with the mark name to uniquely identify the mark.

Создание помеченных транзакций в наборе баз данныхTo create marked transactions in a set of databases:

  1. Дайте имя транзакции в инструкции BEGIN TRAN и используйте предложение WITH MARK.Name the transaction in the BEGIN TRAN statement and use the WITH MARK clause

    Можно вложить инструкцию BEGIN TRAN new_mark_name WITH MARK в существующую транзакцию.You can nest the statement BEGIN TRAN new_mark_name WITH MARK within an existing transaction. Значение параметра new_mark_name является помеченным именем для транзакции, даже если транзакция владеет им.The value of new_mark_name is the mark name for the transaction, even if the transaction possesses a transaction name.

    Примечание

    Если вызывается вторая вложенная инструкция BEGIN TRAN...WITH MARK, предыдущая инструкция пропускается, но в результате появляется предупреждающее сообщение.If you issue a second nested BEGIN TRAN...WITH MARK, that statement is skipped but causes a warning message.

  2. Выполните обновление всех баз данных в наборе.Run an update against all of the databases in the set.

    Метка указанной транзакции добавлена в журналы транзакций только на экземпляре сервера, где выполнена инструкция BEGIN TRAN...WITH MARK.The mark for a specific transaction is inserted into transaction logs only on the server instance where the BEGIN TRAN...WITH MARK statement is executed. Метка транзакции размещается только в журнале транзакции каждой базы данных, обновленной помеченной транзакцией на данном экземпляре сервера.The transaction mark is placed in the transaction log of every database updated by the marked transaction on that server instance. Если базы данных постоянно находятся на различных экземплярах сервера, идентичные метки должны быть созданы на каждом из них.If the databases reside on different server instances, identical marks must be created on each of the server instances.

ПримерыExamples

В следующем примере журнал транзакций восстанавливается до метки в помеченной транзакции с именем ListPriceUpdate.The following example restores the transaction log to the mark in the marked transaction named ListPriceUpdate.

USE AdventureWorks  
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 = 'ListPriceUpdate';  

Форсирование отметки к распространению на другие сервераForcing a Mark to Spread to Other Servers

В процессе распространения транзакции имя отметки транзакции не передается автоматически на другой сервер.A transaction mark name is not automatically distributed to another server as the transaction spreads there. Чтобы заставить отметку распространиться на другие сервера, хранимая процедура должна содержать инструкцию BEGIN TRAN имя WITH MARK.To force the mark to spread to the other servers, a stored procedure must be written that contains a BEGIN TRAN name WITH MARK statement. Эта хранимая процедура затем должна быть выполнена на удаленном сервере в области транзакции на исходном сервере.That stored procedure must then be executed on the remote server under the scope of the transaction in the originating server.

Например, рассмотрим секционированную базу данных, существующую в нескольких экземплярах SQL ServerSQL Server.For example, consider a partitioned database that exists on multiple instances of SQL ServerSQL Server. В каждом экземпляре находится база данных под названием coyote.On each instance is a database named coyote. Во-первых, необходимо создать хранимую процедуру, например sp_SetMark, в каждой базе данных.First, in every database, create a stored procedure, for example, 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 , которая содержит транзакцию, размещающую отметку в каждой базе данных.Next, create stored procedure sp_MarkAll containing a transaction that places a mark in every database. sp_MarkAll может быть запущена из любого экземпляра.sp_MarkAll can be run from any of the instances.

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  

двухфазная фиксацияTwo-Phase Commit

Фиксация распределенной транзакции состоит из двух фаз: подготовка и фиксация.Committing a distributed transaction occurs in two phases: prepare and commit. При фиксации помеченной транзакции запись журнала фиксации для каждой базы данных в помеченной транзакции размещается в журнале в том месте, где нет сомнительных транзакций.When a marked transaction is committed, the commit log record for each database in the marked transaction is placed in the log at a point where there are no in-doubt transactions in any of the logs. На данном этапе гарантируется, что не появятся транзакции, зафиксированные в одном журнале, но не зафиксированные в другом.At this point, it is guaranteed that there are no transactions that appear as committed in one log, but not committed in another log.

Следующие шаги выполняются во время фиксации помеченной транзакции.The following steps accomplish this during the commit of a marked transaction:

  1. Фаза подготовки помеченной транзакции останавливает все новые подготовки и фиксации.Prepare phase of a marking transaction stalls all new prepares and commits.

  2. Может продолжаться только фиксация уже подготовленных транзакций.Only commits of already prepared transactions are allowed to continue.

  3. Пометка транзакции ожидает истощения всех подготовленных транзакций (с учетом времени ожидания).Marking transaction then waits for all prepared transactions to drain (with time-out).

  4. Помеченная транзакция готова и зафиксирована.Marked transaction is prepared and committed.

  5. Остановка новых подготовок и фиксаций удалена.The stall of new prepares and commits is removed.

Остановы, сформированные помеченными транзакциями, которые охватывают несколько баз данных, могут уменьшить производительность обработки транзакции сервера.The stalls generated by marked transactions that span multiple databases can reduce the transaction processing performance of the server.

Не рекомендуется запускать параллельно еще одну помеченную транзакцию.We recommend that you do not run concurrent marked transactions. Маловероятно, но возможно, что произойдет взаимоблокировка фиксации распределенной помеченной транзакции с другими помеченными транзакциями, которые фиксируются в то же время.It is rare but possible for the commit of a distributed marked transaction to deadlock with other distributed marked transactions that are committing at the same time. Когда это произойдет, помечающая транзакция будет считаться жертвой взаимоблокировки и откатится назад.When this happens, the marking transaction is chosen as the deadlock victim and is rolled back. При возникновении данной ошибки приложение перезапустит помеченную транзакцию.When this error occurs, the application can retry the marked transaction. Возможность взаимоблокировки увеличивается, если несколько помеченных транзакций пытаются зафиксироваться одновременно.When multiple marked transactions try to commit concurrently, there is a higher probability of deadlock.

Восстановление до помеченной транзакцииRecovering to a Marked Transaction

Дополнительные сведения о восстановлении базы данных, содержащей помеченные транзакции на определенной метке или перед ней, см. в разделе Восстановление связанных баз данных, которые содержат помеченную транзакцию.For information about how to recover a database that contains marked transactions to or just before a particular mark, see Recovery of Related Databases That Contain Marked Transaction.

См. также:See Also

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
Резервное копирование и восстановление системных баз данных (SQL Server) Back Up and Restore of System Databases (SQL Server)
BEGIN TRANSACTION (Transact-SQL) BEGIN TRANSACTION (Transact-SQL)
Применение резервных копий журналов транзакций (SQL Server) Apply Transaction Log Backups (SQL Server)
Полные резервные копии баз данных (SQL Server) Full Database Backups (SQL Server)
RESTORE (Transact-SQL) RESTORE (Transact-SQL)
Восстановление связанных баз данных, которые содержат помеченную транзакциюRecovery of Related Databases That Contain Marked Transaction