Sql-Server-2008

如何檢測對數據庫的任何更改(DDL 和 DML)

  • January 31, 2021

我客戶的 SQL 伺服器上有很多數據庫。這些數據庫正在開發中,因此開發人員可以設計、重構、進行數據修改等。有些數據庫很少更改。我的客戶必須確保所有這些設備的安全(備份)並花一些時間管理環境。(公司沒有數據庫管理員職位。)經過長時間的討論,客戶決定使用每日完整備份策略,因為它易於恢復。

所以這裡是情況的總結:

  • 數據庫的數量每天都在變化。
  • 應備份已更改的數據庫(意味著數據和/或結構已更改)。
  • 不備份未更改的數據庫。
  • 解決方案不應影響數據庫結構(不受限制)
  • 這個“備份引擎”將自動工作。

**主要問題:如何檢測數據庫已更改。**問題的第一部分(DDL 更改)可以通過使用DDL 觸發器來解決。但是數據更改(DML 更改)是個問題。不可能將 DML 觸發器應用於所有數據庫的所有表以跟踪更改(性能、擴展對象的管理……)。備份引擎必須跟踪所有更改以將每個數據庫標記為準備備份。

  • Change Data Capture是一種解決方案,但它似乎過於繁重(它也需要 SQL Server Enterprise Edition)。
  • 另一種方法是跟踪數據庫文件更改(大小或上次更改時間),但它不能正常工作:當數據庫超過所有保留的可用空間時,數據庫可以更改其大小,而sp_spaceused不是解決方案。
  • 跟踪是一種解決方案,但它會導致性能問題並需要額外的管理。

是否有任何解決方案可以計算實際數據庫使用大小而不影響其他數據庫管理對象(如統計資訊..)?誠然,對不改變表大小的表數據的更改不會觸發(我認為),但總比沒有好。真的,我正在為 SQL Server 2008 尋找直接或間接的解決方案。

感謝您的任何評論、解決方案和想法。

添加:

這是解決方案(感謝瑪麗安):

Select
   NextLSN = MAX(fn.[Current LSN])
   ,Databasename = DB_NAME()
from fn_dblog(NULL,    NULL) fn
    LEFT JOIN sys.allocation_units au
        ON fn.AllocUnitId = au.allocation_unit_id
    LEFT  JOIN sys.partitions p
        ON p.partition_id = au.container_id
    LEFT  JOIN sys.objects so
        ON so.object_id = p.object_id  
   WHERE 
   (
       (Operation IN 
      ('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
           'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT') 
           AND so.is_ms_shipped = 0)
       OR 
       ([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
   )

一種想法是每天製作快照並使用文件監視器監視磁碟上的快照文件大小。僅當在其中添加數據時,快照才會增加其大小,因此如果您能找到一個工具來監控實際大小(報告大小),那將是一個有效的想法。

現在..我沒有使用這個,所以不能給你技術見解:-)。

另一個想法是使用我在論壇上看到的一些功能(db_fnlog .. 或其他東西)從日誌中讀取操作來驗證每個數據庫的事務日誌(當然,如果你在它們上使用完全恢復模式) ,並查看您是否有任何刪除/插入/更新。

這些都不是一件容易的事。但我希望你會發現它們很有用。

PS:找到了具有日誌讀取功能的文章(順便說一句:-):閱讀 Jens K. Suessmeyer 的事務日誌

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