표시된 트랜잭션을 사용하여 관련 데이터베이스를 일관되게 복구

적용 대상:SQL Server

이 항목은 전체 또는 대량 로그 복구 모델을 사용하는 SQL Server 데이터베이스에만 관련됩니다.

둘 이상의 데이터베이스, 관련 데이터베이스에 대한 관련 업데이트를 수행할 때 트랜잭션 표시를 사용하여 논리적으로 일관된 지점으로 복구할 수 있습니다. 그러나 이 복구는 복구 지점으로 사용된 표시 후에 커밋된 모든 트랜잭션을 잃게 됩니다. 트랜잭션 표시는 관련 데이터베이스를 테스트하거나 최근에 커밋된 트랜잭션을 손실하려는 경우에만 적합합니다.

모든 관련 데이터베이스에서 관련 트랜잭션을 정기적으로 표시하면 데이터베이스에서 일련의 공통 복구 지점이 설정됩니다. 트랜잭션 표시는 트랜잭션 로그에 기록되고 로그 백업에 포함됩니다. 재해가 발생할 경우 각 데이터베이스를 동일한 트랜잭션 표시로 복원하여 일관된 지점으로 복구할 수 있습니다.

참고 항목

서로 다른 데이터베이스에 대한 로그 백업은 서로 독립적으로 만들 수 있으며 동시에 만들 필요가 없습니다.

다음 시나리오에서 관련 데이터베이스를 복구하려면 모든 관련 데이터베이스에서 트랜잭션을 이미 표시해야 합니다.

  • 하나 이상의 트랜잭션 로그가 제거됩니다. 마지막 로그 백업과 같은 상태로 데이터베이스 집합을 복원해야 합니다.

  • 일부 이전 시점에서 전체 데이터베이스 집합을 상호 일관된 상태로 복원해야 합니다.

Important

표시된 트랜잭션에만 관련된 데이터베이스를 복구할 수 있으며 지정 시간과는 관련이 없습니다.

마킹 트랜잭션을 만드는 방법에 대한 자세한 내용은 이 항목의 뒷부분에 있는 "표시된 트랜잭션 만들기"를 참조하세요.

표시된 트랜잭션 사용에 대한 일반적인 시나리오

표시된 트랜잭션을 사용하는 일반적인 시나리오에는 다음 단계가 포함됩니다.

  1. 각 관련 데이터베이스의 전체 또는 차등 데이터베이스 백업을 만듭니다.

  2. 모든 데이터베이스에서 트랜잭션 블록 표시

  3. 모든 데이터베이스에 대한 트랜잭션 로그를 백업합니다.

  4. 데이터베이스 백업 WITH NORECOVERY를 복원합니다.

  5. STOPATMARK를 사용하여 로그를 복원합니다.

표시된 트랜잭션 사용에 대한 고려 사항

트랜잭션 로그에 명명된 표시를 삽입하기 전에 다음 사항을 주의하십시오.

  • 트랜잭션 표시는 로그 공간을 소비하므로 데이터베이스 복구 전략에서 중요한 역할을 하는 트랜잭션에 대해서만 사용해야 합니다.

  • 표시된 트랜잭션 커밋 후에는 msdblogmarkhistory 테이블에 행이 삽입됩니다.

  • 표시된 트랜잭션이 동일한 데이터베이스 서버 또는 다른 서버의 여러 데이터베이스에 걸쳐 있는 경우 영향을 받는 모든 데이터베이스의 로그에 표시를 기록해야 합니다.

표시된 트랜잭션 만들기

표시된 트랜잭션을 만들려면 BEGIN TRANSACTION 문과 WITH MARK [description] 절을 사용합니다. 선택 요소인 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 name 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  

2단계 커밋

분산 트랜잭션 커밋은 준비 및 커밋의 두 단계로 이루어집니다. 표시된 트랜잭션이 커밋되면 표시된 트랜잭션의 각 데이터베이스에 대한 커밋 로그 레코드는 로그에 의심할 여지 없는 트랜잭션이 없는 시점에 로그에 배치됩니다. 이때 한 로그에서는 커밋된 것으로 다른 로그에서는 커밋되지 않은 것으로 나타나는 트랜잭션은 분명히 없습니다.

다음 단계에서는 표시된 트랜잭션을 커밋하는 동안 이 작업을 수행합니다.

  1. 마킹 트랜잭션의 준비 단계는 모든 새 준비 및 커밋을 중단합니다.

  2. 이미 준비된 트랜잭션의 커밋만 계속할 수 있습니다.

  3. 그런 다음, 트랜잭션을 표시하면 준비된 모든 트랜잭션이 드레이닝되기를 기다립니다(제한 시간 포함).

  4. 표시된 트랜잭션이 준비되고 커밋됩니다.

  5. 새 준비 및 커밋의 대기를 제거합니다.

다중 데이터베이스에 걸쳐 표시된 트랜잭션이 생성한 대기는 서버의 트랜잭션 처리 성능을 감소시킬 수 있습니다.

표시된 트랜잭션을 동시에 실행하지 않는 것이 좋습니다. 드물지만 분산 표시된 트랜잭션의 커밋이 동시에 커밋되는 다른 분산 표시된 트랜잭션과 교착 상태에 빠질 수 있습니다. 이 경우 마킹 트랜잭션이 교착 상태의 희생자로 선택되고 롤백됩니다. 이 오류가 발생하면 애플리케이션에서 표시된 트랜잭션을 다시 시도할 수 있습니다. 여러 개의 표시된 트랜잭션이 동시에 커밋을 시도하면 교착 상태에 빠질 가능성이 더 높아집니다.

표시된 트랜잭션으로 복구

특정 표시 바로 앞에 표시된 트랜잭션이 포함된 데이터베이스를 복구하는 방법에 대한 자세한 내용은 표시된 트랜잭션이 포함된 관련 데이터베이스 복구를 참조하세요.

참고 항목

BEGIN DISTRIBUTED TRANSACTION(Transact-SQL)
시스템 데이터베이스 백업 및 복원(SQL Server)
BEGIN TRANSACTION(Transact-SQL)
트랜잭션 로그 백업 적용(SQL Server)
전체 데이터베이스 백업(SQL Server)
RESTORE(Transact-SQL)
표시된 트랜잭션이 포함된 관련 데이터베이스 복구