SQL DBCC SHRINKFILE 후 시점 로그복원이 가능할까?
실수로 데이터를 지워 먹고 긴급하게 백업본으로 복원을 할 때가 종종 있다.
난 아직까진 없었다.
[시나리오]
새벽에 전체백업 스케즐이 동작을 하였고, 데이터베이스 용량이 너무 커서 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
*/