如何识别我的 sql server 上未使用的数据库

KAS*_*DBA 4 sql-server

我正在寻找某人会遵循的最佳实践或分析来识别我的 SQL Server 上未使用或不活动的数据库。

我浏览了许多文章,其中说可能会寻找用户连接并激活跟踪以查找数据库使用情况,但实现这些会造成更多混乱。

请帮助我了解是否有更好、更安全的方法可以让我的数据库在确定后脱机。

Aar*_*and 7

抱歉,SQL Server 不跟踪数据库使用情况。人们提出了一些不太聪明的想法,例如检查登录和/或 ORIGINAL_DB_NAME() 的默认数据库的登录触发器。但这遗漏了各种各样的东西,比如被包含的用户、后来发出 USE 命令的人、跨数据库查询等。

如果您有合适的版本,我的建议是 SQL Server Audit(您的问题很简单)。从我自己关于这个主题的帖子中窃取:

USE master;
GO
CREATE SERVER AUDIT Test_Server_Audit
    TO FILE ( FILEPATH = 'C:\Audits\' );
GO
ALTER SERVER AUDIT Test_Server_Audit
    WITH (STATE = ON);
GO

USE AdventureWorks;
GO
CREATE DATABASE AUDIT SPECIFICATION Test_Database_Audit
    FOR SERVER AUDIT Test_Server_Audit
    ADD (SELECT ON Person.Address BY PUBLIC)
    WITH (STATE = ON);
GO

SELECT *
    FROM Person.Address;
GO

SELECT * 
    FROM fn_get_audit_file('C:\Audits\*', NULL, NULL);
GO

USE AdventureWorks;
GO
ALTER DATABASE AUDIT SPECIFICATION Test_Database_Audit
    WITH (STATE = OFF);
GO
DROP DATABASE AUDIT SPECIFICATION Test_Database_Audit;
GO
USE master;
GO
ALTER SERVER AUDIT Test_Server_Audit
    WITH (STATE = OFF);
GO
DROP SERVER AUDIT Test_Server_Audit;
GO
Run Code Online (Sandbox Code Playgroud)

如果您没有企业版,则有一种不太可靠的方法来执行此操作,即检查索引使用情况统计 DMV。您需要经常并可能长时间检查以确保您没有遗漏任何重要信息,因为它只包含自上次重新启动 SQL Server 以来的数据。

SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
GO

;WITH agg AS
(
    SELECT 
        last_user_seek,
        last_user_scan,
        last_user_lookup,
        last_user_update
    FROM
        sys.dm_db_index_usage_stats
    WHERE
        database_id = DB_ID()
)
SELECT
    last_read = MAX(last_read),
    last_write = MAX(last_write)
FROM
(
    SELECT last_user_seek, NULL FROM agg
    UNION ALL
    SELECT last_user_scan, NULL FROM agg
    UNION ALL
    SELECT last_user_lookup, NULL FROM agg
    UNION ALL
    SELECT NULL, last_user_update FROM agg
) AS x (last_read, last_write);
Run Code Online (Sandbox Code Playgroud)

(有一些更简洁的方法来编写该语法,但我很懒惰,并且借用了我六年多前编写的代码。)


买者自负

你可以用这些方法来确定潜在的候选人,但你仍然不能确定明天、下一个商业周期结束时有人不会尝试使用数据库,所以请不要着急删除几天内未出现在审计或 DMV 中的数据库 - 这确实不是数据库不再被使用的好指标。当你认为你找到了要放弃的候选人时,请不要放弃他们。进行适当的完整备份;将其存储在另一台机器上;然后将这些数据库设置为OFFLINE

ALTER DATABASE whatever SET OFFLINE;
Run Code Online (Sandbox Code Playgroud)

现在,如果某人的应用程序突然中断,或者开发人员丢失了他的工作,或者 CFO 无法运行她的报告,您可以使用单个语句修复它,而不必恢复备份或简单地告诉他们“运气不好”,因为您甚至没有备份:

ALTER DATABASE whatever SET ONLINE;
Run Code Online (Sandbox Code Playgroud)