查找未使用的 SQL Server 数据库

问题描述 投票:0回答:5

有什么方法可以找到未使用的 SQL Server 2005 数据库吗?

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

sql-server-2005
5个回答
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 

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


3
投票

在 SQL Server 2005 中,您可以使用动态管理视图 sys.dm_db_index_usage_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 

原文如下:

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

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


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;

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 TRIGGER 并将 EVENTDATA 内容插入到表中以供以后查询,示例这里这里


0
投票
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 'ServerName'= @@SERVERNAME,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 JOINsys.dm_os_sys_info i WHERE d.database_id>4 GROUP BY d.name ORDER BY d.name;
    
© www.soinside.com 2019 - 2024. All rights reserved.