SQL Server Express 将数据库回滚到以前状态的原因可能是什么?

What could be the reason for SQL Server Express to roll back a database to a previous state?

我有一些很奇怪的问题。我在 Windows 2003 终端服务器上有一个来自多个客户端的应用程序 运行。该应用程序使用 SQL Server 2008 Express 作为其数据库。

昨天,我连接到该应用程序,关闭了服务器上一些没有响应的会话,令我惊讶的是,我发现数据库中缺少一些数据。经过进一步搜索,我发现上周所做的所有数据库更改都丢失了。

就像数据库回滚了所有的改动,回到了一周前的状态!我可以确认所有更改都丢失了。事实上,我已经用 identity_insert ON 向 table 中插入了一条记录(在自动数字列上手动插入一个 ID)并且该记录丢失了,所以这不可能是程序故障。

有人知道这里会发生什么吗?

编辑

我有一个疑惑:一个session发起的事务是否可以在一周内保持未确认状态,保留所有数据库更改,当我关闭session时回滚所有所做的更改?

编辑二

在日志中找到这个:

SQL 服务器永远不会将数据库回滚到以前的状态(像这样)。数据库被恢复,或者整个 disk/VM 被回滚,或者执行 DML 以制造回滚发生的印象(但实际上没有)。也许有人在错误的方向上执行了同步工具。

该问题没有可用于查找问题的信息。但这肯定不是 SQL 服务器回滚数据库。

您可以尝试使用 fn_dblog 检查日志。

从日志来看,服务器似乎只是在重启或服务重启后才启动。

如果数据库没有完全关闭,则数据库可能会留下部分应用的事务。如果发生这种情况,则数据库会在启动时恢复。

任何未完成的事务都将回滚。尚未应用的已提交事务会前滚。此恢复需要多长时间取决于日志中尚未应用到数据库的事务的大小。

事务在崩溃后回滚后可能不会显示在日志中。这取决于它们在日志中的位置和数据库的恢复模式。

  • 如果事务位于日志末尾,则很可能会回滚日志并删除事务。
  • 如果事务在日志中间,您可能会在日志中看到 LOP_ABORT_XACT。
  • 当使用简单恢复时,日志很有可能在恢复后被清除(因为日志只保留到提交事务之前)。

有关详细信息,请参阅 Are log records removed from ldf file for rollbacks?