MDF 파일만 있을 경우에는 sp_attach_single_file_db 프로시저를 이용해서 아주 간편하고 쉽게 DB를 복원할 수 있다.

그러나 Backup(BAK) 파일의 경우에는 복원하는데 약간 불편함을 감수해야 한다.

아래의 프로시저를 이용하면 이러한 불편함을 약간이나마 해소할 수 있다.


IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[_Attach_DB_From_Backup]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP procedure [dbo].[_Attach_DB_From_Backup]
GO
  
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
  
  
CREATE PROCEDURE [dbo]._Attach_DB_From_Backup
  @strRestoreDBName varchar(128),
  @strBackupFilePath  varchar(255)
AS
  
-- master DB 체크
IF DB_NAME() <> 'master'
BEGIN
  RAISERROR( 'current database name was not "master". You should be change "master" database', 16, 1 )
  RETURN
END
  
-- 생성할 DB가 존재하는지 체크
IF EXISTS (SELECT * FROM  master..sysdatabases WHERE name = @strRestoreDBName )
BEGIN
  RAISERROR( 'It was already existed database name. Try to execute procedure another DB name', 16, 1 )
  RETURN
END
  
-- 실행 시간 측정
declare @StartTime datetime
SET @StartTime = GetDate()
  
-- 동적 실행 쿼리로 쓰일 변수
declare @strQuery nvarchar(2048)
  
-- DB 생성
SET @strQuery = 'CREATE DATABASE ' + @strRestoreDBName
EXEC sp_executesql @strQuery
  
  
-- 임시 테이블 생성 - (Backup 파일에서 정보 추출)
CREATE TABLE #FileListInfo
(
  LogicalName nvarchar(128)  NULL,
  PhysicalName  nvarchar(260) NULL,
  Type    char(1)   NULL,
  FileGroupName nvarchar(128)  NULL,
  [Size]    numeric(20,0) NULL,
  [MaxSize] numeric(20,0)  NULL
  [FileID]    bigint    NULL,
  [CreateLSN]    numeric(25,0)  NULL,
  [DropLSN]    numeric(25,0)  NULL,
  [UniqueID]    uniqueidentifier NULL,
  [ReadOnlyLSN]   numeric(25,0)  NULL,
  [ReadWriteLSN]   numeric(25,0)  NULL,
  [BackupSizeInBytes]  bigint    NULL,
  [SourceBlockSize]  int     NULL,
  [FileGroupID]   int     NULL,
  [LogGroupGUID]   uniqueidentifier NULL,
  [DifferentialBaseLSN] numeric(25,0)  NULL,
  [DifferentialBaseGUID] uniqueidentifier NULL,
  [IsReadOnly]   bit     NULL,
  [IsPresent]    bit     NULL
)
  
-- 임시 테이블 생성 - (생성된 DB에서 정보(MDF, LDF 파일 경로) 추출)
CREATE TABLE #CreatedDBInfo
(
  name    nvarchar(128) NULL,
  filename  nvarchar(260) NULL
)
  
-- Backup 파일로 부터 정보 추출 -> #FileListInfo
SET @strQuery = N'RESTORE FILELISTONLY FROM DISK = ''' + @strBackupFilePath + ''''
INSERT INTO #FileListInfo EXEC sp_executesql @strQuery
  
-- 생성된 DB에서 정보 추출 -> #CreatedDBInfo
SET @strQuery = 'select name, filename from ' + @strRestoreDBName + '.[dbo].sysfiles'
INSERT INTO #CreatedDBInfo EXEC sp_executesql @strQuery
  
  
-- Backup 파일로 부터 LogicalName(Data, Log)를 가져온다.
declare @LogicalName_Data nvarchar(128)
declare @LogicalName_Log  nvarchar(128)
  
SELECT @LogicalName_Data = LogicalName FROM #FileListInfo where Type = 'D'
IF( @@error <> 0 OR @@rowcount = 0 OR @LogicalName_Data IS NULL )
begin
  RAISERROR( 'LogicalName for Data is not exist', 16, 1 )
  DROP TABLE #FileListInfo
  DROP TABLE #CreatedDBInfo
  
  SET @strQuery = 'DROP DATABASE ' + @strRestoreDBName
  EXEC sp_executesql @strQuery
  RETURN
end
SELECT @LogicalName_Log  = LogicalName FROM #FileListInfo where Type = 'L'
IF( @@error <> 0 OR @@rowcount = 0 OR @LogicalName_Log IS NULL )
begin
  RAISERROR( 'LogicalName for Log is not exist', 16, 1 )
  DROP TABLE #FileListInfo
  DROP TABLE #CreatedDBInfo
  
  SET @strQuery = 'DROP DATABASE ' + @strRestoreDBName
  EXEC sp_executesql @strQuery
  RETURN
end
  
  
-- 생성된 DB에서 MDF, LDF 파일 경로를 가져온다.
declare @strFileName_Data nvarchar(260)
declare @strFileName_Log  nvarchar(260)
  
  
SELECT @strFileName_Data = filename FROM #CreatedDBInfo where filename like '%MDF%'
IF( @@error <> 0 OR @@rowcount = 0 OR @strFileName_Data IS NULL )
begin
  RAISERROR( '#CreatedDBInfo has not MDF file path', 16, 1 )
  DROP TABLE #FileListInfo
  DROP TABLE #CreatedDBInfo
  
  SET @strQuery = 'DROP DATABASE ' + @strRestoreDBName
  EXEC sp_executesql @strQuery
  RETURN
end
SELECT @strFileName_Log  = filename FROM #CreatedDBInfo where filename like '%LDF%'
IF( @@error <> 0 OR @@rowcount = 0 OR @strFileName_Log IS NULL )
begin
  RAISERROR( '#CreatedDBInfo has not LDF file path', 16, 1 )
  DROP TABLE #FileListInfo
  DROP TABLE #CreatedDBInfo
  
  SET @strQuery = 'DROP DATABASE ' + @strRestoreDBName
  EXEC sp_executesql @strQuery
  RETURN
end
  
-- Backup 파일로 부터 DB를 복원 한다.
SET @strQuery = 'RESTORE DATABASE ' + RTRIM(@strRestoreDBName) + ' FROM DISK = ''' + RTRIM(@strBackupFilePath)
    + ''' WiTH REPLACE, MOVE ''' + RTRIM(@LogicalName_Data) + ''' TO ''' + RTRIM(@strFileName_Data) + ''', '
    + ' MOVE ''' + RTRIM(@LogicalName_Log) + ''' TO ''' + RTRIM(@strFileName_Log) + ''''
  
EXEC sp_executesql @strQuery
  
-- 임시 테이블 Drop
DROP TABLE #FileListInfo
DROP TABLE #CreatedDBInfo
  
SELECT 'Elapsed time : ' + convert( varchar(128), GetDate() - @StartTime, 114 )
  
SET NOCOUNT OFF
  
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO 

참조 사이트
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=1247&lngWId=5
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=36961
http://msdn.microsoft.com/en-us/library/ms173778.aspx

2008/10/11 00:24 2008/10/11 00:24

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요