---데이터 베이스의 백업과 복원에 대한 강의
---이미 DataBase가 있다면 날려 버리도록 한다.---
IF EXISTS (SELECT *
FROM master..sysdatabases
WHERE name = N'MydbVins')
DROP DATABASE MydbVins
GO
CREATE DATABASE MydbVins
ON PRIMARY
( NAME = MydbVinsData1,
FILENAME = N'C:\program files\microsoft sql server\mssql\data\MydbVins_1.mdf',
SIZE = 1MB,
MAXSIZE = 200MB,
FILEGROWTH = 10%),
FILEGROUP Group2
( NAME = MydbVinsData2,
FILENAME = N'c:\program files\microsoft sql server\mssql\data\MydbVins_2.ndf',
SIZE = 1MB,
MAXSIZE = 200MB,
FILEGROWTH = 10%),
FILEGROUP Group3
( NAME = MydbVinsData3,
FILENAME = N'c:\program files\microsoft sql server\mssql\data\MydbVins_3.ndf',
SIZE = 1MB,
MAXSIZE = 200MB,
FILEGROWTH = 10%)
LOG ON
( NAME = MydbVinsLog,
FILENAME = N'c:\program files\microsoft sql server\mssql\data\MydbVins_log_1.ldf',
SIZE = 1MB,
MAXSIZE = 200MB,
FILEGROWTH = 10%)
GO
Use MydbVins
Create Table VinsA(id int)
Create Table VinsB(id int) on Group2
Create Table VinsC(id int) on Group3
--이렇게 새로운 데이터베이스와 테이블이 생성 되었으면 전체 백업을 실행해야 한다...
--전체 백업을 실행해야 할때는..
/*
1, 데이터베이스가 생성 되었거나 테이블이 생성된 경우
2, 인덱스를 새롭게 설정한 경우
3, 사용자가 추가된 경우들일수 있다
이보다 Full 백업을 해야 하는 경우는 많다...
*/
--우선 Full Backup을 하도록 한다.
Backup database MydbVins to disk = 'd:\dbBackup\Full_MydbVins' with INIT
insert VinsA values(1) --vinsA에 값을 하나 입력하고 다시 풀 백업을 한다.
backup database MydbVins to disk = 'd:\dbBackup\Full_MydbVins_01' with INIT
--이번에 VinsA에 2를 입력하고 "로그" 백업을 받아 보자
insert VinsA values(2)
Backup Log MydbVins to disk = 'd:\dbBackup\F_MydbVins_Log01' with INIT
---위 VinsA 테이블에서 했던것 처럼 VinsB테이블에서도 똑같이 해 보자...=======
insert VinsB values(1) --vinsB에 값을 하나 입력하고 다시 풀 백업을 한다.
backup database MydbVins FileGroup='Group2' to disk = 'd:\dbBackup\Full_MydbVins_02' with INIT --백업 파일 이름은 달라야 한다 ^^
--이번에 VinsB에 2를 입력하고 "로그" 백업을 받아 보자
insert VinsB values(2)
Backup Log MydbVins to disk = 'd:\dbBackup\F_MydbVins_Log02' with INIT --여기도 마찬가지..
--VinsC 테이블에서도 한번더 하자...
insert VinsC values(1)
backup database MydbVins FileGroup='Group3' to disk = 'd:\dbBackup\Full_MydbVins_03' with INIT
insert VinsC values(2)
Backup Log MydbVins to disk = 'd:\dbBackup\F_MydbVins_Log03' with INIT
--여기 까지 되었다면..VinsA, VinsB, VinsC 에 똑같은 값 1,2가 입력 되었다...
--그럼 여기서 VinsC에만 3이라는 값을 입력하자...
insert VinsC values(3)
Select * from VinsA
Select * from VinsB
Select * from VinsC
--결과는 아래와 같을 것이다.
/*
id
-----------
1
2
(2개 행 적용됨)
id
-----------
1
2
(2개 행 적용됨)
id
-----------
1
2
3
(3개 행 적용됨)
여길 보면 VinsC에는 3이라는 값이 입력 되고 아무런 백업이 되지 않앗다.
만약 이후에 데이터가 깨어졌다면.. 어디까지복원이 될까?~~~
데이터가 깨어진것을 시뮬레이션 하기 위해서 fileGroup2을 삭제 하자...(ReName 하던지..)
탐색기 가서..MydbVins_3.ndf 를 삭제하면 된다...
*/
-----------------------------------------------------------------------------
/*
컴터 를 끄고 다시 부팅하는 부분(10분 걸렸음)
*/
-----------------------------------------------------------------------------
Restore database MydbVins filegroup = 'Group3' from disk = 'd:\dbBackup\Full_MydbVins_03'
/*
위 복구문을 실행하면 아래의 메시지를 출력한다...
-------------------------------------------------------------------------
서버: 메시지 3159, 수준 16, 상태 1, 줄 1
'MydbVins' 데이터베이스 로그의 끝 부분이 백업되지 않았습니다. 로그를 백업하고 FILE 절을 지정하여 RESTORE 문을 다시 실행하십시오.
서버: 메시지 3013, 수준 16, 상태 1, 줄 1
RESTORE DATABASE이(가) 비정상적으로 종료되는 중입니다.
-------------------------------------------------------------------------
" 로그의 끝 부분이 백업 " 이 되지 않앗다고 메시지를 날리고 있다.
" 그럼Log 백업을 받아 보자..."
*/
Backup Log MydbVins to disk = 'd:\dbBackup\F_MydbVins_Log05' with no_truncate, init
/*
난 이부분이 신기하다 깨어진 데이터베이스에서 접속초자 안되지만 백업을 받을수 있다는 점...
메시지는 아래와 같다..
----------------------------------------------------------------------------
1 파일에서 'MydbVins' 데이터베이스, 'MydbVinsLog' 파일에 대해 1페이지를 처리했습니다.
BACKUP LOG이(가) 1페이지를 0.089초(0.017MB/초)만에 처리했습니다.
----------------------------------------------------------------------------
좀전에는 Group3 만 날리기로 했지만...어쩌다 보니 Group2까지 날려 먹었다....ㅜ.ㅜ;
해서 2와 3을 복구 해야만 한다..
*/
Restore database MydbViins filegroup = 'Group3' from disk = 'd:\dbBackup\Full_MydbVins_03' with norecovery
Restore log MydbViins from disk = 'd:\dbBackup\F_MydbVins_Log03' with norecovery
Restore log MydbViins from disk = 'd:\dbBackup\F_MydbVins_Log05' with norecovery