为什么我的数据库 .mdf 文件大小突然增加?

Mak*_*lam 3 sql-server database-size service-broker

突然我的数据库 .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;
Run Code Online (Sandbox Code Playgroud)

它显示了这个结果:

在此处输入图片说明

我有一个服务经纪人。

任何删除或如何最小化 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_enabled0,激活过程 - NULL
  • dbo_Attendances_ee941a6a-d4e9-484c-b3d6-4922604ec585_Sender有 0 行 is_retention_enabled0 和激活程序[dbo].[dbo_Attendances_ee941a6a-d4e9-484c-b3d6-4922604ec585_QueueActivationSender]

Dan*_*man 12

消息将保留在 Service Broker 队列中,直到它们被使用RECEIVE或关联的对话以 结束END CONVERSATIONRECEIVE如果队列设置为 ,消息也将保留在队列中,直到对话结束RETENTION = ON

大量消息表明应用程序或激活的存储过程可能存在问题,消息未正确出列。另一个可能的原因是队列被禁用。

下面的查询将返回每个队列的消息计数以及队列设置以确定后续步骤。

SELECT
      sch.name
    , sq.name
    , p.rows
    , sq.is_receive_enabled
    , sq.is_enqueue_enabled
    , sq.is_retention_enabled
    , sq.is_activation_enabled
    , sq.activation_procedure
FROM sys.service_queues AS sq
JOIN sys.schemas AS sch ON sch.schema_id = sq.schema_id
JOIN sys.internal_tables AS it ON it.parent_object_id = sq.object_id
JOIN sys.partitions AS p ON p.object_id = it.object_id
WHERE p.index_id = 1;
Run Code Online (Sandbox Code Playgroud)

鉴于端点很少,队列中似乎只有一个长时间运行的对话,因此排除了对话泄漏的原因。此外,由于没有与问题队列关联的激活过程,您应该联系您的应用团队以确定为什么没有读取消息。

话虽如此,如果您知道消息实际上并不需要,您可以使用 T-SQL 脚本使消息出列。下面的示例脚本分批执行此操作以避免填满日志。在完全恢复模式的情况下,确保日志足够大以容纳在日志备份之间删除的消息。

SET NOCOUNT ON;
DECLARE 
      @conversation_handle uniqueidentifier
    , @BatchSsize int = 100000
    , @MessagesDeleted int = -1;
WHILE @MessagesDeleted <> 0
BEGIN
    RECEIVE TOP (@BatchSsize) @conversation_handle = conversation_handle
        FROM [dbo_Attendances_ee941a6a-d4e9-484c-b3d6-4922604ec585_Receiver];
    SET @MessagesDeleted = @@ROWCOUNT;
    RAISERROR('%d messages deleted this batch', 0, 0, @MessagesDeleted) WITH NOWAIT;
END;
GO
Run Code Online (Sandbox Code Playgroud)