如何判断 SQL Server 数据库是否仍在使用中?

jsa*_*uni 35 sql-server t-sql

我们希望停用一个 SQL Server 实例,该实例上仍保留有几个数据库。

如何判断用户或 Web 应用程序是否仍在使用它们?

我找到了一个论坛帖子,里面有一个 T-SQL 查询,你可以运行它来检索上次查询日期。它似乎有效,但我想知道此信息是否足够有效以删除数据库。是吗?

如果您有其他方法也有帮助。

小智 32

您将不得不关注已从缓存中清除并遗漏的项目,或不常使用的数据库。

与其立即删除数据库,不如将它们置于 OFFLINE 以防止访问而不删除它们,或者将它们置于 RESTRICTED_USER 模式以限制访问。这样做您可以让它们保持这种状态一两个月,以检查是否偶尔使用。

您还可以考虑在该数据库上使用服务器端分析器跟踪过滤。


SQL*_*tar 14

这些是我过去使用的方法:

  1. 使数据库脱机/分离
  2. 拒绝用户/登录访问
  3. 探查器跟踪

问题是:在确定没有人会访问数据之前,您要等多久?对于财务数据,您有一些项目每天、每周、每月、每季度、每半年和每年运行。但是一年够吗?我还看到要求将数据保留至少 7 年的请求,有一次我被告知,一个系统中的数据需要永远存在,即使没有人使用它。

最好的建议是:无论您做什么来关闭访问,请确保您可以立即重新打开它。我发现分离最适合这个。我会简单地编写重新连接的脚本并指示我的团队“如果有人问它在哪里,请运行此脚本”。这给了我们最好的机会尽快恢复原状。


San*_*ddy 13

我同意 Nic 的建议。如果您需要确定,那么您将不得不使用 Profiler(服务端跟踪),因为某些 SQL 查询不会被缓存,或者出于任何原因可能会清除过程缓存。

我通常还会检查虚拟文件统计信息,以查看是否在操作系统文件级别发生了任何读取或写入。即使数据库未处于活动状态,如果您进行日志备份、完整备份等,您仍然会看到少量读/写……但这也会让您了解该数据库的读/写活动。

在删除任何数据库之前,我会确保您在不同的位置至少有 2 或 3 个可读备份(测试它们)。你永远不知道什么时候需要它们。


小智 9

以下查询显示自上次重新启动以来没有使用的数据库,不依赖于缓存中保存的查询计划,因为它显示了针对索引(和堆)的用户 IO。这有点类似于使用虚拟文件统计信息,但此处使用的 DMV 将 IO 活动排除在备份之外。无需保持分析器跟踪运行,无需触发器或审核。当然,如果您经常重新启动 SQL 服务器(或者您经常附加/关闭数据库),这可能不是正确的方法:-)

话虽如此,仍然同意即使此查询似乎确认可以删除数据库,也一定要脱机/分离或拒绝用户访问一段时间,并在实际删除之前进行任何尽职调查!

select [name] from sys.databases 
where database_id > 4
AND [name] NOT IN 
(select DB_NAME(database_id) 
from sys.dm_db_index_usage_stats
where coalesce(last_user_seek, last_user_scan, last_user_lookup,'1/1/1970') > 
(select login_time from sys.sysprocesses where spid = 1))
Run Code Online (Sandbox Code Playgroud)