Процесс восстановления SQL Server с параметром имени базы данных

Ищите хранимую процедуру для восстановления из файла.bak, но хотели бы иметь возможность ввести имя БД в качестве параметра, т.е. Exec sp_restore @dbname

  • Пути к.bak будут одинаковыми для всех баз данных, т. Е. Все базы данных являются dev-копиями одной и той же производственной резервной копии.
  • Каждый.mdf и.ldf будет иметь то же имя, что и сама база данных, т.е. dbname = @dbname, mdf = D:\data\@dbname.mdf, ldf =D:\data\@dbname.ldf
  • Пути к.mdf и.ldf будут одинаковыми для каждого БД, т.е. D:\data\@dbname.mdf

2 ответа

Решение

Используя Sql Server Management Studio, вы можете начать выполнять операцию восстановления. Перед выполнением задания вы должны увидеть кнопку "Сценарий". Это создаст скрипт со всеми параметрами, которые вы ввели вручную, включая mdf и ldf location. Затем вы можете сохранить этот скрипт и выполнить его по желанию. Вы также можете изменить полученный скрипт, чтобы сделать имя базы данных входной переменной. Вы можете сделать что-нибудь на самом деле. Это SQL!

Кнопка скрипта

Пример сценария, который восстанавливает базу данных и изменяет расположение файлов mdf и ldf, будет выглядеть следующим образом:

RESTORE DATABASE [example] FROM  DISK = N'E:\Backup\example.BAK' WITH  FILE = 1,  MOVE N'ExampleData' TO N'E:\dbfiles\example.mdf',  MOVE N'example_log' TO N'E:\dbfiles\example.ldf',  NOUNLOAD,  STATS = 10
GO

Вы можете прочитать больше об операторе RESTORE

Затем вы можете вставить скрипт в хранимую процедуру следующим образом:

CREATE PROCEDURE RestoreDb
    -- Add the parameters for the stored procedure here
    @dbName nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    RESTORE DATABASE @dbName FROM  DISK = N'C:\Data\MSSQL\Backup\lolwut.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10

END
GO

Процедура восстановления БД из bak-файла @DeviceName. Работает с БД, которые имеют два логических файла. Как пользоваться:

EXEC RestoreDb @dbName='qqq', @DeviceName = 'D:\temp\1\R.bak'

Извините за мой английский, я улучшаю его.

CREATE PROCEDURE RestoreDb
    @dbName NVARCHAR(50),
    @DeviceName NVARCHAR(400)
AS
    SET NOCOUNT ON

    DECLARE @Cmd NVARCHAR(1000),
        @DataLogicalName NVARCHAR(200),
        @LogLogicalName NVARCHAR(200),
        @DatabasePath   NVARCHAR(200),
        @DataPath NVARCHAR(300),
        @LogPath  NVARCHAR(300)

    CREATE TABLE #Files
        (
        LogicalName         nvarchar(128),
        PhysicalName        nvarchar(260),
        [Type]              char(1),
        FileGroupName       nvarchar(128),
        Size                numeric(20,0),
        MaxSize             numeric(20,0),
        FileID              bigint,
        CreateLSN           numeric(25,0),
        DropLSN             numeric(25,0),
        UniqueID            uniqueidentifier,
        ReadOnlyLSN         numeric(25,0) ,
        ReadWriteLSN        numeric(25,0),
        BackupSizeInBytes   bigint,
        SourceBlockSize     int,
        FileGroupID         int,
        LogGroupGUID        uniqueidentifier,
        DifferentialBaseLSN numeric(25,0),
        DifferentialBaseGUID    uniqueidentifier,
        IsReadOnly          bit,
        IsPresent           bit,
        TDEThumbprint       varbinary(32)
        )

    SELECT @DatabasePath = 'D:\data\'

    SELECT @DataPath = @DatabasePath + @dbName + '.mdf',
        @LogPath = @DatabasePath + @dbName + '.ldf'

    SELECT @Cmd = 'RESTORE FILELISTONLY
    FROM DISK = ''' + @DeviceName + ''''

    INSERT #Files
    EXEC (@Cmd)

    IF NOT EXISTS(SELECT 1 FROM #Files) GOTO ERRORFILES

    IF (SELECT COUNT(*) FROM #Files) > 2 GOTO ERRORFILESCOUNT

    SELECT @DataLogicalName = LogicalName
    FROM #Files
    WHERE [Type] = 'D'

    SELECT @LogLogicalName = LogicalName
    FROM #Files
    WHERE [Type] = 'L'

    RESTORE DATABASE @DbName
    FROM DISK = @DeviceName
    WITH 
    MOVE @DataLogicalName TO @DataPath,
    MOVE @LogLogicalName  TO @LogPath

GOTO EXITSTAT

ERRORFILES:
    BEGIN
        RAISERROR( 'The list of files contained in the backup set is empty', 16, 1 )
        GOTO EXITSTAT
    END

ERRORFILESCOUNT:
    BEGIN
        RAISERROR( 'The count of files contained in the backup set is more than two', 16, 1 )
        GOTO EXITSTAT
    END

EXITSTAT:
Другие вопросы по тегам