본문 바로가기

프로그래밍/MS-SQL

[MS-SQL] 특정시점으로 데이터 복원하기

1. 복구모드는 "전체"로 적용되어 있어야 하며, 백업에서도 동일하게 설정되어 있어야 트랜잭션로그 백업이 정상적으로 수행

 

2. 매일매일 데이터와 로그가 Full 백업이 이루어져 있어야 함

 

3. 예제

 

 1) delete from [table]  (데이터 날라감)

 

 2) select GATEDATE()  (현재시간 확인)

 

 3) backup log [문제DB] to disk = 'D:\DB_BACKUP\LAST_log.bak' with no_truncate (현재 트랜잭션 로그 백업)

 

 4) 새로운 DB 생성 (기존DB에 복원할 경우 2차문제 발생 가능)

 

 5) 새로운 DB에 문제가 발생한 기존 DB의 백업된 데이터를 복원 (반드시 순서대로 작업)

  - 문제가 발생한 해당 DB에서 sp_helpdb 명령어를 통해서 논리적인 '데이터이름'과 '로그이름' 조회

 

  - RESTORE DATABASE [새로운DB] FROM DISK = 'D:\DB_BACKUP\기존백업DB.bak'

    WITH 
    MOVE '데이터이름' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\새로운DB.MDF',
    MOVE '로그이름' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\새로운DB_Log.LDF',
    REPLACE, STATS=10, norecovery

  

 6) 새로운 DB에 문제가 발생한 기존 DB의 백업된 트랜잭션 로그를 복원

  - RESTORE LOG [새로운DB] FROM DISK = 'D:\DB_BACKUP\기존백업DB.trn'
    WITH 
    MOVE '데이터이름' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\새로운DB.MDF',
    MOVE '로그이름' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\새로운DB_Log.LDF',
    REPLACE, STATS=10, norecovery

 

 7) 마지막에 로그백업한 데이터를 가지고 삭제되기 전 시점으로 복원

  - RESTORE LOG [새로운DB] FROM DISK = 'D:\DB_BACKUP\LAST_log.bak'

    WITH 
    MOVE '데이터이름' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\새로운DB.MDF',
    MOVE '로그이름' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\새로운DB_Log.LDF',

    REPLACE, STATS=10, stopat = '2013-12-10 14:23:56.586', recovery 

 

 8) 데이터가 정상적으로 복구된것을 확인한 다음 INSERT INTO SELECT 문을 이용해서 데이터를 밀어넣음

  - INSERT INTO [문제DB].[table] (컬럼1, 컬럼2, 컬럼3, 컬럼4)

    SELECT 컬럼1, 컬럼2, 컬럼3, 컬럼4 FROM [새로운DB].[table] WHERE ~