实时SQL Server 2005数据库的上次修改日期

时间:2010-10-19 15:01:05

标签: sql-server sql-server-2005 last-modified

有没有办法知道实时SQL Server 2005数据库中最后一次写操作的时间?

我目前在我的服务器上有30个(并且正在增长)数据库。其中只有一些人看到了日常活动(但是哪些日常活动会随着时间而变化。)我的备份空间有限,我想每天备份所有“自上次备份以来修改过的”数据库。

事实上,我问的是this问题的反面。我不想从备份中询问上次写入日期以查看是否应该恢复它,而是想告诉实时数据库的上次写入日期,看看是否应该备份它。

由于备份在服务器本身上运行,我可以检查日志的最后修改时间,但这不是很干净,我也不确定是完全可靠的。

6 个答案:

答案 0 :(得分:9)

这会有所帮助:

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

答案 1 :(得分:3)

This Blog entry包含有关如何在SQL Server 2008和2005上执行此操作的信息。

  • 2008年:使用新的服务器审核功能
  • 2005年:使用动态管理视图(DMV)

答案 2 :(得分:2)

您可能希望重新考虑备份策略,可能是将每周完整备份作为基准,然后在一周内运行differential backups。当然,这一切都取决于您的SLA与恢复业务。

答案 3 :(得分: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)

答案 4 :(得分:0)

上面有许多不正确的代码段。我已经修复了上面的SQLEagle代码片段,现在你确实应该看到最后修改日期 - 我相信修改日期应该来自sys.objects,而不是sys.tables。我看到Andrew Arnold评论了Debbie的代码片段#34;完全相同"。然而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)

答案 5 :(得分:-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)