我SQL Server 2012 (11.0.6540.0)
与另一台服务器在 AO 高可用性组中运行。
tempDB 的使用量通常约为 819MB(与 2 周前相比平均超过一周),但自从我们进行了故障转移和补丁循环后,tempDB 开始逐渐增长(此时没有进行 DDL 更改)。我们刚刚完成了测试故障转移,并将 tempDB 移出了两台机器都可以访问的联合 SAN 驱动器(我们不希望一个硬件可以同时关闭我们的主副本和辅助副本)。
最近的故障转移和实例重启(移动 tempDB)看到 tempDB 使用量跃升至 6348MB,并且增长缓慢。
增长全部在内部对象上,可以使用以下方式看到:
SELECT top 5 session_id, request_id,
SUM(internal_objects_alloc_page_count) AS request_internal_objects_alloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id, request_id
ORDER BY request_internal_objects_alloc_page_count DESC
调查一下,这一切都是从 spid 35 和 32 运行的,它们都与服务代理相关。
我环顾四周,有人说这是因为有WITH CLEANUP
一个结束对话,但清理这个词只出现在评论中,所以我相信这不是问题所在。
当实例恢复并接管主节点时,服务代理不工作所以我需要将所有队列循环到禁用然后启用状态(我们不得不在一年前这样做一次但没有请参阅此问题)。
您可以在此处查看过去 4 天内对 tempDB 的使用情况。今天早上的下降是实例重启和故障转移。
有谁知道我缺少什么来控制它。
TLDR; 检查对话是否完全打开。
在我们的系统中,我们重复使用对话并有一个专门用于保存这些可用对话的表格,但是开发团队在我不知情的情况下设置了一个新的服务代理,而我很久以前就离开了,没有设置这些对话点并且没有' 设置警报的任何阈值。
当新系统打开时,对话正在打开但没有正确关闭,因为池中没有任何对话,它只是在创建一个新对话(我们为一个服务经纪人达到了 710 万个对话)
我的修复步骤是创建并记录该服务代理所需的 20 个对话处理程序,并将它们记录到我们的表中。这阻止了 tempDB 的增长,以阻止数据库下降的风险。
然后是关闭所有未使用的对话的漫长过程
通过这些值给出所有 ID 游标的列表,并简单地
END CONVERSATION @id;
在它们中的每一个上运行。该过程完成后,临时数据库空间将松动(请注意,当您关闭它们时它不会这样做,当您不再致力于创建/结束它们时,它似乎会大块地进行(我不能保证这是它是如何工作的,正是我在停止中间进程和 tempDB 获得一些空间后观察到的)