我试图恢复我的数据库的SQL Server备份文件,但它抛出一个错误如下:

备份集保存现有数据库以外的数据库的备份

我的数据库是SQL Server 2008,备份文件是2005年的。

会有什么问题呢?


当前回答

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';

其他回答

我试图将一个生产数据库恢复到同一台服务器上的一个登台数据库。

在我的案例中,唯一有效的是恢复到一个新的空白数据库。这工作得很好,没有尝试覆盖生产文件(如果您只是将生产备份文件恢复到现有的登台数据库,则会覆盖生产文件)。然后删除旧数据库并重命名-文件将保留新的临时名称,但在我的情况下,这是好的。

(或者先删除暂存数据库,然后恢复到与暂存数据库同名的新数据库)

这是因为原始Db中的.mdf和.ldf文件可能位于c:\programFile\....这个信息保存在备份!

如果您在安装在c:\program Files (x86)\ ....的不同SQL Server上创建了相同的DB您不能像往常一样恢复。您需要重新定位.mdf和.ldf文件的路径。

因此:

在新的Server上创建一个空DB 右键单击空Db >任务>恢复>数据库>单击设备选择您的。bak文件>选择Db恢复到 选择“重新定位所有文件到文件夹” 点击左边站点>的选项,点击覆盖

完成了! 希望能有所帮助!

我确定这个问题与文件和文件夹权限有关。

我通过另一种方式完成工作,使用生成脚本。这对我来说确实有用,因为由于同样的错误,Backup-Restore没有帮助解决这个问题。

如果您正在使用脚本方法,并且有关于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 filelist的更多信息可以从SQL Server文档中找到。