표시된 트랜잭션을 사용하여 관련 데이터베이스 복구
적용 대상: SQL Server
이 항목은 전체 또는 대량 로그 복구 모델을 사용하는 SQL Server 데이터베이스에만 관련됩니다.
두 개 이상의 데이터베이스에 관련 업데이트를 하는 경우 관련 데이터베이스에서 트랜잭션 표시를 사용하여 논리적으로 일관된 지점까지 복구할 수 있습니다. 그러나 이 복구는 복구 지점으로 사용된 표시 후에 커밋된 모든 트랜잭션을 잃게 됩니다. 트랜잭션 표시는 관련 데이터베이스를 테스트하거나 최근에 커밋된 트랜잭션을 손실하려는 경우에만 적합합니다.
모든 관련 데이터베이스에서 관련 트랜잭션을 정기적으로 표시하면 데이터베이스에서 일련의 공통 복구 지점이 설정됩니다. 트랜잭션 표시는 트랜잭션 로그에 기록되고 로그 백업에 포함됩니다. 재해가 발생할 경우 각 데이터베이스를 동일한 트랜잭션 표시로 복원하여 일관된 지점으로 복구할 수 있습니다.
참고 항목
서로 다른 데이터베이스에 대한 로그 백업은 서로 독립적으로 만들 수 있으며 동시에 만들 필요가 없습니다.
다음 시나리오에서 관련 데이터베이스를 복구하려면 모든 관련 데이터베이스에서 트랜잭션을 이미 표시해야 합니다.
하나 이상의 트랜잭션 로그가 제거됩니다. 마지막 로그 백업과 같은 상태로 데이터베이스 집합을 복원해야 합니다.
일부 이전 시점에서 전체 데이터베이스 집합을 상호 일관된 상태로 복원해야 합니다.
Important
표시된 트랜잭션에만 관련된 데이터베이스를 복구할 수 있으며 지정 시간과는 관련이 없습니다.
마킹 트랜잭션을 만드는 방법에 대한 자세한 내용은 이 항목의 뒷부분에 있는 "표시된 트랜잭션 만들기"를 참조하세요.
표시된 트랜잭션 사용에 대한 일반적인 시나리오
표시된 트랜잭션을 사용하는 일반적인 시나리오에는 다음 단계가 포함됩니다.
각 관련 데이터베이스의 전체 또는 차등 데이터베이스 백업을 만듭니다.
모든 데이터베이스에서 트랜잭션 블록 표시
모든 데이터베이스에 대한 트랜잭션 로그를 백업합니다.
WITH NORECOVERY를 사용하여 데이터베이스 백업을 복원합니다.
STOPATMARK를 사용하여 로그를 복원합니다.
표시된 트랜잭션 사용에 대한 고려 사항
트랜잭션 로그에 명명된 표시를 삽입하기 전에 다음 사항을 주의하십시오.
트랜잭션 표시는 로그 공간을 소비하므로 데이터베이스 복구 전략에서 중요한 역할을 하는 트랜잭션에 대해서만 사용해야 합니다.
표시된 트랜잭션 커밋 후에는 msdb의 logmarkhistory 테이블에 행이 삽입됩니다.
표시된 트랜잭션이 동일한 데이터베이스 서버 또는 다른 서버의 여러 데이터베이스에 걸쳐 있는 경우 영향을 받는 모든 데이터베이스의 로그에 표시를 기록해야 합니다.
표시된 트랜잭션 만들기
표시된 트랜잭션을 생성하려면 BEGIN TRANSACTION 문과 WITH MARK [description] 절을 사용합니다. 선택 요소인 description 은 표시의 텍스트 설명입니다. 트랜잭션의 표시 이름이 필요합니다. 표시 이름을 다시 사용할 수 있습니다. 트랜잭션 로그는 표시 이름, 설명, 데이터베이스, 사용자, 날짜/시간 정보 및 LSN(로그 시퀀스 번호)을 기록합니다. datetime 정보는 표시 이름과 함께 사용되어 표시를 고유하게 식별합니다.
데이터베이스 집합에서 표시된 트랜잭션을 만들려면 다음을 수행합니다.
BEGIN TRAN 문에서 트랜잭션 이름을 지정하고 WITH MARK 절 사용
BEGIN TRAN new_mark_name WITH MARK 문을 기존 트랜잭션 내에 중첩할 수 있습니다. new_mark_name 값은 트랜잭션에 트랜잭션 이름이 있는 경우에도 트랜잭션의 표시 이름입니다.
참고 항목
두 번째로 중첩된 BEGIN TRAN...WITH MARK를 발행하면 해당 명령문은 건너뛰어지지만 경고 메시지가 발생합니다.
집합의 모든 데이터베이스에 대해 업데이트를 실행합니다.
특정 트랜잭션에 대한 표시는 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단계 커밋
분산 트랜잭션 커밋은 준비 및 커밋의 두 단계로 이루어집니다. 표시된 트랜잭션이 커밋되면 표시된 트랜잭션의 각 데이터베이스에 대한 커밋 로그 레코드는 로그에 의심할 여지 없는 트랜잭션이 없는 시점에 로그에 배치됩니다. 이때 한 로그에서는 커밋된 것으로 다른 로그에서는 커밋되지 않은 것으로 나타나는 트랜잭션은 분명히 없습니다.
다음 단계에서는 표시된 트랜잭션을 커밋하는 동안 이 작업을 수행합니다.
마킹 트랜잭션의 준비 단계는 모든 새 준비 및 커밋을 중단합니다.
이미 준비된 트랜잭션의 커밋만 계속할 수 있습니다.
그런 다음, 트랜잭션을 표시하면 준비된 모든 트랜잭션이 드레이닝되기를 기다립니다(제한 시간 포함).
표시된 트랜잭션이 준비되고 커밋됩니다.
새 준비 및 커밋의 대기를 제거합니다.
다중 데이터베이스에 걸쳐 표시된 트랜잭션이 생성한 대기는 서버의 트랜잭션 처리 성능을 감소시킬 수 있습니다.
표시된 트랜잭션을 동시에 실행하지 않는 것이 좋습니다. 드물지만 분산 표시된 트랜잭션의 커밋이 동시에 커밋되는 다른 분산 표시된 트랜잭션과 교착 상태에 빠질 수 있습니다. 이 경우 마킹 트랜잭션이 교착 상태의 희생자로 선택되고 롤백됩니다. 이 오류가 발생하면 애플리케이션에서 표시된 트랜잭션을 다시 시도할 수 있습니다. 여러 개의 표시된 트랜잭션이 동시에 커밋을 시도하면 교착 상태에 빠질 가능성이 더 높아집니다.
표시된 트랜잭션으로 복구
특정 표시 바로 앞에 표시된 트랜잭션이 포함된 데이터베이스를 복구하는 방법에 대한 자세한 내용은 표시된 트랜잭션이 포함된 관련 데이터베이스 복구를 참조하세요.
참고 항목
BEGIN DISTRIBUTED TRANSACTION(Transact-SQL)
시스템 데이터베이스 백업 및 복원(SQL Server)
BEGIN TRANSACTION(Transact-SQL)
트랜잭션 로그 백업 적용(SQL Server)
전체 데이터베이스 백업(SQL Server)
RESTORE(Transact-SQL)
표시된 트랜잭션이 포함된 관련 데이터베이스 복구