请参阅下面的快照,其中显示了我管理下的一个 SQL Server 实例的所有数据文件以及事务日志文件的时间戳。这是一个生产实例。
今天是 2019 年 12 月 27 日。但是,如您所见,所有时间戳都显示了更早的时间。
事实是,我在几天前的 12 月 24 日拍摄了这张快照。但是,正如我今天检查的那样,情况仍然没有改变。
上面的快照取自用户数据库。我还检查了驻留在单独驱动器上的系统数据库,并拍摄了文件时间戳的快照,如下所示:
这些数据库当然不是超级活跃的。但是,我确信有交易一直在运行。此外,我查看了其中一些的“架构更改历史记录”报告,并且可以确认我们的维护工作直到昨天 12 月 26 日一直在工作和重建索引。
数据库都处于完全恢复模式(尽管这可能不相关 - 只是需要提及的事实)。操作系统是 Windows NT 6.0 (= Windows Server 2007),SQL Server 版本是 2008 SP3。操作系统和 SQL 服务都将在明年第一季度升级。从上面的快照中也可以看出,数据文件和日志文件都驻留在同一个磁盘驱动器和文件夹中,我“继承”的这个服务器的配置肯定不是最好的。因此,希望在几个月后进行的计划升级/迁移活动期间,所有这些都将得到解决。
现在我的问题是为什么这些文件的时间戳没有得到更新,尽管数据库仍然处于活动状态?(即使手动运行 Checkpoint 也没有改变任何东西)。然后,如果事务日志文件没有得到更新,备份是否良好且可靠?它们真的包含它们应该包含的记录吗?
在回答您的主要问题(“正在备份什么”)时,所有应该是 ? 更严重的是,您不能使用这些时间戳作为数据库文件中发生更改的标志。SQL Server 不保证数据库文件的修改日期将如何更改或更新。
这里有一篇有趣的博客文章,它试图找到在 MDF 文件上更新日期修改戳的时间和方式的模式:
SQL Server 数据库文件 - 修改日期
我认为他们的观察与您的情况一致:对数据文件的正常写入不会更新日期修改戳。看起来增长事件(手动或自动)会更新该值,就像重新启动服务(或任何其他可能“打开”或“关闭”数据库 - 使用自动关闭功能,显式使数据库脱机等)一样。
我预计 2019 年 19 月 12 日晚上 9:52 对应于 Windows 或 SQL Server 重新启动,这就是几个日期/时间同步的方式。
然而,同样,这种行为是无证的。我们注意到的任何模式都可能随时改变,或者有意想不到的边缘情况。
对于驻留在 NTFS 文件系统上的 SQL Server 数据文件,这适用:
不过,需要明确的是,这是 Windows 提供的保证。我们不一定知道 SQL Server 在每种情况下如何创建和销毁文件句柄。
David Browne(微软顶级人物)在评论中提到了这一点,了解这一点很有用: