Общий контекст заключается в том, что я пытаюсь восстановить список резервных копий автоматически, используя приведенный ниже скрипт.Я помещаю все резервные копии в одну и ту же папку, после чего помещаю имена резервных копий в таблицу, чтобы их можно было легко найти.Наконец, я поместил курсор, который каждый раз указывает на резервную копию и восстанавливает ее.Теперь при выполнении сценария я получаю эту ошибку:
Сообщение 3234, уровень 16, состояние 2, строка 82 Логический файл «OP38MLG_db_201903040000_DATA» не является частью базы данных «OP38MLG_db_201903040000».Используйте RESTORE FILELISTONLY, чтобы перечислить логические имена файлов.Сообщение 3013, уровень 16, состояние 1, строка 82 RESTORE DATABASE ненормально завершается.
Когда я восстанавливаю каждое резервное копирование независимо, операция завершается успешно, но когда я пытаюсь восстановить список, у меня появляется ошибка.
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
-- specify database backup directory
SET @path = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\'
DECLARE @backuppath NVARCHAR(256) -- path for backup files
DECLARE @datapath VARCHAR(256) -- path for data files
DECLARE @logpath VARCHAR(256) -- path for log files
DECLARE @backupfileName VARCHAR(256) -- filename for backup
DECLARE @datafileName VARCHAR(256) -- filename for database
DECLARE @logfileName VARCHAR(256) -- filename for logfile
DECLARE @logName VARCHAR(256) -- filename for logfile
DECLARE @dataName VARCHAR(256)
-- specify database backup directory
SET @backuppath = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\'
SET @datapath = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\'
SET @logpath = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\'
print 'backup path is ' + @backuppath
print 'data path is ' + @datapath
print 'log path is ' + @logpath
/*Table to hold each backup file name in*/
CREATE TABLE #List(fname varchar(200),depth int, file_ int)
INSERT #List
EXECUTE master.dbo.xp_dirtree @backuppath, 1, 1
SELECT * FROM #List
DECLARE files CURSOR FOR
SELECT fname FROM #List
OPEN files
FETCH NEXT FROM files INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @cleanname AS VARCHAR(255)
SET @cleanname = REPLACE(@name, '.BAK', '')
PRINT @cleanname
SET @backupfileName = @backuppath + @name
SET @datafileName = @datapath + @cleanname + '.MDF'
SET @logfileName = @logpath + @cleanname + '_log.LDF'
SET @logName = @cleanname + '_log'
SET @dataName = @cleanname + '_DATA'
print 'backup file is ' + @backupfileName
print 'data file is ' + @datafileName
print 'log file is ' + @logfileName
USE [master]
RESTORE DATABASE @cleanname
FROM DISK = @backupfileName
WITH FILE = 1,
MOVE @dataName TO @datafileName,
MOVE @logName TO @logfileName,
NOUNLOAD, STATS = 5
FETCH NEXT FROM files INTO @name
END
CLOSE files
DEALLOCATE files
DROP TABLE #List
GO
Я ожидаю в выходных данных, что резервные копии будут восстановлены, и я мог видеть их на панели базы данных, но фактический вывод - ошибка, о которой я упоминал выше.