代码之家  ›  专栏  ›  技术社区  ›  Vinko Vrsalovic

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

  •  4
  • Vinko Vrsalovic  · 技术社区  · 14 年前

    有没有一种方法可以知道上一次写操作何时在Live SQL Server 2005数据库中发生?

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

    事实上,我问的是 this 问题。我想告诉实时数据库的最后一次写入日期,看看是否应该备份,而不是从备份中询问最后一次写入日期。

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

    7 回复  |  直到 8 年前
        1
  •  3
  •   MicSim    14 年前

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

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

    这有助于:

    SELECT max(last_user_update) last_user_update
    FROM sys.dm_db_index_usage_stats
    WHERE database_id = DB_ID( 'YOUR_DBNAME_HERE')
    
        3
  •  2
  •   Joe Stefanelli    14 年前

    您可能需要重新考虑备份策略,可以将每周完整备份作为基准,然后运行 differential backups 一周之内。当然,这一切都取决于您的服务级别协议和用于恢复的业务。

        4
  •  0
  •   SQLEagle    11 年前

    列维多斯对不起,你得到的信息不正确。因为没有对每个数据库的前一个进行排序,所以实际上没有得到最后修改的日期,所以得到的是第一条返回的记录。

    请把我的成绩和你的相比较。

    这是我的最新消息。

    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)
    
        5
  •  0
  •   Revelation Now    8 年前

    上面有许多错误的代码段。我已经修复了上面的SQLEagle代码片段,现在您确实应该看到最后修改的日期——我认为修改的日期应该来自sys.objects,而不是sys.tables。我看到安德鲁·阿诺德对黛比的代码片段“完全相同”发表了评论。安德鲁显然没有运行这两个代码段,但是,或者他会知道黛比的结果比水冷器在实际提供几乎正确的结果方面的贡献得到更好的结果,但是可以根据下面的内容进一步改进。

    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)
    
        6
  •  -1
  •   levidos    12 年前

    此数据库将列出服务器上的所有联机数据库和上次修改的日期。

    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)
    
        7
  •  -1
  •   Debbie S    10 年前

    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)