본문 바로가기
서버구축 (WEB,DB)

SQL Server 2005 데이터베이스 스냅샷(Snapshot)

by 날으는물고기 2008. 12. 26.

SQL Server 2005 데이터베이스 스냅샷(Snapshot)

데이터베이스 스냅샷(Snapshot)

업무에서 데이터베이스를 사용하다 보면 특정 시점의 데이터베이스를 접근 하고 싶은 경우가 있습니다. 예를 들면 오후 6시 시점의 데이터베이스를 대상으로 보고서를 산출하고 싶은 경우가 발생 할 수 있습니다. 하지만 데이터베이스에는 계속해서 데이터가 추가, 변경 또는 삭제 되므로 오후 6시 시점의 데이터베이스를 접근 할 수가 없습니다. SQL 서버 2005에서는 데이터베이스 스냅샷을 이용해 이러한 작업이 가능하게 됩니다.

 

1. 데이터베이스 스냅샷이란
데이터베이스 스냅샷은 특정 시점의 고정된 읽기 전용의 데이터베이스입니다. 특정 시점에 데이터베이스 스냅샷이 만들어지고 나면 원본 데이터베이스의 데이터가 변경되어도 데이터베이스 스냅샷은 변경되지 않습니다. 만일 오후 6시 시점에 데이터베이스 스냅샷을 만들면 이 데이터베이스는 6시 시점의 고정된 데이터를 보여 주므로 6시 시점의 보고서 산출이 가능하게 됩니다.
데이터베이스 스냅샷은 갑작스런 데이터 손상으로부터 복원의 가능성도 제공해 줍니다. 만일 오후 6시에 데이터베이스 스냅샷을 만든 상황에서 잘못해 특정 테이블의 내용을 모두 삭제 했다고 가정한다면, 이러한 상황에서 6시 시점에 만든 데이터베이스 스냅샷에는 문제의 테이블이 지워지기 전 상태로 있기 때문에 이 테이블을 이용해 지워진 원본 데이터베이스의 테이블을 복원 할 수 있습니다.

 

2. 데이터베이스 스냅샷에 대한 제한
데이터베이스 스냅샷을 만들 때 다음과 같은 제한이 따르게 됩니다.
- 원본 데이터베이스와 같은 서버에만 만들 수 있습니다.
- 시스템 데이터베이스에 대해서는 데이터베이스 스냅샷을 만들 수 없습니다.
- 데이터베이스 스냅샷은 백업이나 복원을 할 수 없습니다.
- 데이터베이스 스냅샷은 데이터베이스 분리(Detach) 또는 연결(Attach)할 수 없습니다.
- 데이터베이스 스냅샷은 FAT32 또는 raw 파티션에는 만들 수 없습니다.
- 원본 데이터베이스를 제거하기 위해서는 먼저 데이터베이스 스냅샷부터 제거해야 합니다.
- SQL Server Management Studio에서는 데이터베이스 스냅샷을 만들 수 없습니다.

 

3. 데이터베이스 스냅샷 만들기데이터베이스 스냅샷 제한 사항에서 언급된 것처럼 데이터베이스 스냅샷은 Management Studio에서는 만들 수 없습니다. CREATE DATABASE 문을 이용해서만 만들 수 있습니다. 다음 예제는 AdventureWorks 데이터베이스에 대해 오후 6시 시점의 데이터베이스 스냅샷을 만드는 예입니다. 데이터베이스 스냅샷의 이름은 이처럼 만들어진 시간대를 알 수 있게 이름에 시간을 포함해 주는 것이 좋습니다.USE Master
GO
CREATE DATABASE AdventureWorks_dbsnapshot_1800
ON (
   NAME = AdventureWorks_Data,
   FILENAME = 'C:\Data\AdventureWorks_Data.ss'
) AS SNAPSHOT OF AdventureWorks
GO
 
다음 예제에서는 만든 데이터베이스 스냅샷에서 쿼리를 하고 있습니다. 데이터베이스 스냅샷은 읽기전용의 데이터베이스이므로 다양한 방법의 쿼리가 가능하게 됩니다.USE AdventureWorks_dbsnapshot_1800
GO
SELECT *
   FROM HumanResources.Employee
GO  
위 예제에서처럼 테이블을 쿼리 하게 되면 쿼리 된 결과는 원본 데이터베이스의 테이블이 쿼리 되어 표시됩니다. 데이터베이스 스냅샷이 만들어진 이후에 데이터가 변경되면 변경 전 데이터가 데이터베이스 스냅샷에 기록이 되는데 아직은 변경된 데이터가 없기 때문에 데이터베이스 스냅샷을 원본 데이터베이스로 쿼리 작업을 넘겨 원본 데이터가 쿼리 되게 하는 것입니다.

 

4. 데이터베이스 스냅샷 사용 데이터베이스 스냅샷 데이터를 변경해 볼까요? USE AdventureWorks_dbsnapshot_1800
GO
UPDATE HumanResources.Employee
   SET LoginID = 'Secret' + LoginID
GO
[결과]
메시지 3906, 수준 16, 상태 1, 줄 1
데이터베이스 "AdventureWorks_dbsnapshot_1800"은(는) 읽기 전용이므로 업데이트할 수 없습니다.  
위 에제 처럼 데이터베이스 스냅샷의 데이터를 변경하려고 하면 에러가 발생합니다. 읽기 전용의 데이터이기 때문에 변경 작업은 불가합니다.다음 예제에서는 원본 데이터베이스인 AdventureWorks의 테이블을 변경하고 그 결과를 확인한 것입니다. LoginID 앞에 모두 ‘Secret’이 붙어 있는 것을 볼 수 있습니다. USE AdventureWorks
GO
UPDATE HumanResources.Employee
   SET LoginID = 'Secret ' + LoginID
GO
SELECT LoginID
   FROM HumanResources.Employee
GO
[결과]
LoginID
------------------------------------
Secret adventure-works\alan0
Secret adventure-works\alejandro0
Secret adventure-works\alex0
Secret adventure-works\alice0
(생략)  
하지만 다음 예제처럼 데이터베이스 스냅샷에서 해당 테이블을 조회하면 ‘Secret’이 붙지 않은 즉, 변경 되지 전 데이터를 확인 할 수 있습니다. USE AdventureWorks_dbsnapshot_1800
GO
SELECT LoginID
   FROM HumanResources.Employee
GO
[결과]
LoginID
--------------------------------------
adventure-works\alan0
adventure-works\alejandro0
adventure-works\alex0
adventure-works\alice0
(생략)
 
5. 데이터베이스 스냅샷을 이용한 데이터 복원다음 예제는 데이터베이스 스냅샷에 기록된 변경 전 데이터를 이용해 원본 데이터베이스의 테이블을 복원하는 방법 중의 하나를 보여줍니다. 결과적으로 ‘Secret’ 가 LoginID 앞에 붙기 전 데이터로 원복 됨을 볼 수 있습니다. 이외에도 여러가지 경우의 복원에 데이터베이스 스냅삿을 이용할 수 잇습니다. USE AdventureWorks
GO
UPDATE HumanResources.Employee
   SET LoginID = (SELECT LoginID
         FROM AdventureWorks_dbsnapshot_1800.Humanresources.Employee
         WHERE EmployeeID = E1.EmployeeID)
   FROM HumanResources.Employee E1
GO
SELECT LoginID
FROM HumanResources.Employee
GO
[결과]
LoginID
--------------------------------------
adventure-works\alan0
adventure-works\alejandro0
adventure-works\alex0
adventure-works\alice0
(생략)
 
6. 데이터베이스 스냅샷 제거데이터베이스 스냅샷은 다음과 같이 DROP DATABASE 문에 의해 삭제 할 수 있습니다. USE Master
GO
DROP DATABASE AdventureWorks_dbsnapshot_1800
GO
 
7. 정리데이터베이스 스냅샷에 대해 살펴보았습니다. 특정 시점의 보고서 산출이나 개발 및 테스트를 위해 활용할 부분이 충분이 있을것 같습니다. 위에서 언급한 것처럼 데이터 복구에 사용할 수도 있습니다. 갑작스럽게 테이블을 지웠을 경우, 개체를 제거했을 경우 등에서 복구할 수 있는 시점의 데이터베이스 스냅샷이 있다면 이것을 이용해 복구를 하면 됩니다. 그렇다고 이것이 백업과 복원 전략을 대신 할수 없음을 명심해 주시기 바랍니다.
728x90

댓글