안녕하세요
SQL Server 운영과 튜닝으로 테스트 중에 궁금한 점이 있어 질문드립니다.
우선, 감사드리며, 시작 합니다.
목적
: 다른 DB 이름으로 시점복구(STOPAT)
-- 아무래도, 운영중에 테이블이나 데이타가 유실시, 해당 서버에서 다름 DB 이름으로 복구 하고
-- 테이블(데이타)만 복구 하는 Need 가 예상되어 테스트 수행
[이하 테스트 Script ]
-- 가. 테스트 백업
-- DROP DATABASE SQLTAG2
USE master
GO
IF EXISTS ( SELECT * FROM SYS.DATABASES WHERE NAME =N'SQLTAG' )
DROP DATABASE SQLTAG
GO
IF EXISTS ( SELECT * FROM SYS.DATABASES WHERE NAME =N'SQLTAG2' )
DROP DATABASE SQLTAG2
GO
CREATE DATABASE SQLTAG ;
GO
USE SQLTAG
GO
CREATE TABLE T1 ( PK INT IDENTITY PRIMARY KEY , NAME VARCHAR(20) )
GO
INSERT T1 VALUES ( 'FULL')
GO
BACKUP DATABASE [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
GO
INSERT T1 VALUES ('DIFF 1')
GO
BACKUP DATABASE [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_DIFF_1.BAK'
GO
INSERT T1 VALUES ('LOG 1')
GO
BACKUP LOG [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_LOG_1.TRN'
GO
INSERT T1 VALUES ('LOG 2');
GO
BACKUP LOG [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_LOG_2.TRN'
GO
SELECT * FROM T1
GO
SELECT GETDATE()
GO
-- 2016-02-04 10:08:22.043
DELETE FROM T1
GO
USE MASTER
GO
-- 로그꼬리 백업 이 아닌 일반 Transaction Log 백업 수행
BACKUP LOG [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_LOG_3.TRN'
GO
나. 복구 시도
USE MASTER
GO
-- 백업 파일 목록 확인
RESTORE FILELISTONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
GO
-- 현재 SQLTAG2 라는 DB 는 존재하지 않음 --> 아래 수행 결과 SQLTAG2(복원 중)으로 생성됨
RESTORE DATABASE [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
WITH REPLACE, NORECOVERY, -- 한번에 복구만 할 경우는 WITH RECOVERY, OPTION 사용 하면 끝
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- 이후 Transcacion Log 백업 반영 시도
USE MASTER
GO
-- 백업 파일 목록 확인
RESTORE FILELISTONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
GO
-- 현재 SQLTAG2 라는 DB 는 존재하지 않음 --> 아래 수행 결과 SQLTAG2(복원 중)으로 생성됨
RESTORE DATABASE [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
WITH REPLACE, NORECOVERY, -- 한번에 복구만 할 경우는 WITH RECOVERY, OPTION 사용 하면 끝
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- SQLTAG2 에 TRANSACTION LOG 적용
-- 2번째 차등 백업 복원
-- 백업 파일 목록 확인
RESTORE FILELISTONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_DIFF_1.BAK'
GO
RESTORE DATABASE [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_DIFF_1.BAK'
WITH REPLACE, NORECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- 트랜잭션1 복원
RESTORE LOG [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_LOG_1.TRN'
WITH REPLACE, NORECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- 트랜잭션2 복원
RESTORE LOG [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_LOG_2.TRN'
WITH REPLACE, NORECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- 트랜잭션3 복원 (꼬리 백업이 아닌 일발 트랜잭션 로그 백업 )
-- 백업 파일 목록 확인
RESTORE FILELISTONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_LOG_3.TRN'
GO
RESTORE LOG [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_LOG_3.TRN'
WITH REPLACE,STOPAT ='2016-02-04 10:08:22.043', NORECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- 에러 코드
메시지 3154, 수준 16, 상태 4, 줄 1
백업 세트에 기존 'SQLTAG2' 데이터베이스가 아닌 데이터베이스의 백업이 있습니다.
메시지 3013, 수준 16, 상태 1, 줄 1
RESTORE LOG이(가) 비정상적으로 종료됩니다.
Comment 2
-
minsouk
2016.02.04 13:34
-
구로동라이더
2016.02.04 18:17
감사합니다.
힌트 주신걸로 풀었네요..
다른 DB 이름으로 시점 복구 하기
-- DROP DATABASE SQLTAG2
USE master
GO
IF EXISTS ( SELECT * FROM SYS.DATABASES WHERE NAME =N'SQLTAG' )
DROP DATABASE SQLTAG
GOIF EXISTS ( SELECT * FROM SYS.DATABASES WHERE NAME =N'SQLTAG2' )
DROP DATABASE SQLTAG2
GO
CREATE DATABASE SQLTAG ;
GOUSE SQLTAG
GOCREATE TABLE T1 ( PK INT IDENTITY PRIMARY KEY , NAME VARCHAR(20) )
GOINSERT T1 VALUES ( 'FULL')
GOBACKUP DATABASE [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_FULL.BAK' WITH INIT
GOINSERT T1 VALUES ('DIFF 1')
GOBACKUP DATABASE [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_DIFF_1.BAK' WITH INIT
GOINSERT T1 VALUES ('LOG 1')
GOBACKUP LOG [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_LOG_1.TRN' WITH INIT
GOINSERT T1 VALUES ('LOG 2');
GOBACKUP LOG [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_LOG_2.TRN' WITH INIT
GO
SELECT * FROM T1
GOSELECT GETDATE()
GO
-- 2016-02-04 17:57:43.207
DELETE FROM T1
GOUSE MASTER
GO
-- 로그꼬리 백업 이 아닌 일반 Transaction Log 백업 수행
BACKUP LOG [SQLTAG] TO DISK='D:\SQL\BACKUP\SQLTAG_LOG_3.TRN' WITH INIT
GO
USE MASTER
GO-- 백업 파일 목록 확인
-- RESTORE HEADERONLY : 특정 백업 장치의 모든 백업 세트에 대한 백업 헤더 정보를 모두 포함하는 결과 집합을 반환합니다.
RESTORE HEADERONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
GO-- RESTORE filelistonly : 백업 세트에 포함된 데이터베이스와 로그 파일의 목록을 포함하는 결과 집합을 반환합니다.
RESTORE filelistonly
FROM DISK='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
GO-- 현재 SQLTAG2 라는 DB 는 존재하지 않음 --> 아래 수행 결과 SQLTAG2(복원 중)으로 생성됨
RESTORE DATABASE [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_FULL.BAK'
WITH NORECOVERY, -- 한번에 복구만 할 경우는 WITH RECOVERY, OPTION 사용 하면 끝
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO-- SQLTAG2 에 TRANSACTION LOG 적용
-- 2번째 차등 백업 복원
-- 백업 파일 목록 확인
RESTORE HEADERONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_DIFF_1.BAK'
GORESTORE DATABASE [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_DIFF_1.BAK'
WITH NORECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO-- 트랜잭션1 복원
RESTORE LOG [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_LOG_1.TRN'
WITH NORECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- 트랜잭션2 복원
RESTORE LOG [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_LOG_2.TRN'
WITH NORECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GO
-- 트랜잭션3 복원 (꼬리 백업이 아닌 일발 트랜잭션 로그 백업 )
-- 백업 파일 목록 확인
RESTORE FILELISTONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_LOG_3.TRN'
GORESTORE HEADERONLY
FROM DISK='D:\SQL\BACKUP\SQLTAG_LOG_3.TRN'
GO
RESTORE LOG [SQLTAG2]
FROM DISK ='D:\SQL\BACKUP\SQLTAG_LOG_3.TRN'
WITH STOPAT ='2016-02-04 17:57:43.207', RECOVERY,
MOVE 'SQLTAG' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2.mdf',
MOVE 'SQLTAG_log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SQLTAG2_log.ldf'
GOUSE [SQLTAG2]
GO
-- 복구 데이타 확인
SELECT * FROM T1
GO
네, 일단 책에 있는 스크립트로 개념을 학습하시고 restore database, restroe log 의 cmd 를 msdn 에서 보시면서 들어갈 수 있는 명령어 인지 없는지 보시면 좋을듯 합니다. 원래 따라하기 할때는 하나도 안바꾸고 하는게 좋습니다. (제가 다른사람이 만든거 따라 할대는 주로 하나도 응용하지 않고 처음부터 끝까지 같은 결과가 나올때까지 연습을 먼저 하고 응용 해보고, 안되면 매뉴얼을 확인 합니다.) 추가로, restore filelistonly 말고 restore headeronly 나 dbcc checkprimaryfile 같은 명령어로 자세한 확인을 하고 난 후 하세요~
restore log 에는 with replace 뭐 이런거 안될겁니다. ^^;;