有没有办法知道实时SQL Server 2005数据库中最后一次写操作的时间?
我目前在我的服务器上有30个(并且正在增长)数据库。其中只有一些人看到了日常活动(但是哪些日常活动会随着时间而变化。)我的备份空间有限,我想每天备份所有“自上次备份以来修改过的”数据库。
事实上,我问的是this问题的反面。我不想从备份中询问上次写入日期以查看是否应该恢复它,而是想告诉实时数据库的上次写入日期,看看是否应该备份它。
由于备份在服务器本身上运行,我可以检查日志的最后修改时间,但这不是很干净,我也不确定是完全可靠的。
答案 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上执行此操作的信息。
答案 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)