아래 케이스에서 사용하기 위해 작성하였습니다
- 이관등 짧은 다운타임으로 최대한 빠르게 복원이 필요
- 다수의 TRN을 수동으로 진행하면서 발생할 오류를 최소화
설명
-
Full 백업본에 대한 with Norecovery 상태의 DB에 아래 스크립트 생성 결과로 TRN 복원 진행
-
Full 백업본은 아래 URL의 스크립트에서 recovery --> norecovery로 수정하여 활용 가능
쿼리문
-
입력 파라미터 (주석 처리된 부분 )
- #DBList / @TrnPath_Ori / @TrnPath_New/ @restoredatabasename
--by jyoh
DECLARE @backupStartDate datetime
DECLARE @backup_set_id_start INT
DECLARE @backup_set_id_end INT
DECLARE @restoreDatabaseName varchar(1000)
if OBJECT_ID('tempdb..#TRRestore') is not null
drop table #TRRestore
CREATE TABLE #TRRestore(
database_name nvarchar(100),
backup_set_id int,
TRQuery nvarchar(500)
)
if OBJECT_ID('tempdb..#DBList') is not null
drop table #DBList
CREATE TABLE #DBList(
num int identity(1,1),
name nvarchar(100)
)
--TRN 복원 스크립트 생성 대상 DB명
INSERT INTO #DBList VALUES('DB_1');
INSERT INTO #DBList VALUES('DB_2');
INSERT INTO #DBList VALUES('DB_3');
INSERT INTO #DBList VALUES('DB_4');
INSERT INTO #DBList VALUES('DB_5');
INSERT INTO #DBList VALUES('DB_6');
--기존 Path와 신규 Path 지정
DECLARE @TrnPath_Ori VARCHAR(1000) = 'E:\ASIS\Log\';
DECLARE @TrnPath_New VARCHAR(1000) = 'D:\TOBE\TRN\';
DECLARE @INDEX INT,@databaseName VARCHAR(100);
SET @INDEX = 0;
DECLARE CUR CURSOR FOR
SELECT NAME FROM #DBList
OPEN CUR
FETCH NEXT FROM CUR INTO @databaseName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @INDEX = @INDEX + 1;
-----------------------------------------------------------------
--복원 DB명 ex : DB_1_test --> @databaseName +'_test'
SET @restoreDatabaseName = @databaseName ;
SELECT @backup_set_id_start = MAX(backup_set_id)
FROM msdb.dbo.backupset
WHERE database_name = @databaseName AND type = 'D'
SELECT @backup_set_id_end = MIN(backup_set_id)
FROM msdb.dbo.backupset
WHERE database_name = @databaseName AND type = 'D'
AND backup_set_id > @backup_set_id_start
IF @backup_set_id_end IS NULL SET @backup_set_id_end = 999999999
insert into #TRRestore (database_name,backup_set_id,TRQuery)
select *
from
(
SELECT @databaseName as name,backup_set_id, 'RESTORE LOG ' + @restoreDatabaseName + ' FROM DISK = '''
+
case
when CHARINDEX(@TrnPath_Ori, mf.physical_device_name) <> 0 then
STUFF (mf.physical_device_name, 1,LEN(@TrnPath_Ori),@TrnPath_New)
else mf.physical_device_name +'[ERROR_PATH]' end
+ ''' WITH NORECOVERY' as TRQuery
FROM msdb.dbo.backupset b,
msdb.dbo.backupmediafamily mf
WHERE b.media_set_id = mf.media_set_id
AND b.database_name = @databaseName
AND b.backup_set_id >= @backup_set_id_start AND b.backup_set_id < @backup_set_id_end
AND b.type = 'L'
UNION
SELECT @databaseName as name,999999999 AS backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' WITH RECOVERY' as TRQuery
) as T
---------------------------------------------------------------------
FETCH NEXT FROM CUR INTO @databaseName
END
CLOSE CUR
DEALLOCATE CUR
select 'NEED TO CHECK',* from #TRRestore
where TRQuery like '%[ERROR] WITH NORECOVERY' or TRQuery like '%ERROR_PATH%'
ORDER BY database_name, backup_set_id
select * from #TRRestore
ORDER BY database_name, backup_set_id
'SQL Server > 스크립트' 카테고리의 다른 글
[스크립트]미러링/오류로그/배치/세션유입 체크 (0) | 2021.06.12 |
---|---|
[스크립트]대량 데이터에 대한 특정 문자열 검색 및 변경 쿼리 추출 (0) | 2021.06.04 |
[스크립트] 특정경로 Full백업 일괄 복원 (0) | 2021.02.22 |
[스크립트] ActiveSession 수집 결과 리포팅 형태로 가공 (0) | 2021.02.22 |
[스크립트] 배치잡 실패 수집 (0) | 2021.02.18 |