有没有办法找到未使用的SQL Server 2005数据库?
我正在从2005年的32位升级并将我的服务器迁移到新服务器实例中的SQL Server 2008 x64。
答案 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内容插入表格以供稍后查询,示例here,here
答案 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;