如何获取 SQL Server 数据库中每个表的最后截断时间

LCJ*_*LCJ 7 sql-server truncate sql-server-2012

我有一个 SQL Server 2012 数据库。是否可以获得数据库中所有表的最后截断时间?

注意:恢复模式SIMPLE在我的场景中。如果我将其更改为可以FULL吗?

Kin*_*hah 12

请记住,truncate 是一个有效记录的操作

由于您在 Simple Recovery 模式下运行,并且如果您的 T-log 没有被截断,您可以使用 undocumented 获取它fn_dblog

SELECT [Current LSN]
    ,[Operation]
    ,[Begin Time]
    ,[Transaction ID]
    ,[Transaction Name]
    ,[Transaction SID]
    ,SUSER_SNAME([Transaction SID]) as UserWhoIssuedTruncate
FROM fn_dblog(NULL, NULL)
WHERE Operation = 'LOP_BEGIN_XACT' and
    [Transaction ID] IN (
        SELECT [Transaction ID]
        FROM fn_dblog(NULL, NULL)
        WHERE [Transaction Name] = 'TRUNCATE TABLE'
        )
GO
Run Code Online (Sandbox Code Playgroud)

点击这里放大

在此处输入图片说明

或者,您可以运行服务器端跟踪或打开 SQL 审计。

始终为您的用户提供最低权限(最低权限原则)。

如果我将其更改为 FULL 可以吗?

是的(并且恢复模型应该由您的业务定义 - 您想要时间点恢复吗?您的业务可以丢失多少数据?等等)您必须通过运行常规日志来开始维护您的 T 日志备份。这将使您的 T-log 保持在合理的大小。

Edited Query 使用“IN”而不是“=”,因为子查询中可能有多个结果。


spa*_*dba 4

恐怕如果不预先设置一些东西来捕获事件,就不可能知道上次截断表的时间。

默认跟踪不保存truncate事件信息,sys.dm_dm_index_usage_stats也不会为您提供帮助。

您的选择是:

  1. 一丝痕迹
  2. 扩展活动会议
  3. 审计(我不是 100% 确定它可以捕获 TRUNCATE 事件)

就您的第二个问题而言,生产数据库的恢复模型通常是FULL,因为一般来说需要在特定时间点恢复数据库。仅包含可以从其他数据源轻松快速重建的数据的数据库通常不需要在特定时间点恢复,因此它们通常处于恢复模型SIMPLE