Sql server 2005 查找未使用的SQL Server数据库

Sql server 2005 查找未使用的SQL Server数据库,sql-server-2005,Sql Server 2005,有没有办法找到未使用的SQLServer2005数据库 我正在将我的服务器从2005年的32位升级到新服务器实例中的SQL server 2008 x64中。这不是一个简单的方法。我突然想到的几件事是 查看哪些数据库在缓冲池中只有很少的页面 select db.name, COUNT(*) As page_count from sys.databases db LEFT JOIN sys.dm_os_buffer_descriptors bd ON db.database_id = bd.dat

有没有办法找到未使用的SQLServer2005数据库


我正在将我的服务器从2005年的32位升级到新服务器实例中的SQL server 2008 x64中。

这不是一个简单的方法。我突然想到的几件事是

查看哪些数据库在缓冲池中只有很少的页面

select db.name, COUNT(*) As page_count
from sys.databases db LEFT JOIN sys.dm_os_buffer_descriptors bd ON db.database_id = bd.database_id
group by db.database_id, db.name
order by page_count 
或者查看每个数据库的索引使用统计信息

SELECT db.name, 
(SELECT MAX(T) AS last_access FROM (SELECT MAX(last_user_lookup) AS T UNION ALL SELECT MAX(last_user_seek) UNION ALL SELECT MAX(last_user_scan) UNION ALL SELECT MAX(last_user_update)) d) last_access
FROM sys.databases db 
LEFT JOIN sys.dm_db_index_usage_stats iu ON db.database_id = iu.database_id
GROUP BY db.database_id, db.name
ORDER BY last_access 

您还可以使用登录触发器记录正在进行的一段时间的访问,以确保在将“死”数据库切换到脱机状态之前,似乎没有任何东西正在访问这些数据库。

结合使用这些方法中的任何一种,找出哪些数据库仍在使用中

  • 列表连接

    select * from sys.dm_exec_connections
    
  • 列出活动进程

    select * from sys.sysprocesses
    
  • 列表执行统计信息

    select DB_NAME(database_id),  
        max(isnull(isnull(last_user_scan, last_user_update), 
            isnull(last_user_seek, last_system_scan))) 
    from sys.dm_db_index_usage_stats 
    group by DB_NAME(database_id)
    
  • 存储登录时间戳


创建并将内容插入表中以供以后查询,例如,

使用SQL Server 2005,您可以使用动态管理视图sys.dm\u db\u index\u usage\u stats。名称上写着“索引”,但这有点误导——每个表在这里都有一个条目,即使它没有任何索引。下面是来自SQL杂志的一个有用的查询:

SELECT  
  t.name AS 'Table',  
  SUM(i.user_seeks + i.user_scans + i.user_lookups)  
    AS 'Total accesses', 
  SUM(i.user_seeks) AS 'Seeks', 
  SUM(i.user_scans) AS 'Scans', 
  SUM(i.user_lookups) AS 'Lookups' 
FROM  
  sys.dm_db_index_usage_stats i RIGHT OUTER JOIN  
    sys.tables t ON (t.object_id = i.object_id) 
GROUP BY  
  i.object_id,  
  t.name ORDER BY [Total accesses] DESC 
以下是原文:


请记住,当SQL Server重新启动时,这些使用情况统计信息会重置。

请尝试以下操作:如果
last\u access
列为空,则不会发生读取或写入操作:

WITH cte AS (
SELECT database_id, dt, op 
FROM sys.dm_db_index_usage_stats
    UNPIVOT (dt for op in (last_user_lookup, last_user_scan, last_user_seek, last_user_update)) b)
SELECT d.name DB, MAX(c.dt) last_access, MAX(i.sqlserver_start_time) sqlserver_start_time, GETUTCDATE() captured
FROM sys.databases d 
LEFT JOIN cte c ON d.database_id=c.database_id
CROSS JOIN sys.dm_os_sys_info i
WHERE d.database_id>4
GROUP BY d.name 
ORDER BY d.name;

让他们离线-看看谁在抱怨?取决于此服务器是什么,这可能是一种有效的方法(即,对于开发服务器可能,对于实时服务器则不太现实)。但是对于实时服务器,您会得到更快的反馈:)您不应该加入sys.databases而不是表吗?也就是说,选择t.name作为“表”,SUM(I.user_seeks+I.user_scans+I.user_lookups)作为“总访问量”,SUM(I.user_seeks)作为“搜索”,SUM(I.user_scans)作为“扫描”,SUM(I.user_lookups)作为“查找”从sys.dm_db_index_usage_stats I右外部连接sys.databases t打开(t.database_id=I.database_id)按i.database_id分组,t.name按[Total access]排序DESCwow,太好了,我从来没有听说过这个功能。谢谢@Francesco@SeniorSystemsEngineer-听说过什么功能?sys.dm_db_index_usage_stats已在我的答案中。它基本上复制了从last_user_lookup、last_user_scan、last_user_seek、last_user_update中获取最大值的概念(尽管使用unpivot的效率低于我计算每行最大值的方法),并添加了两个问题中未要求的额外列