SQL-Server:备份集包含除现有数据库之外的数据库的备份

624

我正在尝试为我的数据库恢复一个SQL Server备份文件,但是出现以下错误:

备份集保存的是一个与现有数据库不同的数据库的备份

我的数据库运行在SQL Server 2008上,而备份文件是在2005上创建的。

可能的问题是什么?


185
下面得到了很高的投票数,但用大材小用。问题很可能是您没有在“还原 > 选项”窗口中选择“覆盖现有数据库(WITH REPLACE)”选项。我曾经在使用WITH MOVE命令时遇到过这个问题,后来通过使用WITH REPLACE, MOVE进行修复。 - James McCormack
我有一个数据库出现了同样的错误,但只有在关闭SQL Server代理时才会出现。如果我打开它,就没有错误,我可以顺利还原。我的BAK文件只包含一个单独的数据库,并且该数据库名称(以及逻辑文件名)在我的服务器上是唯一的。 - Developer Webs
26个回答

970

我也遇到了这个问题。

解决方案:

  • 不要创建一个空数据库并将 .bak 文件还原到其中。
  • 使用 SQL Server Management Studio 中 "Databases" 分支右键点击 "还原数据库" 选项,并在提供源的同时提供数据库名称。
  • 如果其他数据库仍然存在,请在 "文件" 处更改文件名。否则会出现 "无法覆盖文件 '...',因为它正在被数据库 'yourFirstDb' 使用" 的错误提示。

22
+1 表示“不要创建一个空数据库并将.bak文件还原到其中”,是解决问题的方法。(但为什么我以前做同样的事情没有出现这个问题呢?难道我们之前只是因为某些其他无法解释的错误信息而开始使用预先创建的方法吗? :]) - Reg Edit
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dave Mateer
2
如果其他数据库仍然存在,请同时更改“文件”中的文件名。否则,您将收到“无法覆盖文件'...'。它正在被数据库'yourFirstDb'使用”的错误提示。 - Verena Haunschmid
适用于在Linux上运行的MS SQL Server 2017,使用MS SQL Server Management Studio 18.1。 - Richard Crossley
1
@Deqing 这意味着您不会创建一个空的数据库,然后右键单击它来恢复备份文件,而是要打开您的 SQL,右键单击根数据库文件夹,然后选择“还原”。在还原窗口中,给出您想要的唯一 DB 名称,它将自行创建数据库。 - irzum shahid
显示剩余5条评论

232

方法一:

在使用RESTORE命令时,可以使用WITH REPLACE选项(如果使用GUI,则在选项中找到覆盖现有数据库的选项(WITH REPLACE))。

方法二:

删除冲突的旧数据库,并使用RESTORE命令再次还原。

请查看链接了解更多细节。


这种技术允许将2008R2数据库恢复到2012服务器。 - eeasterly

107

首先,创建一个与原数据库同名的空白数据库。然后选择恢复选项。

在左侧面板的选项下,不要忘记选择:

  • 覆盖现有数据库
  • 保留复制设置

输入图像描述

就是这样。


67

我曾面临同样的问题,通过使用SSMS 2014找到了解决方法。

只需选择“覆盖现有数据库(WITH REPLACE)”选项即可。

Existing Database> Task> Restore> Database


50

这通常是由于版本不兼容引起的。

按照以下步骤解决:

步骤1:使用您喜欢的名称创建一个数据库。(在我们的例子中,AdventureWorks)

步骤2:单击数据库并单击任务 >> 还原 >> 数据库...

输入图像描述

步骤3:在还原屏幕上,转到“选项”的第三个选择。现在选中复选框“覆盖现有数据库(WITH REPLACE)”

输入图像描述

步骤4:单击OK。它应该成功还原数据库。

注意:当您还原带有替换的数据库时,它将覆盖旧的数据库。


1
对我来说,只需要第三步就足够了。 - Marco Rossi
在 SQL Server 15 中工作过。 - coder kemp

48
USE [master];
GO

CREATE DATABASE db;
GO

CREATE DATABASE db2;
GO

BACKUP DATABASE db TO DISK = 'c:\temp\db.bak' WITH INIT, COMPRESSION;
GO

RESTORE DATABASE db2
  FROM DISK = 'c:\temp\db.bak'
  WITH REPLACE,
  MOVE 'db' TO 'c:\temp\db2.mdf',
  MOVE 'db_log' TO 'c:\temp\db2.ldf';

36

简单的3步:

1- 右键单击数据库 → 任务 → 恢复 → 数据库

2- 选择设备为源,并定位.bak(或压缩的 .bak)文件

3- 在左侧窗格中单击选项并且:

  • 勾选 覆盖现有数据库。
  • 取消勾选 在恢复之前进行尾日志备份。
  • 勾选 关闭目标数据库上的现有连接。

其他选项真的是可选的(当然也很重要)!


27

如果您正在使用脚本方法并且遇到有关LDF和MDF文件的错误,您可以首先查询备份文件,以获取备份集中文件的逻辑名称(以及其他细节),使用以下命令:

-- Queries the backup file for the file list in backup set, where Type denotes 
-- type of file. Can be L,D,F or S
-- info: https://learn.microsoft.com/en-us/sql/t-sql/statements/restore-statements-filelistonly-transact-sql
RESTORE FILELISTONLY FROM DISK = 'C:\Temp\DB_backup.bak'
GO

你将会得到类似以下的结果:

在此输入图片描述

然后你可以在查询中使用这些逻辑名称:

    -- Script assumes you want MDF and LDF files restored on separate drives. Modify for your scenario
    RESTORE DATABASE DB 
    FROM DISK='C:\Temp\DB_backup.bak'
    WITH REPLACE,
      MOVE 'DB' TO 'E:\MSSQL\Data\DB.mdf', -- "DB" is the mdf logical name from query above
      MOVE 'DB_log' TO 'F:\MSSQL\Logs\DB.ldf'; -- "DB_log" is LDF logical name from query above

有关 RESTORE FILELISTONLY 的更多信息,可以从 SQL Server 文档中找到


我在这个问题上也遇到了同样的问题,我的情况是数据库备份来自远程服务器,我不得不在我的D盘中创建与第一个查询输出相似的文件夹结构。然后第二个查询才能正确地工作并恢复数据库。 - rinilnath

25

这是因为原始数据库的.mdf.ldf文件位于可能是c:\program File\....,且此信息已保存在备份中!

如果您在安装在c:\program Files (x86)\ ....上的不同SQL服务器上创建相同的DB,则无法像通常那样还原。 您需要重新定位.mdf.ldf文件的路径。

因此:

  • 在新服务器上创建空DB

  • 右键单击空DB>任务>还原>数据库>单击设备选择您的.bak文件>选择要还原到的DB

  • 点击左侧的“文件”>选择“将所有文件重定位到文件夹”
  • 点击左侧的“选项”>点击“覆盖”

完成!
希望能有所帮助!


20

今天我遇到了类似的问题。尝试了上面所有的解决方法,但都不起作用。因此在这里发布我的解决方案。

恢复之前不要忘记取消勾选“Tail-long Backup”

恢复之前不要忘记取消勾选“Tail-long Backup”

希望对其他人有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接