Sql server 2005 查找未使用的SQL Server数据库
有没有办法找到未使用的SQLServer2005数据库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
我正在将我的服务器从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的效率低于我计算每行最大值的方法),并添加了两个问题中未要求的额外列