在 SQL Server 中还原数据库时出现问题

dot*_*ewb 3 sql-server-2008 sql-server restore

我正在尝试按照以下帖子中的说明进行操作:

/sf/ask/720986801/

总结; 我正在构建逻辑文件列表然后恢复数据库:

RESTORE FILELISTONLY
FROM DISK = 'C:\KeltieCochrane_v220120220.BAK';

RESTORE DATABASE KeltieCochrane_v2 
FROM DISK = 'C:\KeltieCochrane_v220120220.BAK'
WITH 
    MOVE 'KeltieCochrane_v2' TO 'C:\Program Files\...\KeltieCochrane_v2.mdf',
    MOVE 'KeltieCochrane_v2' TO 'C:\Program Files\...\KeltieCochrane_v2_1.ldf';
Run Code Online (Sandbox Code Playgroud)

我没有.MDF.LDF在目标文件夹中,并且知道它们包含在.BAK备份文件中。

当我将数据库恢复到一个空的新数据库时,它指出:

The backup set holds a backup of a database other than the existing 'KCDB'.

当我尝试使用脚本 (KeltieCochrane_v2) 中的实际数据库名称进行恢复时,我得到 There are conflicting file locations specified for the file.

如果我尝试简单地恢复数据库,我会收到一个标准的 15105 错误并且操作系统无法获取此错误的文本。

我究竟做错了什么?

Tho*_*ger 6

您收到第一个错误,因为kdcb已经存在。并且备份的数据库不是同一个数据库。如果你想覆盖现有的、单独的数据库(这是不一样的。你不需要指定替换),你需要包含REPLACE选项:

RESTORE DATABASE KeltieCochrane_v2 
FROM DISK = 'C:\KeltieCochrane_v220120220.BAK'
WITH 
MOVE 'KeltieCochrane_v2' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\KeltieCochrane_v2.mdf',
MOVE 'KeltieCochrane_v2' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\KeltieCochrane_v2_1.ldf',
REPLACE
Run Code Online (Sandbox Code Playgroud)

警告!!!您需要非常小心并通过指定REPLACE. 以下是BOL 关于REPLACE以下内容的确切摘录:

替换期权影响

REPLACE 应该很少使用,并且只有在仔细考虑之后才能使用。恢复通常可以防止意外地用不同的数据库覆盖数据库。如果 RESTORE 语句中指定的数据库已存在于当前服务器上,并且指定的数据库系列 GUID 与备份集中记录的数据库系列 GUID 不同,则不会还原该数据库。这是一个重要的保障。

REPLACE 选项会覆盖恢复正常执行的几个重要安全检查。被覆盖的检查如下:

使用另一个数据库的备份恢复现有数据库。

使用 REPLACE 选项,restore 允许您用备份集中的任何数据库覆盖现有数据库,即使指定的数据库名称与备份集中记录的数据库名称不同。这可能会导致不同的数据库意外覆盖数据库。

使用完整或大容量日志恢复模型恢复数据库,其中未进行尾日志备份且未使用 STOPAT 选项。

使用 REPLACE 选项,您可能会丢失已提交的工作,因为最近写入的日志尚未备份。

覆盖现有文件。

例如,错误可能允许覆盖错误类型的文件,例如 .xls 文件,或者其他未联机数据库正在使用的文件。如果现有文件被覆盖,则任意数据丢失是可能的,尽管恢复的数据库是完整的。