T-SQL 恢复数据库仅恢复旧数据

问题描述 投票:0回答:1

我从 SQL Server 2014 迁移到 SQL Server 2022。

我首先从 SQL Server 2014 实例创建完整备份,然后运行如下所示的

RESTORE DATABASE
脚本来进行测试迁移。一切都按计划进行。

一周后,我删除了新服务器上的所有数据库,再次将 SQL Server 2014 备份到相同的文件名,然后再次运行以下脚本。然而,SQL Server 2022 并没有恢复该文件的最新版本,而是仅恢复了一周前的数据。只需在 UI 中右键单击并从那里执行“恢复”即可恢复当前版本的数据。

有人可以帮我理解为什么这是为了防止将来发生这种情况吗?

BACKUP DATABASE db1 TO DISK = db1.BAK;  
RESTORE DATABASE [db1]
FROM DISK = N'\\sql2014\migration\db1.BAK' WITH FILE = 1, 
     MOVE N'db1_data' TO N'D:\Data\db1_data.mdf', 
     MOVE N'db1_log' TO N'D:\Log\db1_log.ldf',
     NOUNLOAD,
     REPLACE,
     STATS = 5;
GO
sql sql-server database-restore sql-server-2022
1个回答
2
投票

问题是您将多个备份放入一个文件中。

FILE = 1

这告诉 SQL Server 从备份中的first(读:oldest)文件恢复(如果您不指定,这也是默认值)。您可以通过运行查看备份及其文件编号:

RESTORE HEADERONLY FROM DISK = N'\\sql2014\migration\db1.BAK';

输出中要查看的重要列是

Position
(对应于恢复时所需的
FILE = 
参数)和
BackupFinishDate
(以确认您获取的是最新版本)。当然,请验证
DatabaseName
是否正确,因为您可以将多个不同的数据库备份到同一个文件。

并不是说您应该这样做(即使对于“相同”数据库)。在使用磁带并最大限度地减少传输的文件数量的时代,这可能是有意义的,但在现代系统上,您应该始终将每个备份放入其自己的文件中。自动化可以帮助解决这个问题(例如Ola 的解决方案),只需使用注入时间戳的文件名模板,保持备份文件的唯一性。除此之外,如果您总是使用 BACKUP DATABASE ... WITH INIT, FORMAT 那么您就会知道备份只能包含最新的。

但这可能不是目标 - 例如如果您想保留最后 7 个备份,则需要在名称中包含时间戳,或者需要将它们放在不同的文件夹中。

最后,我只是不会使用 UI 来恢复数据库。这些命令更具表现力,让您可以精确控制您想要执行的操作。也许可以使用 UI 生成/学习命令,但不要
next

/

next
/
OK
    

© www.soinside.com 2019 - 2024. All rights reserved.