簡體   English   中英

使用SQL Server自動還原備份

[英]Restore Backups automatically using SQL Server

通常的情況是,我嘗試使用以下腳本自動還原備份列表。 我將所有備份都放在同一個文件夾中,然后將備份的名稱放在表中以便於檢索。 最后,我放置了一個游標,該游標每次都指向備份並進行還原。 現在,在執行腳本時,出現以下錯誤:

消息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

我期望在輸出中將還原備份,並且可以在數據庫欄中看到它們,但是實際輸出是我上面提到的錯誤。

SQL Server數據庫由多個“ 邏輯文件 ”組成。 還原數據庫時,您需要說出這些文件的存儲位置。 您正在執行此操作,但是您的代碼對這些邏輯文件的名稱進行了假設。 您假設它們是FileName _DataFileName _Log 錯誤消息告訴您在這種情況下是錯誤的。 如果可以運行以下查詢,請查看LogicalName字段以查看此.BAK文件的實際值。

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

多年來,這件事在我身上發生了很多次。 找出實際的邏輯文件名總是令人驚訝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM