SQL Server - 文件时间戳未更改,那么正在备份的是什么?

RGO*_*RGO 6 sql-server sql-server-2008-r2 transaction-log

请查看下面的快照,其中显示了我管理的其中一个 SQL Server 实例的所有数据文件和事务日志文件的时间戳。这是一个生产实例。

在此处输入图片说明

今天是 2019 年 12 月 27 日。但是,如您所见,所有时间戳都显示更旧的时间。

事实是,我在几天前的 12 月 24 日拍了这张快照。但是,当我今天检查时,情况仍然没有变化。

上面的快照取自用户数据库。我还检查了驻留在单独驱动器上的系统数据库,并拍摄了文件时间戳的快照,如下所示:

在此处输入图片说明

这些数据库当然不是超级活跃的。但是,我确信交易一直在运行。此外,我查看了其中一些的“架构更改历史记录”报告,并可以确认我们的维护工作最近在 12 月 26 日就一直在工作并重建索引。

数据库都在完全恢复模型中(尽管这可能无关紧要 - 只是一个事实)。操作系统为 Windows NT 6.0(= Windows Server 2007),SQL Server 版本为 2008 SP3。操作系统和 SQL Server 都将于明年第一季度进行升级。同样从上面的快照中可以明显看出,数据文件和日志文件都驻留在同一个磁盘驱动器和文件夹中,我“继承”的这台服务器的配置当然不是最好的。因此,希望所有这些都将在几个月后进行的计划升级/迁移活动中得到修复。

现在我的问题是为什么这些文件的时间戳没有得到更新,尽管数据库仍然处于活动状态?(即使手动运行 Checkpoint 也没有改变任何东西)。然后,如果事务日志文件没有得到更新,备份是否良好可靠?它们真的包含它们应该包含的记录吗?

Jos*_*ell 11

在回答您的主要问题(“正在备份什么”)时,所有应该更严重的问题,您不能使用这些时间戳作为数据库文件中发生更改的标志。SQL Server 不保证数据库文件的修改日期将如何更改或更新。

此处有一篇有趣的博客文章,试图找到有关何时以及如何在 MDF 文件上更新日期修改戳记的模式:

SQL Server 数据库文件 - 修改日期

我认为他们的观察符合您的情况:对数据文件的正常写入不会更新日期修改戳。看起来增长事件(手动或自动)会更新该值,重新启动服务(或任何其他可能“打开”或“关闭”数据库的东西 - 使用自动关闭功能,显式使数据库脱机等)也会更新该值。

我预计 19/12/2019 晚上 9:52 对应于 Windows 或 SQL Server 重新启动,这就是几个日期/时间同步的方式。

然而,这种行为是没有记录的。我们注意到的任何模式都可能随时发生变化,或者出现意外的边缘情况。

对于驻留在 NTFS 文件系统上的 SQL Server 数据文件,适用:

关于文件时间戳的唯一保证是在关闭进行更改的句柄时正确反映文件时间。

不过,要明确的是,这是 Windows 提供的保证。我们不一定非常了解 SQL Server 如何在每种情况下创建和销毁文件句柄。

David Browne(微软高层)在评论中提到了这一点,了解这一点很有用:

SQL Server 在运行时保持数据库文件打开,以提高性能并防止其他进程更改它们。所以属性不会在每次文件写入时改变。