/**********************************************************************************************
-- Title : [2k5] 파일 그룹의 PARTIAL(조각, piecemeal) 복구

-- Reference : hanbitbook.co.kr
-- Key word : restore database filegroup with partial 비상 로그 백업 no_truncate piecemeal
**********************************************************************************************/
USE master;

DROP DATABASE testDB2;

--데이터베이스 생성
CREATE DATABASE [testDB2] ON  PRIMARY
( NAME = N'FG1-1'
, FILENAME = N'd:\FG1-1.mdf'
),
( NAME = N'FG1-2'
, FILENAME = N'd:\FG1-2.ndf'
),
 FILEGROUP [FG2]
( NAME = N'FG2-1'
, FILENAME = N'd:\FG2-1.ndf'
),
( NAME = N'FG2-2'
, FILENAME = N'd:\FG2-2.ndf'
),
FILEGROUP [FG3]
( NAME = N'FG3-1'
, FILENAME = N'd:\FG3-1.ndf'
),
( NAME = N'FG3-2'
, FILENAME = N'd:\FG3-2.ndf'
)
 LOG ON
( NAME = N'testDB2_log'
, FILENAME = N'd:\testDB2_log.ldf'
);

--파일그룹별로 테이블 생성
CREATE TABLE testDB2.dbo.tblP (num int);
CREATE TABLE testDB2.dbo.tbl2 (num int) ON FG2;
CREATE TABLE testDB2.dbo.tbl3 (num int) ON FG3;

--데이터 저장
INSERT INTO testDB2.dbo.tblP VALUES(10);
INSERT INTO testDB2.dbo.tbl2 VALUES(11);
INSERT INTO testDB2.dbo.tbl3 VALUES(12);

--전체 백업
BACKUP DATABASE testDB2 TO disk = 'd:\testDB1.bak', disk = 'd:\testDB2.bak', disk = 'd:\testDB3.bak'
WITH NAME = N'전체백업', INIT, FORMAT;

--데이터 입력/확인
INSERT INTO testDB2.dbo.tblP VALUES(60);
INSERT INTO testDB2.dbo.tbl2 VALUES(61);
INSERT INTO testDB2.dbo.tbl3 VALUES(62);

SELECT * FROM testDB2.dbo.tblP;
SELECT * FROM testDB2.dbo.tbl2;
SELECT * FROM testDB2.dbo.tbl3;

--에러 발생
alter database testDB2 set offline; /*이후 mdf, ndf 파일 삭제*/

alter database testDB2 set online; --에러발생

/*
-- 우선 파일그룹 복원
-- tblP > tbl3 > tbl2의 중요도로 Primary > FG3 > FG2 순으로 복원
*/

--비상 로그 백업
BACKUP LOG testDB2 TO DISK='d:\비상로그1.bak'
 WITH NO_TRUNCATE, INIT;

RESTORE HEADERONLY FROM DISK = 'd:\testDB1.bak';
RESTORE HEADERONLY FROM DISK = 'd:\testDB2.bak';
RESTORE HEADERONLY FROM DISK = 'd:\testDB3.bak';
RESTORE HEADERONLY FROM DISK = 'd:\비상로그1.bak';

--Primary 복원(기본 그룹 복원시에만 partial 옵션 사용)
RESTORE DATABASE testDB2 FILEGROUP='PRIMARY'
FROM disk = 'd:\testDB1.bak', disk = 'd:\testDB2.bak', disk = 'd:\testDB3.bak'
WITH PARTIAL, NORECOVERY;

--비상로그 복원
RESTORE LOG testDB2 FROM DISK='d:\비상로그1.bak';

--Primary 오픈 확인
select * from testDB2.dbo.tblP;

--Primary에 데이터 추가
insert into testDB2.dbo.tblP values(70);

--FG2, FG3 접근 확인
select * from tbl2;
select * from tbl3;

--FG3 복원위해 비상로그 백업
BACKUP LOG testDB2 TO DISK='d:\비상로그2.bak'
 WITH NO_TRUNCATE, INIT;

--FG3 복원
RESTORE DATABASE testDB2 FILEGROUP='FG3'
FROM disk = 'd:\testDB1.bak', disk = 'd:\testDB2.bak', disk = 'd:\testDB3.bak'
WITH NORECOVERY;

RESTORE LOG testDB2  FROM DISK='d:\비상로그2.bak';

--복구 확인
select * from testDB2.dbo.tbl3;
select * from testDB2.dbo.tblP;
select * from testDB2.dbo.tbl2; --요건 아직 복구된 파일 그룹이 아니라서 안됨.

--F3에 데이터 추가
insert into testDB2.dbo.tbl3 values(73);
 
--FG2 복원위해 비상로그 백업
BACKUP LOG testDB2 TO DISK='d:\비상로그3.bak'
 WITH NO_TRUNCATE, INIT;

--FG2 복원
RESTORE DATABASE testDB2 FILEGROUP='FG2'
FROM disk = 'd:\testDB1.bak', disk = 'd:\testDB2.bak', disk = 'd:\testDB3.bak'
WITH NORECOVERY;

RESTORE LOG testDB2  FROM DISK='d:\비상로그3.bak';

--확인
select * from testDB2.dbo.tbl2;
select * from testDB2.dbo.tblP;
select * from testDB2.dbo.tbl3; -- 좀전에 잘되던 FG3는 왜 안될까???? primary 그룹 외에는 partial
                                            -- 옵션 안써야 되서 그러넹...

신고

+ Recent posts