Fully automated SQL Server Restore

前端 未结 10 1388
予麋鹿
予麋鹿 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条回答
  •  萌比男神i
    2020-12-07 17:22

    this might help. I wanted to create a script for a client with the minimum variables required to be set for multiple database backups restored from a single location. I tried to avoid using dynamic SQL because I think it all gets a little messy.

    -- Use VARCHAR as the restore statement doesn't like NVARCHAR
    DECLARE @data_file_path VARCHAR(512), @log_file_path VARCHAR(512), @backup_path VARCHAR(512),
            @backup_extension VARCHAR(4), @mdf_extension VARCHAR(4), @ldf_extension VARCHAR(4)
    
    -- ** VARIABLES THAT MUST BE SET **--
    SET @data_file_path = 'E:\DataPath\'
    SET @log_file_path  = 'F:\LogPath'
    SET @backup_path =    'B:\BackUpPath'
    -- **----------------------------**--
    
    SET @backup_extension = '.bak'
    SET @mdf_extension = '.mdf'
    SET @ldf_extension = '.ldf'
    
    DECLARE @DATABASES_TO_RESTORE TABLE (rownum int IDENTITY (1, 1) PRIMARY KEY NOT NULL, backup_name VARCHAR(64), restore_as VARCHAR(64))
    
    -- ** Declare the Databases to be Restored ** --
    INSERT INTO @DATABASES_TO_RESTORE
        SELECT 'Intranet', 'Intranet_Test'
        UNION
        SELECT 'TestAudit', 'TestAudit_Test'
    -- ** -------------------------------------** --
    
    DECLARE @max_rows INT, @row_count INT
    SET @row_count = 1
    SELECT @max_rows=count(*) FROM @DATABASES_TO_RESTORE
    
    WHILE @row_count <= @max_rows
    BEGIN
        DECLARE @backup_name VARCHAR(32), @restore_as VARCHAR(32), @logical_data_name VARCHAR(64), @logical_log_name VARCHAR(64),
                @data_file_full_path VARCHAR(512), @log_file_full_path VARCHAR(512), @full_backup_path VARCHAR(MAX)
    
        SELECT @backup_name = backup_name, @restore_as = restore_as FROM @DATABASES_TO_RESTORE WHERE rownum = @row_count    
        SET @full_backup_path = @backup_path + @backup_name + @backup_extension
    
        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)
    
        INSERT into @filelist
            EXEC ('RESTORE FilelistOnly FROM DISK = ''' + @full_backup_path + '''')
    
        IF @@ROWCOUNT = 2
        BEGIN
            SELECT @logical_data_name = LogicalName FROM @filelist WHERE [Type] = 'D'
            SELECT @logical_log_name  = LogicalName FROM @filelist WHERE [Type] = 'L'
    
            SET @data_file_full_path = @data_file_path + @restore_as + @mdf_extension
            SET @log_file_full_path = @log_file_path + @restore_as + @ldf_extension
    
            RESTORE DATABASE @restore_as
            FROM DISK = @full_backup_path
            WITH
            FILE = 1, 
            MOVE @logical_data_name 
            TO @data_file_full_path,
            MOVE @logical_log_name 
            TO @log_file_full_path
        END
        ELSE
            PRINT 'CANNOT RESTORE DATABASE ' + @restore_as + ' THE BACKUP CONTAINS MORE THAN 1 BACKUP SET'
    
        SELECT @row_count = @row_count + 1
    END
    

提交回复
热议问题