我们正在寻求退役一个SQL Server实例,该实例仍然保留了几个数据库。

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

我找到了 论坛线程 带有T-SQL查询的您可以运行以检索最后一个查询日期。它似乎有效,但我想知道此信息是否足够有效,可以删除数据库。是吗?

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

有帮助吗?

解决方案

您必须关注从缓存和错过的项目或使用不经常使用的数据库的项目。

与其将数据库从手工上删除,要么离线以防止访问而不将其丢弃或处于限制性_user模式以限制访问权限。这样做,您可以将它们留在该州一两个月以进行检查,看看是否偶尔有使用。

您还可以在该数据库上使用服务器端剖面图跟踪过滤。

其他提示

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

  1. 将数据库离线/分离
  2. 拒绝用户/登录访问
  3. Profiler Trace

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

最好的建议是:无论您采取的措施如何关闭访问权限,请确保您可以立即重新打开它。我发现detatch为此做得最好。我只是简单地脚本录制了Reattach,并指示我的团队“如果有人问它在哪里,请运行此脚本”。这使我们有最好的机会尽快将事情放回原处。

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

通常,我还会检查虚拟文件统计信息,以查看在OS文件级别是否有任何读取或写入。即使数据库不活跃,如果您要进行日志备份,完整的备份等,您仍然会看到一个小的读取/写入...但是,这也将使您有一个在该数据库上读取/写入活动的想法。

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

以下查询显示自上次重新启动以来没有用法的DB,而不依赖于缓存中保存的查询计划,因为它显示了用户IO对索引(和堆)。这是一种使用虚拟文件统计数据的行,但是此处使用的DMV不包括备份中的IO活动。无需保持参考器跟踪运行,无需触发或审核。当然,如果您经常重新启动SQL Server(或经常附加/关闭数据库),这可能不是要走的方法:-)

话虽如此,但仍然同意,即使此查询似乎可以确认可以删除数据库, 确实 在一段时间内进行离线/分离或拒绝用户访问权限,并在实际掉落之前提出任何要求的尽职调查!

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))

我在一个拥有大量孤立和半脑数据库的地方工作。很难说他们是否真的是孤儿这些仅从1月中旬到4月底)。

所做的是:
*询问每个开发人员是否正在使用某些数据库或另一个数据库(这些电子邮件每月或每当备份花费太长时间时出现)。
*脱机数据库,看看谁抱怨。
*重命名服务器以查看谁抱怨。

由于尖头头发的老板只愿意允许“完整而完整的”文档,因此明确禁止Wiki,并且工作人员减少导致符合该标准的文件急剧下降。

如果由我决定,则每个服务器将有一个Wiki页面,每个数据库的联系人名称(也许是数据库的用途)。 Wiki上未记录的任何数据库都将是删除的公平游戏。

直到2009年,我们仍有一个仍在使用SQL Server 2000的大型财务客户端,因此我们必须保持一个SQL Server 2000实例运行,直到该客户端最终移至SQL Server 2005。

另外两个选择是:

  1. 在DB上创建触发器,以将任何活动通知您(或存储到表格)。
  2. 在DBS上启用审核。

    • 取决于您的DB版本。

下一个解决方案显示了您实例下的特定数据库中MB中的临时总数,干净和肮脏的页面(在Internet上找到并进行了一些修改):

SELECT
    (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
    COUNT(*) *8/1024 AS [TotalPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) *8/1024 AS [CleanPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) *8/1024 AS [DirtyPages in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DB_NAME(database_id)

或者

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
where  attribute = 'dbid' 
order by last_execution_time desc

或者

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
--where dbid=8
where 
      text like '%idAdministrator%' and
      attribute = 'dbid' 
      and value>= 5 -- dbid >=5 for user databases but include resource database which
                     --you can exclude by its numer I don't remember at the moment
order by last_execution_time desc
许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top