我正在寻找有人会遵循的最佳实践或分析来识别我的 SQL Server 上未使用或不活动的数据库。
我浏览了许多文章,其中说可能是为了寻找用户连接和激活跟踪以查找数据库使用情况,但实施这些会造成更多的混乱。
请帮助我了解是否有更好、更安全的方法可以让我的数据库在确定后脱机。
我正在寻找有人会遵循的最佳实践或分析来识别我的 SQL Server 上未使用或不活动的数据库。
我浏览了许多文章,其中说可能是为了寻找用户连接和激活跟踪以查找数据库使用情况,但实施这些会造成更多的混乱。
请帮助我了解是否有更好、更安全的方法可以让我的数据库在确定后脱机。
抱歉,SQL Server 不跟踪数据库使用情况。人们提出了一些不太聪明的想法,例如检查登录的默认数据库和/或 ORIGINAL_DB_NAME() 的登录触发器。但这会遗漏各种事情,例如包含的用户、后来发出 USE 命令的人、跨数据库查询等。
如果您有合适的版本,我的建议是 SQL Server Audit(您的问题很简单)。从我自己关于这个主题的帖子中窃取:
如果您没有企业版,则有一种不太可靠的方法可以做到这一点,那就是检查索引使用统计数据 DMV。您需要经常检查,并且可能需要很长时间,以确保您没有遗漏任何重要信息,因为它仅包含自上次重新启动 SQL Server 以来的数据。
(有一些更简洁的方法来编写这种语法,但我很懒,并且借鉴了我六年前写的代码。)
买者自负
您可以使用这些方法来确定潜在的候选人,但您仍然无法确定明天、下一个业务周期结束时等是否有人不会尝试使用数据库。所以请不要急于求成删除几天没有出现在审计或 DMV 中的数据库 - 这确实不是一个很好的指标,表明该数据库不再被使用。当你认为你找到了要放弃的候选人时,请不要放弃他们。进行适当的完整备份;将其存储在另一台机器上;然后将这些数据库设置为
OFFLINE
:现在,如果某人的应用程序突然中断,或者开发人员丢失了他的工作,或者 CFO 无法运行她的报告,您可以通过一条语句来修复它,而不必恢复备份或简单地告诉他们“运气不好”,因为您甚至没有备份:
首先感谢亚伦,你的解决方案有效!
此外,我还使用了 Kendra Little 博客http://www.brentozar.com/archive/2014/05/4-lightweight-ways-tell-database-used/的提示
包括 Aaron 在内的 4 个提示让我弄清楚并得出了未使用数据库的结论,将它们脱机并且目前没有警报。
这篇文章真的帮了我很多,所以我想我会添加我如何应用 Aaron 的 SQL 和他的使数据库脱机以自动执行此操作的概念。
我的场景:我们有开发和登台服务器,其中数据库被推出但变得不活动并在那里呆了多年。我没有恳求人们“出去把你的非活动数据库删除”,而是创建了一个间歇性地做这件事的工作。
首先,创建这个 proc(可能在 master 或其他地方):
然后调用它,利用未记录的 sp_MSforeachdb proc,也许在每月一次的 SQL 作业中:
我的警告:这是一个开发环境,所以我可以无情,这对我有用。如果不深入了解 dm_db_index_usage_stats DMV 或深入了解 Kendra 检测非活动数据库的其他方法,我不会在生产环境中执行此操作。
试试这个:如果该
last_access
列为空,则没有发生读取或写入: