Sql-Server

DBCC 收縮文件歷史

  • October 6, 2021

我通過 GUI 執行收縮文件(.mdf),方法是選擇任務 -> 收縮 -> 文件並選擇第二個選項,即在釋放未使用空間之前重新組織頁面。現在,我想知道我針對 50dbs 執行的壓縮文件命令的歷史。例如以下

  1. 它回收了多少空間
  2. .mdf 文件空間在執行收縮文件命令之前和之後。

謝謝

SQL Server 本身不會保留這種類型的歷史記錄。但是,您可以通過查詢 msdb 中的備份歷史表並比較收縮前後完整備份的大小來獲得一些資訊。

東風

預設跟踪包含有關所有 DBCC 命令的一些有限資訊,包括收縮。使用Aaron Bertrand 的查詢作為起點,我們可以確定哪個數據庫被收縮,然後查看它最近的一些備份歷史記錄。

WITH p as
(
 SELECT 
     [path] = 
         REVERSE
         (
             SUBSTRING
             (
                 p, 
                 CHARINDEX
                 (
                     N'\', 
                     p
                 ), 
                 260
             )
         ) + N'log.trc'
 FROM 
 (
     SELECT 
         REVERSE(t.[path]) 
     FROM sys.traces AS t
     WHERE t.is_default = 1
 ) s (p)
)
SELECT 
  t.TextData,
  ShrunkenHead = 
  SUBSTRING
  (
      t.TextData,
      CHARINDEX
      (
          '''', 
          t.TextData
      ) 
      + 1,
      CHARINDEX
      (
          '''', 
          t.TextData, 
          CHARINDEX
          (
              '''', 
              t.TextData
          ) 
          + LEN('''')
      ) - LEN('''') 
        - CHARINDEX
          (
              '''', 
              t.TextData
          ) 
  ),
  t.NTUserName,
  t.NTDomainName,
  t.HostName,
  t.ApplicationName,
  t.LoginName,
  t.Duration,
  t.StartTime,
  t.EndTime,
  t.Reads,
  t.Writes,
  t.CPU,
  t.Success,
  t.ServerName,
  t.DBUserName,
  t.LoginSid,
  t.SessionLoginName
INTO #p
FROM p 
CROSS APPLY sys.fn_trace_gettable
(
   p.[path], 
   DEFAULT
) AS t
WHERE t.EventClass = 116
AND   t.TextData LIKE 'DBCC SHRINK%';

您需要做一些練習來解析 DBCC 命令,因為在跟踪中記錄的數據庫是命令執行的數據庫,而不是執行數據庫。

請注意,我包含了跟踪中的一些列,我相信這些列對於收縮將始終為 NULL,但它也可能與我在跟踪中生成測試數據所做的事情有關,這使得它們不太有用。如果它們對您來說也為 NULL,那麼您的陪伴很好。但我不能讓它們更有用。

如果您需要幫助了解我的查詢中的字元串解析做了什麼,您可以在此處查看我的文章。

一旦我們將它隱藏在#temp 表中,我們就可以查看數據庫的完整備份歷史記錄。

SELECT
   p.*,
   bs.*
FROM #p AS p
OUTER APPLY
(
   SELECT TOP (20)
       bs.backup_start_date,
       bs.backup_finish_date,
       bs.backup_size,
       bs.compressed_backup_size
   FROM msdb.dbo.backupset bs
   WHERE bs.name = p.ShrunkenHead
   AND   bs.type = 'D'
   ORDER BY bs.backup_finish_date DESC
) AS bs
ORDER BY 
   p.ShrunkenHead,
   p.StartTime DESC;

這樣,您就可以了解數據庫備份大小是如何變化的。我包括正常尺寸和壓縮尺寸,以防萬一。

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