恢复数据库备份时出错

Mar*_*ila 21 database sql-server exception-handling restore sql-server-2012

我在使用以前的版本(SQL Server 2008)还原备份时使用SQL Server 2012时出错.我实际上有几个相同数据库的备份文件(在过去的不同时间拍摄).最新的恢复没有任何问题; 但是,其中一个给出以下错误:

System.Data.SqlClient.SqlError:文件"C:\ PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL.1\MSSQL\DATA\MYDB_ABC.MDF"的目录查找失败,出现操作系统错误3(系统无法找到路径指定).(Microsoft.SqlServer.SmoExtended)

这是一台x64机器,我的数据库文件位于以下位置:c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL.

我不明白为什么它试图恢复MSSQL.1而不是MSSQL11.MSSQLSERVER.

Aar*_*and 35

听起来像备份是在路径与您的路径不匹配的机器上进行的.尝试使用T-SQL而不是UI执行备份.还要确保您指定的路径实际存在,并且那里还没有这些mdf/ldf文件的副本.

RESTORE DATABASE MYDB_ABC FROM DISK = 'C:\path\file.bak'
WITH MOVE 'mydb' TO 'c:\valid_data_path\MYDB_ABC.mdf',
MOVE 'mydb_log' TO 'c:\valid_log_path\MYDB_ABC.ldf';
Run Code Online (Sandbox Code Playgroud)


Dan*_*haw 9

备份存储数据库文件的原始位置,默认情况下,尝试还原到同一位置.由于新的服务器安装在新的目录,以及是否可能,旧目录不复存在,你需要改变从默认的目录,以匹配您希望它使用的位置.

根据您还原数据库的方式,执行此操作的方式会有所不同.如果您正在使用SSMS,请查看选项卡和列表,直到找到文件列表及其关联的磁盘位置 - 然后您可以在还原之前编辑这些位置.


Hyp*_*ate 6

还原时,在“文件”下,选中“将所有文件重定位到文件夹”

选中“将所有文件重定位到文件夹”

  • 虽然不是这个特定问题的答案,因为他是用代码做的,但它节省了我的时间并且非常有用,谢谢伙计。 (2认同)

Mar*_*ila 5

我已经设法从代码中做到这一点.这还不够

Restore bkp = new Restore();
bkp.PercentCompleteNotification = 1;
bkp.Action = RestoreActionType.Database;
bkp.Database = sDatabase;
bkp.ReplaceDatabase = true;
Run Code Online (Sandbox Code Playgroud)

RelocateFiles必须使用要重定位的文件的名称和路径填充该属性.对于每个文件,您必须指定文件的名称和新的物理路径.所以我所做的就是查看PrimaryFilePath我正在恢复的数据库,并将其用作物理位置.像这样的东西:

if (!string.IsNullOrEmpty(sDataFileName) && !File.Exists(sDataFileName))
{
   if (originaldb != null)
   {
      if (string.Compare(Path.GetDirectoryName(sDataFileName), originaldb.PrimaryFilePath, true) != 0)
      {
         string sPhysicalDataFileName = Path.Combine(originaldb.PrimaryFilePath, sDatabase + ".MDF");
         bkp.RelocateFiles.Add(new RelocateFile(sLogicalDataFileName, sPhysicalDataFileName));
      }                  
   }
}
Run Code Online (Sandbox Code Playgroud)

对于日志文件也是如此.


小智 5

我遇到了同样的问题,并且此问题无需任何C#代码即可解决:

USE [master]
ALTER DATABASE [MyDb] 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [MyDb] 
FROM  DISK = N'D:\backups\mydb.bak' 
WITH  FILE = 1,  
MOVE N'MyDb' TO N''c:\valid_data_path\MyDb.mdf',  
MOVE N'MyDb_log' TO N'\valid_log_path\MyDb.ldf',  
NOUNLOAD,  
REPLACE,  
STATS = 5
ALTER DATABASE [MyDb] SET MULTI_USER
GO
Run Code Online (Sandbox Code Playgroud)