프로그래밍/기타

Azure DB 백업, 복구 방법

p-a-r-k 2018. 4. 18. 20:19
반응형

** VM with SQL Server 2016 을 대상으로 함 **

1. 백업

  • Azure 가 기본적으로 재공하는 확장 기능인 SqlIaaSExtension 을 사용

  • 확장 기능의 설정은 SQL Server 구성에서 '자동화된 백업'을 사용하여 설정

  • 설정 정보


위와 같이 설정하면 wsdjpedbbak 저장소계정의 BLOB 에 backupcontainer 라는 컨테이너가 생성된다.

설정 정보

  1. 보존기간 : 30일
  2. 저장소계정 : wsdjpedbbak
  3. 암호화 : 사용안함
  4. 백업 시스템 데이터베이스 : 사용안함
  5. 백업 일정 구성 : 수동
  6. 백업빈도 : 매일
  7. 전체백업 - 백업시작시간(로컬VM시간) : 03:00
  8. 전체백업 - 백업기간(시간) : 2 시간
  9. 로그백업 - 백업빈도(분) : 10 분


  • 저장소계정에 백업된 DB, LOG 파일 (portal 에서 확인 또는 Azure Storage Explorer 를 사용하여 저장소 확인 가능)



2.복구

 Azure Storage Account 의 Blob 에 저장된 bak, log 파일을 사용하여 복원을 시도할 수 있다.

 복원하려는 시점에서 VM 에 기존 DB 가 있는 경우와 DB 가 존재하지 않는 경우에 T-SQL 이 조금 다를 수 있다.

 아래 예제를 확인하자

-- restore and recover to a point in time between the times of two transaction log backups, and then verify the row count  
ALTER DATABASE AdventureWorks2014 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;  
RESTORE DATABASE AdventureWorks2014   
   FROM URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/<firstbackupfile>.bak'   
   WITH NORECOVERY,REPLACE;  
RESTORE LOG AdventureWorks2014   
   FROM URL = 'https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/<secondbackupfile>.bak'    
   WITH RECOVERY, STOPAT = 'June 26, 2015 01:48 PM';  
ALTER DATABASE AdventureWorks2014 set multi_user;  
-- get new count  
SELECT COUNT (*) FROM AdventureWorks2014.Production.Location ;

 위의 T-SQL 은 마이크로소프트 사의 AdventureWorks2014 데이터베이스를 복원하는 명령어이다.

  1. 기존의 데이터베이스를 SINGLE_USER 모드로 전환
  2. 특정 시점의 전체 백업파일을 사용하여 데이터베이스 복원, WITH NORECOVERY(아직 복원이 마무리되지 않음), REPLACE(기존의 DB를 복원DB로 교체)
  3. 증분 백업된 로그 파일을 사용하여 추가 복원, WITH RECOVERY(복원 마무리), STOPAT(지정한 시점까지만 로그를 복원)
  4. 복원된 데이터베이스를 다시 MULTI_USER 모드로 전환
  5. 복원된 DB 상태를 확인

순으로 진행된다. 위의 경우는 기존 DB 가 아직 남아 있는 상태에서 복원을 시도하는 것으로 만약 wholedoc 을 대상으로 한다면 다음과 같은 T-SQL 을 구성할 수 있다.

ALTER DATABASE wholedoc SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE wholedoc
   FROM URL = 'https://wsdjpedbbak.blob.core.windows.net/backupcontainer/wholedoc_929834983489834_20170101030000.bak'
   WITH NORECOVERY, REPLACE;
RESTORE LOG wholedoc
   FROM URL = 'https://wsdjpedbbak.blob.core.windows.net/backupcontainer/wholedoc_929834983489834_20170101031000.log'
   WITH NORECOVERY
RESTORE LOG wholedoc
   FROM URL = 'https://wsdjpedbbak.blob.core.windows.net/backupcontainer/wholedoc_929834983489834_20170101032000.log'
   WITH RECOVERY, STOPAT = '2017-01-01 03:15:20.000';
ALTER DATABASE wholedoc SET MULTI_USER;

위의 명령어는 다음과 같다.

  1. wholedoc 데이터베이스를 SINGLE_USER 모드로 전환
  2. URL 의 전체 백업 파일을 사용하여 데이터베이스를 복원, WITH NORECOVERY(아직 복원이 마무리되지 않음), REPLACE(기존의 DB를 복원DB로 교체)
  3. URL 의 증분 로그 파일을 사용하여 데이터베이스 추가 복원, WITH NORECOVERY(아직 복원이 마무리되지 않음)
  4. URL 의 증분 로그 파일을 사용하여 데이터베이스 추가 복원, WITH RECOVERY(복원 마무리), STOPAT(지정한 시점까지만 로그를 복원)
  5. 복원된 데이터베이스를 다시 MULTI_USER 모드로 전환


이번에는 복원하는 시점에서 VM 에 기존의 DB 가 남아있지 않는 경우, 또는 VM을 다시 구성하여 기존의 데이터베이스가 없는 경우를 상정하여 복원을 시도하는 T-SQL 을 만들어보자.

  • 최종 전체 백업 파일만 사용하여 복원하는 경우
RESTORE DATABASE wholedoc FROM DISK ='https://wsdjpedbbak.blob.core.windows.net/backupcontainer/wholedoc_47c31b8b9ddd48c7830b5a4cb74a923a_20170817030421+09.bak'
   WITH RECOVERY,
   MOVE 'smart_jt' TO 'F:\Data\wholedoc.MDF',
   MOVE 'smart_jt_log' TO 'G:\Log\wholedoc.LDF';
ALTER DATABASE wholedoc SET MULTI_USER;

 위 명령어는 다음과 같다.

  1. 단일 전체 백업 파일을 사용하여 복원을 시도
  2. WITH RECOVERY (T-SQL 이 실행완료되는 경우 복원 완료)
  3. smart_jt 데이터베이스의 MDF 파일의 위치를 특정 위치로 지정
  4. smart_jt_log 로그의 LDF 파일의 위치를 특정 위치로 지정
  5. 데이터베이스를 MULTI_USER 모드로 전환


  • 최종 전체 백업 파일과 증분 로그 파일을 사용하여 복원하는 경우
RESTORE DATABASE wholedoc FROM URL ='https://wsdjpedbbak.blob.core.windows.net/backupcontainer/wholedoc_47c31b8b9ddd48c7830b5a4cb74a923a_20170817030421+09.bak'
   WITH NORECOVERY,
   MOVE 'smart_jt' TO 'F:\Data\wholedoc.MDF',
   MOVE 'smart_jt_log' TO 'G:\Log\wholedoc.LDF';
RESTORE LOG wholedoc
   FROM URL = 'https://wsdjpedbbak.blob.core.windows.net/backupcontainer/wholedoc_929834983489834_20170101031000.log'
   WITH NORECOVERY
RESTORE LOG wholedoc
   FROM URL = 'https://wsdjpedbbak.blob.core.windows.net/backupcontainer/wholedoc_929834983489834_20170101032000.log'
   WITH RECOVERY, STOPAT = '2017-01-01 03:15:20.000';
ALTER DATABASE wholedoc SET MULTI_USER;

위 명령어는 다음과 같다.

  1. 전체 백업 파일과 증분 로그 파일 2개를 사용하여 백업을 시도
  2. 첫 명령어는 위에 설명한 단일 전체 백업 파일을 사용하여 복원을 시도하는 것과 동일함, 다만 WITH NORECOVERY 만 다름, 복원을 계속 진행하기 위함
  3. 첫번째 증분 로그 파일을 복원
  4. 두번째 증분 로그 파일을 복원, WITH RECOVERY 를 사용하여 복원 완료, STOPAT 을 이용하여 특정 시점까지 복원
  5. 데이터베이스를 MULTI_USER 모드로 전환


관련문서

  1. Microsoft Azure Blob 저장소 서비스로 SQL Server 백업 및 복원 (링크)
  2. 자습서: SQL Server 2016에서 Azure Blob Storage 서비스 사용 (링크)
  3. 7단원: 데이터베이스를 특정 시점으로 복원 (링크)
  4. 복원 시 STOPAT 에 사용가능한 DateFormat (링크)
  5. RESTORE 문 (TRANSACT-SQL) (링크)


반응형