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)
备份存储数据库文件的原始位置,默认情况下,尝试还原到同一位置.由于新的服务器安装在新的目录,以及是否可能,旧目录不复存在,你需要改变从默认的目录,以匹配您希望它使用的位置.
根据您还原数据库的方式,执行此操作的方式会有所不同.如果您正在使用SSMS,请查看选项卡和列表,直到找到文件列表及其关联的磁盘位置 - 然后您可以在还原之前编辑这些位置.
我已经设法从代码中做到这一点.这还不够
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)