我有一些非常奇怪的问题。我有一个从多个客户端在Windows 2003终端服务器上运行的应用程序。该应用程序使用SQL Server 2008 Express作为其数据库。
昨天,我连接到应用程序,关闭了服务器上没有响应的一些会话,令我惊讶的是,我看到数据库中缺少一些数据。经过进一步搜索后,我发现上周所做的所有数据库更改都丢失了。
就像数据库回滚所有更改一样,并返回到一周前的状态!我可以确认所有的更改都丢失了。实际上我已经将一条记录插入到identity_insert ON
的表中(手动在自动数字col上插入一个ID)并且该记录丢失了,所以这不会是程序失败。
有没有人知道这里会发生什么?
修改
我有一个疑问:会话启动的事务是否可以在未确认的状态下保留一周,保留所有数据库更改,当我关闭会话时回滚所做的所有更改?
编辑II
在日志中找到这个:
答案 0 :(得分:1)
SQL Server永远不会将数据库回滚到以前的状态(如下所示)。数据库已恢复,或者整个磁盘/ VM已回滚,或执行了DML以产生回滚发生的印象(但实际上没有)。也许有人在错误的方向上执行了同步工具。
该问题没有可以找到问题的信息。但肯定不是SQL Server回滚数据库。
您可以尝试使用fn_dblog
检查日志。
答案 1 :(得分:0)
从日志中看起来服务器刚刚重启或服务重启后才启动。
如果数据库没有干净地关闭,那么数据库可以留下部分应用的事务。如果发生这种情况,则数据库将在启动时恢复。
回滚任何不完整的交易。尚未应用的已提交事务将向前滚动。此恢复所需的时间取决于日志中尚未应用于数据库的事务的大小。
在崩溃后回滚后,事务可能不会显示在日志中。这取决于它们在日志中的位置以及数据库的恢复模式。
有关详细信息,请参阅Are log records removed from ldf file for rollbacks?。