본 게시물은 개인적인 의견으로 작성되었으니 절대적인 정보가 아닐 수 있습니다. 참고만 하시고 궁금한 사항이 있으시면 연락주세요.

티스토리 뷰

실수로 데이터를 지워 먹고 긴급하게 백업본으로 복원을 할 때가 종종 있다.

난 아직까진 없었다.

   

[시나리오]

새벽에 전체백업 스케즐이 동작을 하였고, 데이터베이스 용량이 너무 커서 SHRINKFILE 작업을 하기 위해서

특정 대용량테이블을 TRUNCATE TABLE 후에 DBCC SHRINKFILE(로그)을 날렸다.

몇시간 후에 땀 삐질삐질 상황이 되버렸다.

자 복원하자. TRAUNCATE TABLE 이전 시점으로 복원이 가능할까?

 

[결론]

최종로그 백업 후에 시점(STOPAT)으로 복원이 가능하다. 상황에 따라 조금씩 다를 수 있을 것 같기도 하다.

   

[테스트]

SQL SERVER 2014에서 테스트


-- 테스트 데이터 만들기

    CREATE DATABASE TESTDB

 

    USE TESTDB

    GO

 

    CREATE TABLE DBO.TBL (COL1 INT, COLDATE DATETIME DEFAULT GETDATE())

 

    INSERT INTO DBO.TBL(COL1) VALUES (1)

    INSERT INTO DBO.TBL(COL1) VALUES (2)

    INSERT INTO DBO.TBL(COL1) VALUES (3)

 

    SELECT * FROM DBO.TBL

    /*

    COL1    COLDATE

    1        2016-02-22 10:25:10.583

    2        2016-02-22 10:25:27.760

    3        2016-02-22 10:25:27.763

    */

 

 

-- 전체백업

    BACKUP DATABASE TESTDB to disk='E:\SQLData9\TESTDB.bak'

 

-- 데이터 입력

    INSERT INTO DBO.TBL(COL1) VALUES (4)

    INSERT INTO DBO.TBL(COL1) VALUES (5)

    INSERT INTO DBO.TBL(COL1) VALUES (6)

 

    SELECT * FROM DBO.TBL

    /*

    COL1    COLDATE

    1    2016-02-22 10:26:21.147

    2    2016-02-22 10:26:21.147

    3    2016-02-22 10:26:21.150

    4    2016-02-22 10:26:59.457

    5    2016-02-22 10:26:59.460

    6    2016-02-22 10:26:59.460

    */

-- 데이터 삭제 - 휴먼에러 띠띵~ 삐질

    SELECT GETDATE()

    TRUNCATE TABLE TBL

    SELECT GETDATE() -- 2016-02-22 10:28:43.267

    SELECT * FROM DBO.TBL

    /* NULL */

 

-- 로그삭제 SHRINKFILE 을 하고 나서 로그백업으로 시점 복원이 가능하냐???

    SP_HELPDB TESTDB

 

    DBCC SHRINKFILE(TESTDB_log)

 

 

-- 장애복구 하자 : 최종로그백으로 시점 복원해보자.

    BACKUP LOG TESTDB to disk='E:\SQLData9\TESTDB.trn'

 

 

-- 다른 디비일음으로 시점 복원해보자.

    USE [master]

    RESTORE DATABASE TESTDB_RE FROM DISK = N'E:\SQLData9\TESTDB.bak' WITH FILE = 1,

    MOVE N'TESTDB' TO N'E:\Program Files\Microsoft SQL Server\MSSQL12.GHOST\MSSQL\DATA\TESTDB_RE.mdf',

    MOVE N'TESTDB_log' TO N'E:\Program Files\Microsoft SQL Server\MSSQL12.GHOST\MSSQL\DATA\TESTDB_RE_log.ldf', NORECOVERY, NOUNLOAD, STATS = 5

    GO

 

    RESTORE LOG TESTDB_RE FROM DISK = N'E:\SQLData9\TESTDB.trn' WITH NOUNLOAD, STATS = 10

    , STOPAT = '2016-02-22 10:26:59.470' -- 마지막 정상 트랜재션시간으로 입력

    GO

 

 

-- 시점 복원한 데이터가 있는지 확인하자.

    SELECT * FROM TESTDB_RE.DBO.TBL

    /*

    COL1    COLDATE

    1    2016-02-22 10:26:21.147

    2    2016-02-22 10:26:21.147

    3    2016-02-22 10:26:21.150

    4    2016-02-22 10:26:59.457

    5    2016-02-22 10:26:59.460

    6    2016-02-22 10:26:59.460

    */

 

   

   

댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday