English 中文(简体)
恢复数据库备份出错
原标题:Error restoring database backup

在恢复前一个版本( SQL 服务器, 2008) 的备份时, 我正使用 SQL 服务器( 2012) 出现错误 。 事实上, 我有一个数据库的多个备份文件( 过去不同时间的备份文件 ) 。 最新文件的恢复没有问题; 但是, 其中有一个给出了以下错误 :

System.Data.SqlClient.SqlError: Directory lookup for the file "C:PROGRAM FILESMICROSOFT SQL SERVERMSSQL.1MSSQLDATAMYDB_ABC.MDF" failed with the operating system error 3(The system cannot find the path specified.). (Microsoft.SqlServer.SmoExtended)

这是一台 x64 机器, 我的数据库文件在此位置 : < code> c: program file Microsoft SQL ServerMSSQL11. MSSQLSERVERMSSQL 。

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

最佳回答

我从代码中设法做到的,这还不够

Restore bkp = new Restore();
bkp.PercentCompleteNotification = 1;
bkp.Action = RestoreActionType.Database;
bkp.Database = sDatabase;
bkp.ReplaceDatabase = true;

relocateFiles 属性必须填入要迁移的文件的名称和路径。 对于每个文件, 您必须指定文件的名称和新的物理路径 。 因此, 我所做的是查看数据库的 PrimaryFilePath , 我正在恢复到数据库的 < code> PrimeryFilePath , 并将其用作物理位置 。 例如 :

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));
      }                  
   }
}

日志文件相同 。

问题回答

听起来备份是在一个路径与您的不匹配的机器上取得的。 尝试使用 T- SQL 而不是 UI 来执行备份 。 还要确保您重新指定路径的实际存在, SQL 服务器服务账户有能力在那里写入, 而且还没有这些文件的副本 。

RESTORE DATABASE MYDB_ABC 
  FROM DISK =  C:pathfile.bak 
  WITH MOVE 
            /* this is the logical data file name, not the path: */
             mydb_logical_data_filename  

         TO 
            /* this is the physical data file path: */
             c:valid_data_pathMYDB_ABC.mdf ,

       MOVE 
            /* this is the logical log file name, not the path: */
             mydb_logical_log_filename  

         TO 
            /* this is the physical log file path: */
             c:valid_log_pathMYDB_ABC.ldf ;

从文档中Restore a数据库到新位置(SQL服务器) :

备份存储数据库文件的原始位置, 默认情况下, 尝试将您的新服务器安装位于新目录中, 并且可能旧目录已经不存在, 因此您需要更改默认目录, 以便与您想要使用的位置匹配 。

视您如何恢复数据库而定, 这样做的方法会有所不同。 如果您重新使用 SSMS, 请查看标签和列表, 直到您找到文件列表及其相关磁盘位置 - 然后您可以在恢复之前编辑这些位置 。

我也有同样的问题,这个没有C#代码就修好了它:

USE [master]
ALTER DATABASE [MyDb] 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [MyDb] 
FROM  DISK = N D:ackupsmydb.bak  
WITH  FILE = 1,  
MOVE N MyDb  TO N  c:valid_data_pathMyDb.mdf ,  
MOVE N MyDb_log  TO N valid_log_pathMyDb.ldf ,  
NOUNLOAD,  
REPLACE,  
STATS = 5
ALTER DATABASE [MyDb] SET MULTI_USER
GO

正如已经说过的几次,在 mdf 和 ldf 文件的新旧路径不匹配的地方恢复备份可以造成这一错误。 这里已经有好的例子可以说明如何对待 SQL 。 但是,他们没有一个为我工作,直到我意识到,在我的情况中,我需要将.mdf 和.ldf 扩展列入MOVE 语句的部分,例如:

RESTORE DATABASE [SomeDB] 
FROM DISK = N D:SomeDB.bak  
WITH MOVE N SomeDB.mdf  TO N D:SQL ServerMSSQL12.MyInstanceMSSQLDATASomeDB.mdf , 
MOVE N SomeDb_log.ldf  TO N D:SQL ServerMSSQL12.MyInstanceMSSQLDATASomeDB_log.ldf 

我无法理解为何SQL建议我需要使用WITH MOVE 选项,

请尝试在恢复数据库对话框的选项页面上取消选中“ Tail- Log 备份” 选项

尝试重新启动 SQL 服务。 为我工作 。

以防有人直接与Powershell合作(使用https://learn.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/sql-server-management-objects-smo-programming-guides” rel=“不跟随 norefererr'>SMO 图书馆),在此特定情况下,也有二级数据文件。我通过杀死任何开放程序,然后进行修复,略微加强了脚本。

Import-module SQLPS
$svr = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "server name";
$svr.KillAllProcesses("database_name");
$RelocateData1 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("primary_logical_name","C:...SQLDATADATAdatabase_name.mdf")
$RelocateData2 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("secondary_logical_name_2","C:...SQLDATADATAsecondary_file_2.mdf")
$RelocateData3 = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("secondary_logical_name_3","C:...SQLDATADATAsecondary_file_3.mdf")
$RelocateLog = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" ("database_name_log","C:...SQLDATALOGSdatabase_name_log.ldf")
Restore-SqlDatabase -ServerInstance "server-name" -Database "database_name" -BackupFile "\BACKUPS\database_name.bak" -RelocateFile @($RelocateData1, $RelocateData2, $RelocateData3, $RelocateLog) -ReplaceDatabase

您应该从脚本中删除这些线条 。

CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N StudentManagement , FILENAME = N C:Program FilesMicrosoft SQL ServerMSSQL11.SQLEXPRESSMSSQLDATAStudentManagement.mdf  , SIZE = 10240KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N StudentManagement_log , FILENAME = N C:Program FilesMicrosoft SQL ServerMSSQL11.SQLEXPRESSMSSQLDATAStudentManagement_log.ldf  , SIZE = 5696KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [StudentManagement] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY( IsFullTextInstalled ))
begin
EXEC [StudentManagement].[dbo].[sp_fulltext_database] @action =  enable 
end
GO
ALTER DATABASE [StudentManagement] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [StudentManagement] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [StudentManagement] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [StudentManagement] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [StudentManagement] SET ARITHABORT OFF 
GO
ALTER DATABASE [StudentManagement] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [StudentManagement] SET AUTO_CREATE_STATISTICS ON 
GO
ALTER DATABASE [StudentManagement] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [StudentManagement] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [StudentManagement] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [StudentManagement] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [StudentManagement] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [StudentManagement] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [StudentManagement] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [StudentManagement] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [StudentManagement] SET  DISABLE_BROKER 
GO
ALTER DATABASE [StudentManagement] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [StudentManagement] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [StudentManagement] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [StudentManagement] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [StudentManagement] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [StudentManagement] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [StudentManagement] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [StudentManagement] SET RECOVERY SIMPLE 
GO
ALTER DATABASE [StudentManagement] SET  MULTI_USER 
GO
ALTER DATABASE [StudentManagement] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [StudentManagement] SET DB_CHAINING OFF 
GO
ALTER DATABASE [StudentManagement] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [StudentManagement] SET TARGET_RECOVERY_TIME = 0 SECONDS 

当您使用一个 MSSQL 工作室进行备份( 连接旧服务器) 并恢复( 连接到新服务器) 时, 通常会发生这种情况。 只需确定您是在正确的服务器上执行恢复 。 要么在 UI 或 dou 中检查左端窗格中的服务器名称和 IP 。

如果您用 C# 这样做, 而物理路径不同, 您需要使用重新定位文件, 正如这里提到的一个答案一样 。

在多数情况下,假定下列守则有效,则以下守则将有效:

  1. 您只是从别处恢复数据库备份, 否则就意味着要完全相同。 例如, 制作副本到本地 DB 。

  2. 您没有使用非典型的数据库布局, 例如行文件分布在多个磁盘上的多个文件 。

此外,以下只是第一次恢复时需要的。 一旦一个成功恢复发生, 以下的文件映射将会在 Sql 服务器中为您设置。 但是, 第一次 — 将一个 Bak 文件恢复为空白的 db, 您基本上必须说, “ 是的, 使用 Db 默认的 Db 文件, 本地位置, 而不是吓跑 ” 。 您需要告诉它, 将事情保留在同一个地方, 奇怪的是, 告诉它要迁移它们 :

var dbDataFile = db.FileGroups[0].Files[0];
restore.RelocateFiles.Add(new RelocateFile(dbDataFile.Name, dbDataFile.FileName));
var dbLogFile = db.LogFiles[0];
restore.RelocateFiles.Add(new RelocateFile(dbLogFile.Name, dbLogFile.FileName));

为了更好地澄清典型案例是什么, 以及如何恢复, 这里为本地机器恢复. bak文件的典型代码 :

var smoServer = new Microsoft.SqlServer.Management.Smo.Server(
    new Microsoft.SqlServer.Management.Common.ServerConnection(sqlServerInstanceName));

var db = smoServer.Databases[dbName];
if (db == null)
{
    db = new Microsoft.SqlServer.Management.Smo.Database(smoServer, dbName);
    db.Create();
}

restore.Devices.AddDevice(backupFileName, DeviceType.File);
restore.Database = dbName;
restore.FileNumber = 0;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;

var dbDataFile = db.FileGroups[0].Files[0];
restore.RelocateFiles.Add(new RelocateFile(dbDataFile.Name, dbDataFile.FileName));
var dbLogFile = db.LogFiles[0];
restore.RelocateFiles.Add(new RelocateFile(dbLogFile.Name, dbLogFile.FileName));

restore.SqlRestore(smoServer);

db.SetOnline();
smoServer.Refresh();
db.Refresh();

无论您是否手动恢复了 DB, 是否手动创建了这个 DB, 是否只用名称而没有数据, 或者什么都不做, 这个代码都会有效 - 由完全空白的机器开始, 仅安装了 Sql 服务器, 没有任何数据库 。

请更改. mdf 文件路径。 只要在任何驱动器中创建一个文件夹, 即“ D” 驱动器中创建一个文件夹, 只要创建一个自定义名称( 数据库) 的文件夹, 并将路径指向新文件夹, msql 将自动创建文件 。

"C:PROGRAM FILESMICROSOFT SQL SERVERMSSQL.1MSSQLDATAMYDB_ABC.MDF" to "D:dbaseMYDB_ABC.MDF"





相关问题
what is wrong with this mysql code

$db_user="root"; $db_host="localhost"; $db_password="root"; $db_name = "fayer"; $conn = mysqli_connect($db_host,$db_user,$db_password,$db_name) or die ("couldn t connect to server"); // perform query ...

Users asking for denormalized database

I am in the early stages of developing a database-driven system and the largest part of the system revolves around an inheritance type of relationship. There is a parent entity with about 10 columns ...

Easiest way to deal with sample data in Java web apps?

I m writing a Java web app in my free time to learn more about development. I m using the Stripes framework and eventually intend to use hibernate and MySQL For the moment, whilst creating the pages ...

join across databases with nhibernate

I am trying to join two tables that reside in two different databases. Every time, I try to join I get the following error: An association from the table xxx refers to an unmapped class. If the ...

How can I know if such value exists in database? (ADO.NET)

For example, I have a table, and there is a column named Tags . I want to know if value programming exists in this column. How can I do this in ADO.NET? I did this: OleDbCommand cmd = new ...

Convert date to string upon saving a doctrine record

I m trying to migrate one of my PHP projects to Doctrine. I ve never used it before so there are a few things I don t understand. In my current code, I have a class similar to this: class ...

热门标签