查找未使用的SQL Server数据库

时间:2011-02-02 22:40:06

标签: sql-server-2005

有没有办法找到未使用的SQL Server 2005数据库?

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

4 个答案:

答案 0 :(得分:4)

不是万无一失的方式。我想到的一些事情是。

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

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 

您还可以使用登录触发器记录一段时间内正在进行的访问,以确保在脱机之前没有任何内容正在访问“死”数据库。

答案 1 :(得分:3)

使用SQL Server 2005,您可以使用动态管理视图sys.dm_db_index_usage_stats。这个名称是“索引”,但这有点误导 - 每个表都有一个条目,即使它没有任何索引。这是SQL Magazine的一个有用的查询:

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 

以下是原始文章:

http://www.sqlmag.com/Article/ArticleID/53878/sql_server_53878.html

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

答案 2 :(得分:1)

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

  • 列出连接

    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)
    
  • 存储LOGON时间戳

创建LOGON TRIGGER并将EVENTDATA内容插入表格以供稍后查询,示例herehere

答案 3 :(得分:1)

试试这个:如果 last_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;