Sql-Server

如何獲取 SQL Server 數據庫中每個表的最後截斷時間

  • April 22, 2019

我有一個 SQL Server 2012 數據庫。是否可以獲得數據庫中所有表的最後截斷時間?

注意:恢復模式SIMPLE在我的場景中。如果我把它改成 可以FULL嗎?

請記住,截斷是一種有效記錄的操作

由於您在簡單恢復模式下執行並且您的 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

點擊這裡放大

在此處輸入圖像描述

或者,您可以執行伺服器端跟踪或打開 SQL 審計。

始終為您的使用者提供最低權限(最低權限原則)。

如果我將其更改為 FULL 是否有可能?

是的(並且恢復模式應該由您的業務定義 - 您是否希望進行時間點恢復?您的業務可以承受多少數據失去?等等)您必須通過執行正常日誌來開始維護您的 T-log備份。這將使您的 T-log 保持合理的大小。

已編輯 查詢使用“IN”而不是“=”,因為子查詢中可能有多個結果。

恐怕如果不預先設置一些東西來擷取事件,就不可能知道上次截斷表格的時間。

預設跟踪不包含truncate事件資訊,sys.dm_dm_index_usage_stats也不會在這里為您提供幫助。

您的選擇是:

  1. 一個痕跡
  2. 擴展事件會話
  3. 審計(我不是 100% 確定它可以擷取 TRUNCATE 事件)

就您的第二個問題而言,生產數據庫的恢復模型通常是FULL,因為在特定時間點恢復數據庫通常是一個要求。僅包含可以從其他數據源輕鬆快速重建的數據的數據庫通常不需要在特定時間點進行恢復,因此它們通常處於SIMPLE恢復模型中

引用自:https://dba.stackexchange.com/questions/148546