Процесс восстановления 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: