突然我的数据库 .mdf 文件大小增加到超过 250GB,但我的总表数据大小计数仅为 4GB。我做了数据收缩,但没有结果。然后我做了下面的查询:
SELECT sch.[name], obj.[name], ISNULL(obj.[type_desc], N'TOTAL:') AS [type_desc],
COUNT(*) AS [ReservedPages],
(COUNT(*) * 8) / 1024.0 / 1024.0 AS [ReservedGB]
FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, DEFAULT) pa
INNER JOIN sys.all_objects obj
ON obj.[object_id] = pa.[object_id]
INNER JOIN sys.schemas sch
ON sch.[schema_id] = obj.[schema_id]
GROUP BY GROUPING SETS ((sch.[name], obj.[name], obj.[type_desc]), ())
ORDER BY [ReservedPages] DESC;
它显示了这个结果:
我有一个服务经纪人。
任何建议删除或如何最小化 queue_message 表大小?
SELECT COUNT(*) FROM sys.conversation_endpoints;
从这里开始计数为 7,Dan 的答案中的查询返回 4 activation_procedure 和 4 返回 NULL。
dbo_Attendances_ee941a6a-d4e9-484c-b3d6-4922604ec585_Receiver
有 361840332 行,is_retention_enabled
0,激活过程 - NULLdbo_Attendances_ee941a6a-d4e9-484c-b3d6-4922604ec585_Sender
有 0 行is_retention_enabled
0 和激活过程[dbo].[dbo_Attendances_ee941a6a-d4e9-484c-b3d6-4922604ec585_QueueActivationSender]
消息将保留在 Service Broker 队列中,直到它们被使用
RECEIVE
或关联的对话以 结束END CONVERSATION
。RECEIVE
如果队列设置为 ,则消息也将保留在队列中,直到对话结束RETENTION = ON
。大量消息表明应用程序或激活的存储过程可能存在问题,其中消息未正确出列。另一个可能的原因是队列被禁用。
下面的查询将返回每个队列的消息计数以及队列设置以确定下一步。
鉴于少数端点,似乎队列中只有一个长时间运行的对话,因此排除了对话泄漏的原因。此外,由于没有与问题队列相关联的激活过程,您应该联系您的应用团队以确定未读取消息的原因。
话虽如此,如果您知道实际上不需要消息,则可以使用 T-SQL 脚本将消息出列。下面的示例脚本分批执行此操作以避免填充日志。在完全恢复模式的情况下,确保日志足够大以容纳在日志备份之间删除的消息。