编辑:问题原来是,虽然每晚都进行备份,但我试图恢复到尚未备份的时间点。如果我正在编写恢复脚本,我会更快地意识到这一点,但因为我使用的是 GUI,它只是选择了最新的日志文件,而没有费心通知我所选的日志文件实际上并不包含时间点我在指定。
在我对数据库和事务日志进行当前备份后,它就可以正常工作了。
话虽如此,我仍然不明白在下面描述的场景中如何恢复时间为'2013-11-27 12:52:08.240'的记录。但现在我只是将其归因于应用程序记录了错误的时间。
我再一次被 SQL Server 恢复到特定时间点的能力搞糊涂了。
有时,当我过去尝试过此操作时,SQL Server 似乎已恢复到我要求的时间点附近,但不完全是我指定的时间点。我把这归结为我的误解,因为我知道数据库中记录的日期源自应用程序,因此可能与实际写入记录的时间略有不同。差异实际上比“轻微”多一点,但这仍然是我能想到的最好的解释。
今天中午 12 点 55 分左右,我将数据库恢复到 30 分钟后到中午 12 点 25 分。现在,当我查询日志并按日期/时间排序时,我看到一条日期为“2013-11-26 18:21:49.200”的记录,紧接着是一条日期为“2013-11-27”的记录12:52:08.240' 紧挨着彼此。
所以我的第一个观察是,从今天开始到我恢复到(12:25pm)的所有记录都不存在。我的第二个观察是,在 12:52pm 有一条记录,这是我尝试恢复到的时间之后的 27 分钟(方式,方式很大,因为应用程序选择时间和记录实际时间之间的时间略有差异写好了)。
还有其他人遇到过这个吗?我不知道为什么会发生这种情况,如果能帮助我弄清楚如何备份我的数据库,以便在我需要时将它们正确恢复到某个时间点,我将不胜感激,因为这是我转而使用的全部原因备份的完整恢复模型。
这里的快速回答是:你所描述/暗示的是一件大事,我没有经历过,这不是 SQL Server 的默认或预期行为。
恢复能力是 RDBMS 的一项基本功能。恢复到某个时间点的能力是该基本功能的基本部分。而这种能力的基础是关系数据库管理系统的日志机制。
这不仅使我们能够恢复到某个时间点,而且能够在崩溃或重启期间恢复到一致的状态。它与那里使用的是同一个事务日志。
简而言之(有很多资源描述了这个过程。这是一个很好的开始)——SQL Server 使用预写日志记录机制。这意味着在该事务被认为是持久的并且您的事务可以被视为完成之前,所有内容都已写入您的事务日志并确认已写入那里。如果这不起作用,我们永远不会相信 SQL Server 的可靠性和您应用程序中的数据,因为数据可能会因 IO 问题、内存问题、重启等而变得不一致。我们无法保证保持 ACID数据库的属性了。
所以考虑到这个警告,这里发生了三件事之一:
(**注意:**我还要确认时区设置,进行备份的服务器上的时区是您在还原时使用的时区,因为这个问题进入了。因此,如果您要从一台服务器还原到其他 - 检查您的时区和所有时区。)
一种简单的方法可以证明这一点?
在正常活动后查询您正在查看的表以进行日志记录。根据您对今天活动的理解,您是否看到了您期望看到的内容?好吧,如果您做了一些不同的事情,请执行正常的恢复过程或上面链接的文档中指示的过程。将此恢复到另一台机器/开发机器,这样你就不会影响你的主服务器!恢复到您在此表中运行查询的时间。查看您的表格 - 如果您正确执行了上述步骤,您应该会看到数据看起来应该是正确的。如果不行,我先看看你的流程,重新看说明书,确认数据库,确认两台服务器的时区和时间,如果还是有问题,你 是否完全排除了过程中遗漏了什么?我会立即与 Microsoft 通话,但如果您遇到错误或问题,我真的会感到惊讶。