Автоматическое восстановление резервных копий с использованием SQL Server - PullRequest
1 голос
/ 09 мая 2019

Общий контекст заключается в том, что я пытаюсь восстановить список резервных копий автоматически, используя приведенный ниже скрипт.Я помещаю все резервные копии в одну и ту же папку, после чего помещаю имена резервных копий в таблицу, чтобы их можно было легко найти.Наконец, я поместил курсор, который каждый раз указывает на резервную копию и восстанавливает ее.Теперь при выполнении сценария я получаю эту ошибку:

Сообщение 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

Я ожидаю в выходных данных, что резервные копии будут восстановлены, и я мог видеть их на панели базы данных, но фактический вывод - ошибка, о которой я упоминал выше.

1 Ответ

0 голосов
/ 09 мая 2019

Базы данных SQL Server состоят из ряда « логических файлов ». Когда вы восстанавливаете базу данных, вы должны указать, где эти файлы должны храниться. Вы делаете это, но ваш код делает предположения об именах этих логических файлов. Вы предполагаете, что они FileName _Data и FileName _Log . Сообщение об ошибке говорит вам, что это неправильно в этом случае. Если вы можете выполнить следующий запрос, посмотрите в поле LogicalName, чтобы увидеть фактические значения для этого файла .BAK.

RESTORE FILELISTONLY FROM DISK = N'C:\MyBackups\OP38MLG_db_201903040000.bak'

За эти годы это случалось со мной много раз. И это всегда удивительно, чтобы узнать реальные логические имена файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...