MS

MSSQL 백업/복구 정리

콩메모 2024. 1. 4. 20:40

데이터베이스를 생성하면 mdf 파일과 ldf 파일이 생성이 된다.

mdf 파일은 데이터파일이고, ldf 파일은 로그파일인데, mdf에는 실제 데이터가 저장이 된다.

그리고, ldf 파일은 직전 로그백업 이후의 변경 사항에 대해 저장이 된다.

데이터베이스는 어떤 백업을 할지에 따라 복구모델을 지정해줘야 한다.


데이터베이스 복구모델

전체 복구모델(Full Recovery Model)

로그백업을 할 수 있게 해준다.

최종 상태 뿐만 아니라 원하는 시점 까지만 복구하는것도 가능하다.

대량로그 복구모델 (Bulked-Log Recovery Model)

로그백업을 할 수 있는 것은 “전체 복구모델”과 같으나, 특정 시점 복구는 지원하지 않는다.

단, 그만큼 속도 면에서 “전체 복구모델”보다 유리하다.

굳이 특정시점 복구가 필요없을시는 이 복구모델을 사용한다.

단순모델(Simple Model)

LDF 파일을 이용하지 않는 모델이다.

즉, 로그백업을 지원하지는 않는다.

전체백업, 차등백업은 가능하다.


데이터베이스 백업/복구 종류

전체 백업

데이터베이스 전체를 백업한다.

디비를 최초로 생성했거나, 트랜잭션로그를 비운 직후, 데이터베이스 변경(Alter Database) 후에는 전체 백업을 새로 해줘야 한다.

그리고, 새로운 차등백업, 로그백업 전에도 반드시 전체백업을 수행해야 한다.

차등백업

전체 백업 이후에 증분된 데이터에 대한 백업을 한다.

기준이 전체 백업이므로, 시간이 지날수록 차등백업본 또한 용량이 누적되어 점점 커지게 된다.

트랜잭션 로그 백업

LDF를 이용한 백업이다.

로그백업은 직전에 수행한 로그백업 이후에 변경된 내용을 백업 하는 것이므로, 용량은 거의 일정하게 나오게 된다.

다만, 로그백업 중간 파일이 유실되면, 그 유실된 이후 파일은 무용지물이 되고, 이전까지만 복구가 가능하다.

로그백업을 하게 되면 로그를 모두 비우게 된다. ( 전체백업이나 차등백업은 로그를 비우지 않는다. )

만약 데이터가 대량으로 변경이 되었다면(배치수행) 로그의 용량이 방대해 지므로, 다시 전체백업 후 로그백업을 수행해야 효율적이다.


백업 명령문

전체백업

BACKUP DATABASE 디비명 TO DISK='c:\mydb_full.bak'

차등백업

BACKUP DATABASE 디비명 TO DISK='c:\mydb_partial.bak'
WITH DIFFERENTIAL

로그백업

BACKUP LOG 디비명 TO DISK='c:\mydb_log.bak'


복구 명령문

전체복원

RESTORE DATABASE 디비명 FROM DISK='c:\mydb_full.bak'

차등복원

RESTORE DATABASE 디비명 FROM DISK='c:\mydb_full.bak'
WITH NORECOVERY;
RESTORE DATABASE 디비명 FROM DISK='c:\mydb_partial.bak'

위와 같이 전체 복원을 한 후 차등백업파일을 복원한다.

WITH NORECOVERY 옵션은 복구할것이 더 있다는 것을 지정하는 옵션으로, 디비가 대기 상태로 되어 접속을 막아준다.

즉, 마지막 복구 명령 뒤에는 옵션을 뺀다.

로그복원

RESTORE DATABASE 디비명 FROM DISK='c:\mydb_full.bak'
WITH NORECOVERY;
RESTORE LOG 디비명 FROM DISK='c:\mydb_log1.bak'
WITH NORECOVERY;
RESTORE LOG 디비명 FROM DISK='c:\mydb_log2.bak'
WITH NORECOVERY;
RESTORE LOG 디비명 FROM DISK='c:\mydb_log3.bak'

위와 같이 전체 복원을 한 후 로그백업파일들을 순차적으로 복원한다.

( WITH NORECOVERY 옵션은 마지막 명령에서만 빼고 실행한다. )

만약 마지막에도 WITH NORECOVERY 옵션을 사용했다면 계속 대기 상태로 남게 되는데 이때는 아래 명령을 내려주면 된다.

RESTORE DATABASE 디비명 WITH RECOVERY

위 명령은 실제 복구작업은 하지 않고, 대기만 풀어주게 된다.


복구 시나리오

데이터베이스가 유실되어 백업 파일로 복구를 하려 한다.

백업파일은 Full백업 하나와 로그백업 세개가 있다.

복구시 디비명을 다르게 복구하려 한다.

원본디비명

MyDB_source

전체백업파일

D:\Temp\MyDB_source_full.bak

로그백업파일

D:\Temp\MyDB_log_1.bak
D:\Temp\MyDB_log_2.bak
D:\Temp\MyDB_log_3.bak

복구디비명

MyDB_target

복구절차

백업 파일로부터 복구하려는 디비의 논리명을 구한다.

RESTORE FILELISTONLY FROM DISK='D:\Temp\MyDB_source_full.bak'
(결과)
LogiclaName
MyDB_source
MyDB_source_log

데이터파일은 MyDB_source, 로그파일은 MyDB_source_log 임을 알 수 있다.

MyDB_source 데이터베이스를 MyDB_target 데이터베이스로 복구한다.

RESTORE DATABASE MyDB_target FROM DISK='D:\Temp\MyDB_source_full.bak'
WITH
MOVE 'MyDB_source' TO 'D:\Datas\MyDB_target.mdf',
MOVE 'MyDB_source_log' TO 'D:\Datas\MyDB_target.ldf',
NORECOVERY

즉, MyDB_source는 D:\Datas\MyDB_target.mdf 로 이동해서 복구를 하고, MyDB_source_log는 D:\Datas\MyDB_target.ldf로 이동해서 복구하겠다는 의미이다.

그리고, 뒤에 더 복구할 것이 남아있다는 의미로 NORECOVERY 옵션을 주었다.

로그백업을 순차적으로 실행한다.

RESTORE LOG MyDB_target FROM DISK='D:\Temp\MyDB_log_1.bak'
WITH NORECOVERY
RESTORE LOG MyDB_target FROM DISK='D:\Temp\MyDB_log_2.bak'
WITH NORECOVERY
RESTORE LOG MyDB_target FROM DISK='D:\Temp\MyDB_log_3.bak'
WITH NORECOVERY

복구 완료되었음을 알려준다.

( 만약 위 로그복구의 마지막 복구시 WITH NORECOVERY 옵션을 빼고 실행했다면, 아래 명령은 내릴 필요가 없다. )

RESTORE DATABASE MyDB_target
WITH RECOVERY

즉, 복구가 완료되어 접근 가능토록 해준다.

복구 결과

MyDB_target 데이터베이스명으로 복구가 되었고,

파일은 D:\Datas\MyDB_target.mdf 파일과 D:\Datas\MyDB_target.ldf 파일로 생성이 되었다.