Fully automated SQL Server Restore

前端 未结 10 1393
予麋鹿
予麋鹿 2020-12-07 16:58

I\'m not very fluent with SQL Server commands.

I need a script to restore a database from a .bak file and move the logical_data and logical_log files to a specific p

10条回答
  •  醉话见心
    2020-12-07 17:39

    I had same issue, but in my environment I have many backup files (faster backups), and did need to restore to custom location. This query gets latest full backup info and restores to the path you specify. Tested on SQL 2005/2008.

    SET NOCOUNT ON
    
    Declare @BackupFiles varchar(500), @data_file_path VARCHAR(512), @log_file_path VARCHAR(512), @RestoreFileList varchar(2000), @RestoreStatement varchar(3000), @MoveFiles varchar(2000), @DBName varchar(150)
    
    DECLARE @filelist TABLE (LogicalName NVARCHAR(128) NOT NULL, PhysicalName NVARCHAR(260) NOT NULL, [Type] CHAR(1) NOT NULL, FileGroupName NVARCHAR(120) NULL, Size NUMERIC(20, 0) NOT NULL, MaxSize NUMERIC(20, 0) NOT 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, DfferentialBaseLSN NUMERIC(25,0)NULL, DifferentialBaseGUID UNIQUEIDENTIFIER NULL, IsReadOnly BIT NULL, IsPresent BIT NULL, TDEThumbprint VARBINARY(32) NULL) 
    
    SET @data_file_path = 'E:\SQLData\' 
    SET @log_file_path  = 'E:\SQLLog\' 
    SET @DBName = 'Adventureworks'
    
    --Get last full backup:
    SELECT @BackupFiles=Coalesce(@BackupFiles + ',', '') + 'DISK = N'''+physical_device_name+''''
    FROM msdb..backupset S
    JOIN msdb..backupmediafamily M ON M.media_set_id=S.media_set_id
    WHERE backup_set_id = ( SELECT max(backup_set_id)
                        FROM msdb..backupset S
                        JOIN msdb..backupmediafamily M ON M.media_set_id=S.media_set_id
                        WHERE S.database_name = @DBName and Type = 'D')
    
    SELECT @RestoreFileList= 'RESTORE FILELISTONLY FROM ' + @BackupFiles + ' WITH  FILE = 1 '
    
    IF (@@microsoftversion / 0x1000000) & 0xff >= 10 --TDE capability
    Begin
        INSERT into @filelist (LogicalName,PhysicalName,Type,FileGroupName,Size,MaxSize,FileID,CreateLSN,DropLSN,UniqueID,ReadOnlyLSN,ReadWriteLSN,BackupSizeInBytes,SourceBlockSize,FileGroupID,LogGroupGUID,DfferentialBaseLSN,DifferentialBaseGUID,IsReadOnly,IsPresent,TDEThumbprint)
        EXEC (@RestoreFileList)
    End
    Else
    Begin
        INSERT into @filelist (LogicalName,PhysicalName,Type,FileGroupName,Size,MaxSize,FileID,CreateLSN,DropLSN,UniqueID,ReadOnlyLSN,ReadWriteLSN,BackupSizeInBytes,SourceBlockSize,FileGroupID,LogGroupGUID,DfferentialBaseLSN,DifferentialBaseGUID,IsReadOnly,IsPresent)
        EXEC (@RestoreFileList)
    End
    
    --next version, do a count on filename, any >1 put in alternate data/log location.
    SELECT  @MoveFiles=Coalesce(@MoveFiles + ',' , '') + 'MOVE N''' + LogicalName + ''' to N''' +
        Case When type = 'D' Then @data_file_path+Right(physicalname, charindex('\',reverse(physicalname),1)-1)
        when type = 'L' Then @log_file_path+Right(physicalname, charindex('\',reverse(physicalname),1)-1)
        Else 'Full Text - code not complete'
        END
        +''''
    From @filelist
    
    SELECT @RestoreStatement='RESTORE DATABASE [AuctionMain] FROM ' + @BackupFiles + ' WITH  FILE = 1, ' + @MoveFiles + ', NOUNLOAD, REPLACE, STATS = 20'
    
    Print @RestoreStatement
    
    Exec(@RestoreStatement)
    

提交回复
热议问题