2007~2011/SQL Server2011.04.10 15:48
SQL Server 2005, SQL Server 2008 그리고 R2 버전의 Enterprise edition 에서는 Fast Recovery, Online Restore 기능을 지원하고 있습니다. 

Fast Recovery 란 crash 또는 mirroring failover 를 진행하는 동안 Redo 단계 이후 곧바로 데이터베이스를 가용하도록 온라인 시키는 기능이며, Online Restore 기능은 데이터베이스를 복원할 때, 여러 개의 파일 그룹으로 나뉘어져 있는 경우 Primary 파일 그룹의 Restore 가 완료되면 데이터베이스를 해당 시점부터 온라인 상태로 전환되며 Primary 파일 그룹의 데이터부터 액세스가 가능하게 됩니다. 빠른 서비스를 위해 이후 급한 파일 그룹을 우선 순위로 지정하여 복원하면 되는 것이죠! 


Fast Recovery 를 테스트 환경에서 구현하기 어려움이 있어 테스트는 생략하고.... Online Restore 기능에 대해서 아래와 같이 테스트한 자료를 정리하였습니다. 

데이터베이스를 RESTORE 할 때, Primary 파일 그룹 복원해도 데이터베이스 상태가 온라인 되는 것을 확인할 수 있습니다. 


-- 1. LAIGO 데이터베이스 생성, PRIMARY 파일 그룹 외 3개의 파일 그룹 생성  
SET NOCOUNT ON
USE master
IF DB_ID('LAIGO') IS NOT NULL DROP DATABASE LAIGO
GO
 
CREATE DATABASE LAIGO
 ON PRIMARY 
(NAME = N'File', FILENAME = N'D:\SQLDATA\LAIGO.mdf', SIZE = 3MB ), 

 FILEGROUP FG1 
(NAME = N'FG1File', FILENAME = N'D:\SQLDATA\LAIGO_FG1File.ndf', SIZE = 5MB), 

 FILEGROUP FG2 
(NAME = N'FG2File', FILENAME = N'D:\SQLDATA\LAIGO_FG2File.ndf', SIZE = 5MB ),

 FILEGROUP FG3 
(NAME = N'FG3File', FILENAME = N'D:\SQLDATA\LAIGO_FG3File.ndf', SIZE = 5MB )

 LOG ON 
(NAME = N'LAIGO_log', FILENAME = N'D:\SQLDATA\LAIGO_log.ldf', SIZE = 5MB)
GO



-- 2. FG1~FG3 파일그룹에 FG1_TABLE~FG3_TABLE 생성 및 데이터 추가 
USE LAIGO
GO

CREATE TABLE FG1_TABLE (a int, b int, c char(300) default 'FG1') ON FG1

DECLARE @i int; SET @i=0;
WHILE @i<10000
BEGIN
 SET @i=@i+1;
 INSERT INTO FG1_TABLE (a, b) VALUES (5*RAND(),100*RAND())
END;


CREATE TABLE FG2_TABLE (a int, b int, c char(300) default 'FG2') ON FG2

DECLARE @i int; SET @i=0;
WHILE @i<10000
BEGIN
 SET @i=@i+1;
 INSERT INTO FG2_TABLE (a, b) VALUES (5*RAND(),100*RAND())
END;


CREATE TABLE FG3_TABLE (a int, b int, c char(300) default 'FG3') ON FG3

DECLARE @i int; SET @i=0;
WHILE @i<10000
BEGIN
 SET @i=@i+1;
 INSERT INTO FG3_TABLE (a, b) VALUES (5*RAND(),100*RAND())
END;



-- 3. 데이터베이스 백업 
USE master
GO

BACKUP DATABASE LAIGO TO DISK = 'D:\SQLDATA\LAIGO.BAK' WITH INIT

Processed 176 pages for database 'LAIGO', file 'File' on file 1.
Processed 416 pages for database 'LAIGO', file 'FG1File' on file 1.
Processed 416 pages for database 'LAIGO', file 'FG2File' on file 1.
Processed 416 pages for database 'LAIGO', file 'FG3File' on file 1.
Processed 2 pages for database 'LAIGO', file 'LAIGO_log' on file 1.
BACKUP DATABASE successfully processed 1426 pages in 0.496 seconds (22.456 MB/sec).




-- 4. 장애 시나리오 재현을 위해 LAIGO 데이터베이스를 삭제합니다. 

USE master
GO
DROP DATABASE LAIGO


RESTORE FILELISTONLY FROM DISK = 'D:\SQLDATA\LAIGO.BAK'

 



-- 5. PRIMARY 파일 그룹만 복원합니다.
RESTORE DATABASE LAIGO FILEGROUP = 'PRIMARY' FROM DISK = 'D:\SQLDATA\LAIGO.BAK', PARTIAL

Processed 176 pages for database 'LAIGO', file 'File' on file 1.
Processed 2 pages for database 'LAIGO', file 'LAIGO_log' on file 1.
RESTORE DATABASE ... FILE=<name> successfully processed 178 pages in 0.323 seconds (4.299 MB/sec).




-- 6. LAIGO 데이터베이스가 온라인 상태로 전환 되었습니다.
SELECT name, STATE_DESC FROM SYS.databases WHERE name = 'LAIGO'

name      STATE_DESC
--------- -----------
LAIGO     ONLINE




-- 7. FG2 파일그룹에 있는 FG2_TABLE 테이블을 액세스 해 봅니다만 해당 파일그룹은 온라인 되어 있지 않아 액세스가 되지 않습니다. 
USE LAIGO
GO

SELECT * FROM FG2_TABLE

Msg 8653, Level 16, State 1, Line 1
The query processor is unable to produce a plan for the table or view 'FG2_TABLE' because the table resides in a filegroup which is not online.




-- 8. FG2 파일 그룹을 복원하여 테이블을 조회하면 성공합니다.
USE master
GO
RESTORE DATABASE LAIGO FILEGROUP = 'FG2' FROM DISK = 'D:\SQLDATA\LAIGO.BAK' 

Processed 416 pages for database 'LAIGO', file 'FG2File' on file 1.
RESTORE DATABASE ... FILE=<name> successfully processed 416 pages in 0.196 seconds (16.581 MB/sec).


USE LAIGO
GO
SELECT COUNT(*) FROM FG2_TABLE

10000




-- 9. 모든 파일 그룹을 복원합니다.
USE master
GO

RESTORE DATABASE LAIGO FILEGROUP = 'FG1' FROM DISK = 'D:\SQLDATA\LAIGO.BAK' 

Processed 416 pages for database 'LAIGO', file 'FG1File' on file 1.
RESTORE DATABASE ... FILE=<name> successfully processed 416 pages in 0.198 seconds (16.414 MB/sec).



RESTORE DATABASE LAIGO FILEGROUP = 'FG3' FROM DISK = 'D:\SQLDATA\LAIGO.BAK' 

Processed 416 pages for database 'LAIGO', file 'FG3File' on file 1.
RESTORE DATABASE ... FILE=<name> successfully processed 416 pages in 0.303 seconds (10.726 MB/sec).



USE LAIGO
GO
 
SELECT COUNT(*) AS FG1 FROM FG1_TABLE
SELECT COUNT(*) AS FG2 FROM FG2_TABLE
SELECT COUNT(*) AS FG3 FROM FG3_TABLE

FG1
-----------
10000

FG2
-----------
10000

FG3
-----------
10000




트랜잭션 로그가 있을 경우에는 아래와 같이 WITH NORECOVERY, PARTIAL 구문을 추가하시면 됩니다.
RESTORE DATABASE LAIGO FILEGROUP = 'PRIMARY' FROM DISK = 'D:\SQLDATA\LAIGO.BAK' WITH NORECOVERY, PARTIAL

RESTORE LOG LAIGO FILEGROUP = 'PRIMARY' FROM DISK = 'D:\SQLDATA\LAIGO.TRN'


대용량 데이터베이스를 운영한다면 PRIMARY 파일 그룹에는 서비스를 위해 필요한 최소 정보만을 배치하는 경우가 필요할 수도 있겠습니다. PRIMARY 파일 그룹만 복원이 완료되면 이후 파일 그룹은 온라인 상태에서 선별해서 복원이 가능하니깐요....


[참고자료]
Top 10 Features for Database Administration
http://www.microsoft.com/sqlserver/2005/en/us/top-30-features.aspx


작성자 : Lai Go / 작성일자 : 2011.04.13 
 
Posted by Lai Go