SQL Server 2017 - 数据库还原,覆盖而不替换

SQL Server 2017 -Database Restore, Overwrite without REPLACE

这只是我,还是一个更广泛的问题。 --原来是我。

在带有 CU15 (14.0.3162.1) 的 SQL Server 2017 中,您可以在现有数据库上还原数据库 而无需 使用 REPLACE 选项。 'Overwrite the existing database (WITH REPLACE)' 选项现在是不敬的并且被忽略了。

已通过 GUI 和新查询使用 SSMS 17.8.1 和 17.9.1 进行确认window。

正在还原的备份来自 SQL Server 2014 (12.0.6024.0) 和本地备份 (SQL Server 2017) 表现出相同的行为。

所以

RESTORE DATABASE [TMP1] FROM  DISK = N'F:\tmp\TMP1.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 5

相同
RESTORE DATABASE [TMP1] FROM  DISK = N'F:\tmp\TMP1.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5

The REPLACE option overrides several important safety checks that restore normally performs.

https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-2017

执行 RESTORE 时,SQL 服务器会检查可能导致问题的特定条件。只要 none 这些条件适用,它就会执行备份,即使这意味着覆盖现有数据库。如果任何安全检查失败,它将给出错误消息。通过添加 REPLACE 选项,您告诉 SQL 服务器无论安全检查如何都可以覆盖文件。

------------ 编辑:----------------

SQL服务器端如何判断被恢复的数据库是否与被覆盖的数据库相同?当我开始写这篇文章时,我不知道答案,所以我做了一些研究。为此 SQL 服务器使用 FamilyGUID。每次您创建一个新数据库时,它都会被 纹身 FamilyGUID。备份数据库时,FamilyGUID 会被带走。当需要恢复时,SQL 服务器将备份的 FamilyGUID 与被覆盖的数据库进行比较。如果它们相同,则没有问题。如果它们不同,则需要使用 REPLACE

也许在您的情况下,FamilyGUID 是相同的。

要查找备份的 FamilyGUID,请使用:

RESTORE headeronly FROM DISK = N'Q:\MyBackup.bak'

要查找被覆盖的数据库的FamilyGUID,可以使用:

SELECT DB_NAME(database_id) as DatabaseName, database_guid, family_guid
FROM master.sys.database_recovery_status

它们一样吗?