非活动数据库

时间:2010-02-03 17:22:57

标签: sql-server database

在我们公司的SQL服务器上,有许多数据库似乎没有被使用。有没有办法确定上次有人使用特定数据库,连接到它或对其运行查询?

2 个答案:

答案 0 :(得分:3)

我认为上次使用的日期没有每个数据库的统计信息。

您可以做的是将SQL Server探查器附加到数据库,并在数据库名称上附加过滤器。你可以让它运行几周,看看是否有任何活动。

另一种选择是检查数据库属性 - >报告 - >标准报告 - >索引使用统计。如果任何索引的最后一次使用都很旧,那么很好地表明数据库没有被使用。

或者,看看SQL Server Auditing。我自己没有用它,但看起来它可能适合你的需要。

答案 1 :(得分:1)

这实际上是我使用的查询。它告诉您自上次重启以来最后使用的数据库。它给出了上次使用的日期和自上次使用以来的日期。这应该是你需要的。它是动态的,可以在任何服务器上运行,因为它使用系统视图。在主数据库上运行它。

DECLARE @RESTART DATETIME

SELECT @RESTART = login_time 
FROM sysprocesses 
WHERE spid = 1 

SELECT @@SERVERNAME AS SERVER_NAME
,DB_NAME(db.database_id) AS 'DATABASE'
, db.state_desc AS 'State'
, @RESTART AS 'SYSTEM_RESTART'
, MAX(coalesce(us.last_user_seek, us.last_user_scan,     us.last_user_lookup,@RESTART)) AS 'LAST_USE'
,CASE 
WHEN DATEDIFF(DAY,@RESTART, MAX(coalesce(us.last_user_seek, us.last_user_scan, us.last_user_lookup,@RESTART))) = 0 
THEN 'Prior to restart ' + CONVERT(VARCHAR(5),DATEDIFF(DAY,MAX(coalesce(us.last_user_seek, us.last_user_scan, us.last_user_lookup,@RESTART)), CURRENT_TIMESTAMP)) +' days ago'
ELSE CONVERT(VARCHAR(5),DATEDIFF(DAY,MAX(coalesce(us.last_user_seek, us.last_user_scan, us.last_user_lookup,@RESTART)), CURRENT_TIMESTAMP))
END AS 'DAYS_SINCE_LAST_USE'
FROM sys.databases db
LEFT OUTER JOIN sys.dm_db_index_usage_stats us ON db.database_id = us.database_id
/* IF you want to exclude offlinbe Dbs in your output
   then remove the comment '--AND STATE != 6' below. 
*/
WHERE db.database_id > 4 --AND STATE != 6
GROUP BY DB_NAME(db.database_id), db.state_desc 
ORDER BY DB_NAME(db.database_id)