2010-10-19 97 views
4

有沒有辦法知道活動SQL Server 2005數據庫中最後一次寫入操作發生的時間?活動SQL Server 2005數據庫的最後修改日期

我目前在我的服務器上有30個(和不斷增長的)數據庫。其中只有一些會看到日常活動(但哪些日常活動會隨着時間的推移而變化)。我的備份空間有限,我希望每日備份所有「自上次備份後修改」的數據庫。

其實我問的是this的問題。我不想從備份中詢問最後一次寫入日期以查看是否應該恢復它,而是要告訴最後寫入數據庫的日期以查看是否應備份它。

由於備份在服務器本身上運行,我可以檢查日誌的最後修改時間,但這不是很乾淨,也不確定是否完全可靠。

+0

最簡單的解決方案不是切換到壓縮的備份軟件嗎? – Thomas 2010-10-19 15:36:52

+0

@Thomas:我已經使用了壓縮備份 – 2010-10-19 15:44:25

回答

3

This Blog entry包含有關如何做到這一點的SQL Server 2008和2005

  • 在2008年信息:使用新的服務器審覈功能
  • 2005年:使用動態管理視圖(DMV)
2

您可能需要重新考慮備份策略,可能是將每週完整備份作爲基準,然後在一週內運行differential backups。當然,這一切都取決於您的SLA和恢復業務。

+0

做了差異備份會讓事情變得複雜得多,在我的情況下沒有真正的收益(另外,我的壓縮備份工具不支持它們) – 2010-10-19 16:09:50

10

這會幫助:

SELECT max(last_user_update) last_user_update 
FROM sys.dm_db_index_usage_stats 
WHERE database_id = DB_ID('YOUR_DBNAME_HERE') 
+1

不,它不會返回NULL; ) – 2013-07-26 08:31:23

+0

這可能是因爲您的數據庫自上次重新啓動服務器以來沒有更改過。對於每個服務器重新啓動或數據庫附加/分離,這樣的DMV開始「空」。查看MicSlim引用的博客條目。 – Andreas 2016-04-15 14:42:39

-1

這其中將列出服務器和最後修改日期

DECLARE @sqlString NVARCHAR(max) 
DECLARE @union NVARCHAR(max) 
SET @sqlString = '' 
SET @union = '' 
DECLARE @name nvarchar(50); 

DECLARE crs CURSOR FOR 
SELECT Name FROM sys.databases WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sqlString = @sqlString + @union 
    SET @sqlString = @sqlString + ' 
    SELECT 
    TOP 1 
    ''' + @name + ''' as DBName, modify_date 
    FROM 
    [' + @name + '].sys.tables' 

SET @union = ' UNION ' 

    FETCH NEXT FROM crs INTO @name 
END 

SET @sqlString = @sqlString + ' ORDER BY DBName ASC' 
CLOSE crs; 
DEALLOCATE crs; 
EXEC(@sqlString) 
0

levidos對不起所有的在線數據庫,但你得到不正確的信息。由於您沒有對每個數據庫排序最高的一個,所以您確實沒有得到最後修改日期,因此您將獲得第一個返回的記錄。

請將我的結果與您的結果進行比較。

這是我的更新。

DECLARE @sqlString NVARCHAR(MAX) , 
    @union NVARCHAR(MAX) , 
    @name NVARCHAR(50), 
    @Counter AS Int 

SET @sqlString = '' 
SET @union = '' 
SET @counter = 0 

DECLARE crs CURSOR 
FOR 
    SELECT Name 
    FROM sys.databases 
    WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SET @counter = @counter + 1 

     SET @sqlString = @sqlString + @union 
     SET @sqlString = @sqlString + ' 
    SELECT * 
    FROM ( 
     SELECT TOP 1 
      ''' + @name + ''' as DBName, modify_date 
     FROM [' + @name + '].sys.tables 
     ORDER BY modify_date DESC 
      ) as Table' + CAST(@Counter AS VARCHAR(20)) 

     SET @union = ' UNION ' 

     FETCH NEXT FROM crs INTO @name 

    END 

--PRINT @sqlString 

SET @sqlString = @sqlString + ' ORDER BY DBName ASC' 
CLOSE crs ; 
DEALLOCATE crs ; 
EXEC(@sqlString) 
-1

DECLARE @sqlString NVARCHAR(max) = '' 
DECLARE @union NVARCHAR(max) = '' 
DECLARE @name nvarchar(50) 

DECLARE crs CURSOR FOR 
SELECT Name FROM sys.databases WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sqlString = @sqlString + @union 
    SET @sqlString = @sqlString + ' 
    SELECT 
    ''' + @name + ''' as DBName, Max(modify_date) as modDate 
    FROM 
    [' + @name + '].sys.tables' 

SET @union = ' UNION ' 

    FETCH NEXT FROM crs INTO @name 
END 

SET @sqlString = @sqlString + ' ORDER BY modDate desc' 
CLOSE crs; 
DEALLOCATE crs; 
EXEC(@sqlString) 
+0

這與已發佈的其他兩個答案几乎完全相同。 – 2014-07-18 14:39:11

0

有許多上述不正確的代碼段。我修復了上面的SQLEagle代碼片段,現在你應該看到最後修改的日期 - 我相信修改的日期應該來自sys.objects,而不是sys.tables。我看到安德魯阿諾德評論了Debbie的代碼片段「完全一樣」。 Andrew顯然沒有運行這兩個代碼段,或者他會知道Debbie的結果比WaterCooler的貢獻在實際提供幾乎正確的結果方面獲得了更好的結果,但是可以按照以下進一步改進。

DECLARE @sqlString NVARCHAR(MAX) , 
    @union NVARCHAR(MAX) , 
    @name NVARCHAR(50), 
    @Counter AS Int 

SET @sqlString = '' 
SET @union = '' 
SET @counter = 0 

DECLARE crs CURSOR 
FOR 
    SELECT Name 
    FROM sys.databases 
    WHERE state = 0 
OPEN crs 
FETCH NEXT FROM crs INTO @name 

WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SET @counter = @counter + 1 

     SET @sqlString = @sqlString + @union 
     SET @sqlString = @sqlString + ' 
    SELECT * 
    FROM ( 
     SELECT TOP 1 
      ''' + @name + ''' as DBName, modify_date 
     FROM [' + @name + '].sys.objects 
     ORDER BY modify_date DESC 
      ) as Table' + CAST(@Counter AS VARCHAR(20)) 

     SET @union = ' UNION ' 

     FETCH NEXT FROM crs INTO @name 

    END 

--PRINT @sqlString 

SET @sqlString = @sqlString + ' ORDER BY DBName ASC' 
CLOSE crs ; 
DEALLOCATE crs ; 
EXEC(@sqlString)