SQL Server 上的备份和恢复(迁移)中丢失的表

Eri*_*gen 3 sql-server restore sql-server-2019

我正在尝试将工作中 SQL Server 实例上的小型数据库的结构和内容复制到我家用计算机上的实例。看起来这应该是一个简单的、两分钟的操作,但是当我按照手册所说的去做时,九个表中只有四个实际上在我的家用计算机上恢复了。至于为什么其他五个表被排除在外,没有明显的规律或理由。这是一个入门数据库项目,暂时没有什么花哨的东西——只有九个简单的表,甚至还没有应用任何约束或触发器。

我不是一个经验丰富的 DBA。我想我以前做过这件事,没有发生任何事故,但我不太记得了。这种事情不是我的正常工作。我是否可能会犯任何新手错误——我需要重写任何无意义的默认 SSMS 设置才能使所有 DBA 任务中最基本的任务真正发挥作用?

Aar*_*and 6

可能发生的情况如下(这是很常见的情况,所以不要灰心):

  1. 您在某个时间点备份了数据库(例如,TO DISK = '\\somelocation\file.bak'
  2. 您对数据库进行了更改
  3. 您再次备份数据库(到相同的'\\somelocation\file.bak'
  4. 您从该文件恢复了备份,该文件包含多个备份,但未指定您想要哪个备份。

您可以通过运行以下命令进行验证:

RESTORE HEADERONLY FROM DISK = N'<location>\<filename>.bak';
Run Code Online (Sandbox Code Playgroud)

如果我的猜测是正确的,这将返回多行。最高的备份Position(通常)是最新的备份。默认情况下恢复的备份(如果您未指定所需的备份)是Position = 1旧的备份。没有什么会警告你你没有服用最新的。

如果要继续尝试从此备份恢复,则需要添加WITH FILE = <highest position in the above output>恢复命令。检查输出的所有行并验证BackupStartDate以确保您选择的是最新的备份。

(我有点希望这个论点是Position = 并且有一个神奇的关键字“拿最新的,傻瓜。”)

但我建议只对新的文件名进行新的备份,并可能丢弃现有的文件(如果您只对最新的备份感兴趣,那么它可能比需要的大得多)。

如果您想随着时间的推移保留备份的多个副本,请在文件名中包含时间戳进行备份。然后您就拥有了单独的文件,并且可以立即准确地关联每个文件的拍摄时间。

如果您想完全覆盖旧备份,请WITH INIT作为备份语句的一部分使用。我建议您使用新文件名进行新备份,使用WITH INIT,然后尝试恢复该备份。