4

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

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

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

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

4

7 回答 7

9

这有帮助吗:

SELECT max(last_user_update) last_user_update
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'YOUR_DBNAME_HERE')
于 2010-10-19T23:03:00.137 回答
3

此博客条目包含有关如何在 SQL Server 2008 和 2005 上执行此操作的信息。

  • 2008 年:使用新的服务器审计功能
  • 2005 年:使用动态管理视图 (DMV)
于 2010-10-19T15:25:03.660 回答
2

您可能需要重新考虑您的备份策略,或许将每周一次的完整备份作为基准,然后在一周内运行差异备份。当然,这一切都取决于您与业务恢复的 SLA。

于 2010-10-19T15:25:10.237 回答
0

levidos 抱歉,但您得到的信息不正确。因为您没有对每个数据库的前一个进行排序,所以您实际上没有获得 LAST MODIFIED DATE 您获得的第一个返回记录。

请把我的结果和你的比较一下。

这是我的更新。

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)
于 2013-03-20T19:23:32.273 回答
0

上面有许多不正确的代码段。我已经修复了上面的 SQLEagle 的代码片段,现在您确实应该看到最后修改日期 - 我相信修改日期应该来自 sys.objects,而不是 sys.tables。我看到 Andrew Arnold 评论 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)
于 2016-12-05T03:38:25.870 回答
-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)
于 2012-08-17T11:46:48.277 回答
-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) 
于 2014-07-18T14:19:01.273 回答