有什么方法可以找到未使用的 SQL Server 2005 数据库吗?
我正在将我的服务器从 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
您还可以使用登录触发器来记录一段时间内正在进行的访问,以确保在将数据库切换为脱机之前似乎没有任何内容正在访问“死”数据库。
在 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 重新启动时重置。
试试这个:如果
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;
结合使用这些方法中的任何一种来找出哪些数据库仍在使用
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 内容插入到表中以供以后查询,示例这里、这里
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;