Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Problemas de espaço insuficiente no RDS for SQL Server

Última atualização: Jun 26, 2026

A falta de armazenamento em uma instância do RDS for SQL Server pode causar falhas de gravação e impedir a conclusão de backups. Este tópico explica como identificar qual tipo de arquivo está consumindo espaço e como recuperar ou expandir o armazenamento.

Conceitos de espaço de armazenamento

Antes de solucionar problemas, entenda o significado dos indicadores de espaço:

Conceito

Definição

Observações

Espaço de dados utilizado

Espaço ocupado pelos dados reais armazenados nos arquivos de banco de dados

Aumenta com inserções. Pode não diminuir após exclusões se o espaço alocado for mantido.

Espaço de dados alocado

Espaço de arquivo formatado e reservado para uso do banco de dados

Cresce automaticamente. Não diminui após exclusões, a menos que você execute uma operação de redução.

Espaço de dados alocado, mas não utilizado

Diferença entre o espaço alocado e o utilizado

Quantidade máxima recuperável ao reduzir os arquivos de dados.

Tamanho total do arquivo

Tamanho em disco dos arquivos de dados ou de log

Exibido nas métricas do console e em sys.master_files. Inclui espaço alocado e não alocado.

Importante

As métricas do console e a maioria das APIs de monitoramento relatam o tamanho do arquivo (alocado), e não o uso real de dados. Para visualizar ambos os valores simultaneamente, consulte sys.dm_db_file_space_usage ou sys.master_files. Essa distinção determina se a redução liberará uma quantidade significativa de espaço.

Visualizar o uso de espaço

Utilize qualquer um dos métodos abaixo para verificar o uso atual de espaço:

  • Método 1 — Página Basic Information: Exibe apenas o uso total atual de espaço. Não apresenta detalhamento por tipo de arquivo ou tendências históricas.

    Basic Information

  • Método 2 — Monitoring and Alerts > Standard Monitoring: Mostra o espaço em disco dividido por tipo de arquivo (dados, log, temporário, outros) e tendências históricas. Para definições de métricas, consulte Visualizar monitoramento padrão.

    Monitoring and Alerts

  • Método 3 — Autonomy Services > Storage Management: Fornece um detalhamento completo, incluindo uso de dados versus log, tendências históricas e alocação de espaço para os principais bancos de dados e tabelas. Para mais informações, consulte Gerenciamento de espaço.

    O Storage Management não está disponível para instâncias executando SQL Server 2008 R2 com discos em nuvem.

    Storage Management

  • Método 4 — SQL Server Management Studio (SSMS) ou outra ferramenta cliente: Conecte-se diretamente à instância e execute consultas T-SQL. Para instruções de conexão, consulte Conectar-se a uma instância do RDS for SQL Server usando um cliente SSMS.

Os comandos T-SQL a seguir são frequentemente utilizados para inspecionar o uso de espaço:

Comando ou view

O que exibe

sp_helpdb

Tamanho total (arquivos de dados + arquivos de log) para cada banco de dados

sp_spaceused

Nome, espaço utilizado e espaço não alocado do banco de dados atual

DBCC SQLPERF(LOGSPACE)

Tamanho total do arquivo de log e espaço de log utilizado para cada banco de dados

DBCC SHOWFILESTATS

Espaço de dados total e utilizado para todos os arquivos de dados no banco de dados atual

SELECT * FROM sys.master_files

Tamanhos dos arquivos de dados e de log para cada banco de dados

SELECT * FROM sys.dm_db_log_space_usage

Espaço de log total e utilizado para o banco de dados atual. Apenas SQL Server 2012 e versões posteriores.

SELECT * FROM sys.dm_db_file_space_usage

Espaço de arquivo de dados total e utilizado para o banco de dados atual. Apenas SQL Server 2012 e versões posteriores.

Caso o uso de espaço esteja elevado, acesse Monitoring and Alerts no console do RDS e verifique qual tipo de arquivo está crescendo mais rapidamente — dados, log, temporário ou outros. Em seguida, siga a seção relevante abaixo.

Recuperar espaço de dados

Análise da causa

O banco de dados tempdb é um banco de dados de sistema do SQL Server que armazena dados temporários. O espaço de arquivo de dados no tempdb é frequentemente utilizado em diversos cenários, tais como:

  • Objetos de usuário: Tabelas temporárias criadas por usuários.

  • Objetos internos: Tabelas temporárias geradas internamente pelo SQL Server.

  • Armazenamento de versões: Quando o isolamento de snapshot ou o snapshot de leitura confirmada está habilitado para um banco de dados, as informações de versionamento são armazenadas no tempdb.

Se determinadas operações, como transações longas, criação de muitas tabelas temporárias ou isolamento de snapshot, utilizarem uma grande quantidade de espaço, o arquivo de dados pode ficar inchado. Isso significa que o tamanho do arquivo cresce significativamente além de seu intervalo normal. Para mais informações, consulte o tutorial oficial da Microsoft sobre o banco de dados tempdb.

Soluções

Um banco de dados do RDS for SQL Server contém arquivos de dados e arquivos de log. Os métodos para recuperar espaço em cada um são os seguintes:

Recuperação de espaço de arquivo de dados

Se o espaço do arquivo de dados do tempdb crescer muito, usar o comando SHRINKFILE para reduzi-lo não é muito eficaz. Em vez disso, reinicie a instância fora do horário de pico para liberar espaço do tempdb, conforme descrito no tutorial oficial da Microsoft (Reduzir o banco de dados tempdb).

Use as soluções a seguir para analisar o uso de espaço dos arquivos de dados do tempdb:

Cenário 1: O espaço do arquivo de dados do tempdb está grande

  1. Se uma grande quantidade de espaço do arquivo de dados do tempdb estiver em uso, execute a seguinte instrução SQL. Utilize a view de sistema sys.dm_db_file_space_usage para verificar o espaço do tempdb utilizado por diferentes tipos de objetos (Objetos de Usuário, Objetos Internos e Armazenamento de Versões):

    Para mais informações sobre como usar sys.dm_db_file_space_usage, consulte o tutorial oficial da Microsoft.

    SELECT 
        SUM(version_store_reserved_page_count) AS [version store pages used], 
        (SUM(version_store_reserved_page_count) * 1.0 / 128) AS [version store object space in MB], 
        SUM(user_object_reserved_page_count) AS [user object pages used], 
        (SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB], 
        SUM(internal_object_reserved_page_count) AS [internal_object pages used], 
        (SUM(internal_object_reserved_page_count) * 1.0 / 128) AS [internal_object space in MB] 
    FROM 
        sys.dm_db_file_space_usage;
  2. Se Objetos de Usuário ou Objetos Internos estiverem utilizando uma grande quantidade de espaço:

    1. Execute a seguinte instrução SQL. Use a view de sistema sys.dm_db_session_space_usage para identificar quais sessões estão utilizando muito espaço do tempdb:

      Para mais informações sobre como usar sys.dm_db_session_space_usage, consulte o tutorial oficial da Microsoft.

      SELECT 
          session_id, 
          SUM(user_objects_alloc_page_count) AS [user object pages used], 
          (SUM(user_objects_alloc_page_count) * 1.0 / 128) AS [user object space in MB], 
          SUM(internal_objects_alloc_page_count) AS [internal_object pages used], 
          (SUM(internal_objects_alloc_page_count) * 1.0 / 128) AS [internal_object space in MB] 
      FROM 
          sys.dm_db_session_space_usage 
      GROUP BY 
          session_id;
    2. Utilize o ID da sessão retornado para consultar a instrução SQL que a sessão está executando atualmente:

      SELECT 
          r.session_id AS [SPID], 
          r.start_time AS [Start Time], 
          r.status AS [Status], 
          r.command AS [Command Type], 
          r.wait_type AS [Wait Type], 
          r.wait_time AS [Wait Time (ms)], 
          r.last_wait_type AS [Last Wait Type], 
          t.text AS [Executing Statement] 
      FROM 
          sys.dm_exec_requests r 
      CROSS APPLY 
          sys.dm_exec_sql_text(r.sql_handle) t 
      WHERE 
          r.session_id = xxx; ---xxx is the session_id from the previous step
  3. Se o Armazenamento de Versões estiver utilizando muito espaço, o banco de dados pode estar com o isolamento de snapshot habilitado. Isso faz com que muitas versões de snapshot sejam armazenadas no tempdb.

    1. Consulte quais bancos de dados têm o isolamento de snapshot habilitado:

      SELECT 
          name, 
          is_read_committed_snapshot_on, 
          snapshot_isolation_state 
      FROM sys.databases;

      Se o valor do campo is_read_committed_snapshot_on ou snapshot_isolation_state for 1, o banco de dados correspondente tem o isolamento de snapshot habilitado, conforme mostrado na figura a seguir:

      image

    2. Use a view de sistema sys.dm_tran_active_snapshot_database_transactions para verificar sessões com transações longas que não foram confirmadas. Essas transações impedem que os registros no Armazenamento de Versões sejam limpos automaticamente:

      SELECT * FROM sys.dm_tran_active_snapshot_database_transactions ORDER BY elapsed_time_seconds DESC;

      Os detalhes são os seguintes:

      image

    3. Após obter o session_id, consulte sys.sysprocesses e sys.dm_exec_requests/sys.dm_exec_sql_text para verificar o status da sessão e o comando executado:

      SELECT * FROM sys.sysprocesses WHERE spid = xxx;  --spid is the session_id from the previous step

      Os detalhes são os seguintes:

      image

    4. Se o status da sessão for sleeping, use o seguinte comando SQL para verificar a instrução executada:

      DBCC INPUTBUFFER(xxx);  --xxx is the session ID (spid) from the previous step

      Os detalhes são os seguintes:

      image

Cenário 2: Investigar a causa do crescimento passado do espaço do tempdb após uma reinicialização

Se os dados em tempo real não estiverem disponíveis, analise o problema usando Sessões Ativas Médias (AAS), logs de consultas lentas e logs de auditoria. Siga os passos abaixo:

  1. Analise os horários de início e fim do crescimento do espaço do tempdb

    Primeiro, analise a tendência de crescimento do uso de espaço do tempdb. Na página de detalhes da instância, acesse Monitoring and Alerts > Standard Monitoring. Na seção Instance Storage, anote os horários de início e fim em que a métrica tmp_size aumentou. Quando uma operação SQL começa, o tempdb ainda pode ter espaço livre disponível que é reutilizado primeiro. Portanto, o momento real da expansão do espaço pode ser posterior ao início da operação SQL. O sistema aciona uma operação de expansão de arquivo para alocar novo espaço de armazenamento somente depois que o espaço existente no tempdb se esgota.

    image

  2. Analise usando AAS (Sessões Ativas Médias)

    Na página de detalhes da instância, acesse Autonomy Service > Performance Optimization > Performance Insight. Selecione o período de tempo alvo. Estenda o início do intervalo de tempo para garantir a captura de todas as operações relacionadas. Analise os registros de execução de SQL nesse período para identificar quaisquer operações que utilizem intensivamente tabelas temporárias baseadas em disco.

    Por exemplo, verifique a criação e o uso de tabelas temporárias como #RKD_SJ. O uso frequente dessas tabelas temporárias pode ser uma das principais causas do crescimento do espaço do tempdb.

    image

  3. Analise filtrando logs de consultas lentas por palavras-chave

    Na página de detalhes da instância, acesse Autonomy Service > Slow Query Logs. Filtre os logs de consultas lentas por palavra-chave. Verifique o tempo de execução e o horário de início do SQL. Analise se o horário de término da consulta corresponde ao momento em que o espaço do tempdb parou de crescer.

    image

Recuperação de espaço de arquivo de log

Se o espaço do arquivo de log do tempdb crescer muito, geralmente é porque uma transação longa impede o truncamento do log. Recupere o espaço da seguinte forma:

  1. Verifique o tipo de espera de reutilização de log no campo log_reuse_wait_desc de sys.database. Se o tipo de espera de reutilização de log for ACTIVE_TRANSACTION, existe uma transação longa.

  2. Identifique quais transações longas estão em execução no banco de dados tempdb. Após encerrar as transações longas, use SHRINKFILE para reduzir o arquivo de log.

Use as soluções a seguir para analisar o uso de espaço dos arquivos de log do tempdb:

  1. Primeiro, verifique o status do arquivo de log do banco de dados.

    Nos resultados da execução, verifique o status do espaço de log do tempdb. Se LogReuseWaitDescription for NOTHING, reduza o arquivo de log diretamente com SHRINKFILE. Se o valor não for NOTHING, como o valor comum ACTIVE_TRANSACTION, existe uma transação longa ativa. Encerre a transação longa antes de reduzir o arquivo de log com SHRINKFILE.

    SELECT
    name AS [DatabaseName],
    recovery_model_desc AS [RecoveryModel],
    log_reuse_wait_desc AS [LogReuseWaitDescription]
    FROM sys.databases;

    image

  2. O crescimento do arquivo de log do tempdb é frequentemente causado por transações longas ativas. Use o seguinte comando SQL para verificar a transação mais longa no banco de dados tempdb e decida se deve encerrá-la:

    USE tempdb;
    GO
    DBCC OPENTRAN;
    GO

    Conforme mostrado na figura a seguir, anote o ID da sessão (SPID) e o horário de início da transação (Start time):

    image

  3. Em seguida, verifique o que a sessão está fazendo e seu status. Use o ID da sessão da etapa anterior:

    SELECT * FROM sys.sysprocesses WHERE spid = xxx;--spid is the SPID from the previous step

    Por exemplo:

    image

  4. Se o status da sessão for sleeping, use o seguinte comando SQL para verificar a instrução executada:

    DBCC INPUTBUFFER(xxx);  --xxx is the session ID (spid) from the previous step

    A figura a seguir mostra um exemplo.

    image

Como funciona o espaço de dados

O espaço total de dados equivale à soma de todos os tamanhos de arquivos de dados, divididos em duas partes:

  • Espaço alocado: Espaço atribuído a tabelas ou índices. Inclui tanto linhas com dados quanto páginas reservadas para futuras inserções na mesma tabela ou índice. Outros objetos não podem usar esse espaço diretamente.

  • Espaço não alocado: Extensões completamente livres (cada extensão é 64 KB de espaço contíguo) não associadas a nenhum objeto. Reduzir um arquivo libera esse espaço de volta para o sistema operacional.

Se os dados ainda estiverem crescendo, o espaço não alocado geralmente é pequeno. Reduzir arquivos diretamente tem pouco efeito. Recupere primeiro o espaço alocado e depois considere a redução.

Recuperar espaço alocado

Arquivar ou excluir dados

Exclua ou migre dados acessados com pouca frequência — por exemplo, registros históricos antigos — para outra instância ou formato de arquivamento. Isso reduz diretamente o espaço de dados utilizado e é a solução de longo prazo mais eficaz, embora exija alterações na lógica da aplicação e no design do banco de dados.

Comprimir dados

Instâncias executando SQL Server 2016 ou posterior, e instâncias Enterprise Edition executando versões anteriores, suportam compactação de linha e página no nível de tabela, índice ou partição. Para detalhes, consulte Compactação de dados.

A economia varia amplamente (10–90%) dependendo do esquema, tipos de colunas e distribuição de dados. Use sp_estimate_data_compression_savings para estimar a economia antes de ativar a compactação.

Alterar configurações de compactação é uma operação de Linguagem de Definição de Dados (DDL). Em tabelas grandes, isso pode causar bloqueios de tabela prolongados. Execute fora do horário de pico.
Em instâncias Enterprise Edition, defina ONLINE = ON para minimizar o impacto nos negócios.
A compactação aumenta a sobrecarga da CPU. Ative-a apenas em tabelas grandes onde a economia de espaço justifique o custo.

Desfragmentar índices

A alta fragmentação de índices torna as consultas lentas e desperdiça armazenamento. Para visualizar as taxas de fragmentação, acesse Autonomy Services > Performance Optimization e clique em Index Usage. O console mostra a taxa de fragmentação por tabela e sugere se deve reconstruir ou reorganizar cada índice.

A taxa de fragmentação de índice mede a porcentagem de páginas de índice logicamente adjacentes que não são fisicamente adjacentes. Isso difere da porcentagem de espaço livre dentro das páginas. Para medir o espaço livre médio por página, consulte sys.dm_db_index_physical_stats no modo SAMPLED ou DETAILED e verifique a coluna avg_page_space_used_in_percent . Para detalhes, consulte sys.dm_db_index_physical_stats (Transact-SQL) . Essa consulta lê muitas páginas de índice — execute-a fora do horário de pico.

Reconstrução de índice (REBUILD): Recria completamente o índice. Mais eficaz do que reorganizar para índices com alta fragmentação. Por padrão, bloqueia a tabela durante a operação. Em instâncias Enterprise Edition, defina ONLINE = ON para evitar bloqueios longos de tabela.

Importante

Uma reconstrução aumenta temporariamente o armazenamento do banco de dados e o tamanho do log significativamente. Antes de reconstruir, verifique se a instância tem espaço de armazenamento livre de pelo menos duas vezes o tamanho do índice sendo reconstruído.

  • Verifique o espaço livre: acesse a página Basic Information da instância e observe a seção Instance Resources.

  • Se o espaço livre for insuficiente, expanda o armazenamento primeiro. O novo espaço entra em vigor imediatamente sem reinicialização.

ALTER INDEX <IX_YourIndexName> ON <YourTableName> REBUILD WITH (ONLINE = ON);

Após a reconstrução, o console atualiza as estatísticas do índice de forma assíncrona. Clique em Recollect para obter os dados mais recentes e, em seguida, clique em Export Script para baixar e verificar a taxa de fragmentação.

Index Usage

Reorganização de índice (REORGANIZE): Reestrutura as páginas de nível folha sem bloquear a tabela. Menos eficaz que a reconstrução, mas apropriada para índices com baixa fragmentação.

Reduzir arquivos de dados

Após recuperar o espaço alocado usando os métodos acima, utilize uma das abordagens a seguir se a pressão de armazenamento persistir.

Importante

Uma única operação de redução em grande escala pode causar crescimento significativo do log de transações e bloqueio prolongado. Use o Método 1 para reduzir em pequenos lotes.

Método 1 — Loop de redução incremental (recomendado)

Reduza em iterações de aproximadamente 5 GB cada. O script a seguir aplica-se ao SQL Server 2012 e versões posteriores:

-- This script applies only to SQL Server 2012 and later versions. Specify the following parameters before running.
DECLARE @dbName NVARCHAR(128) = 'YourDBName'  -- Database name
DECLARE @fileName NVARCHAR(128)               -- Data file name
DECLARE @targetSize INT = 2000                -- Target size (MB)
DECLARE @shrinkSize INT = 5120                -- Size to shrink per iteration (MB). 5 GB recommended.
DECLARE @currentSize INT                      -- Current file size
DECLARE @freeSize INT                         -- Unallocated space
DECLARE @usedSize INT                         -- Used space

DECLARE @sql NVARCHAR(500)
DECLARE @waitTime INT = 10                    -- Wait between iterations (seconds)

-- Get the data file name
SELECT @fileName = name
FROM sys.master_files
WHERE database_id = DB_ID(@dbName)
AND type_desc = 'ROWS'

-- Shrink in a loop
WHILE 1 = 1
BEGIN
    -- Get current size and space breakdown
    DECLARE @sql0 NVARCHAR(MAX) = N'
    USE [' + @dbName + '];
    SELECT
      @currentSize = (SUM(total_page_count) * 1.0 / 128),
      @freesize = (SUM(unallocated_extent_page_count) * 1.0 / 128)
    FROM sys.dm_db_file_space_usage
    WHERE database_id = DB_ID();'

    EXEC sp_executesql
      @sql0,
      N'@currentSize INT OUTPUT, @freesize INT OUTPUT',
      @currentSize OUTPUT,
      @freesize OUTPUT

    PRINT 'Current size:' + CAST(@currentSize AS VARCHAR(10)) + 'MB'
    PRINT 'Free size:' + CAST(@freeSize AS VARCHAR(10)) + 'MB'

    SET @usedSize = @currentSize - @freeSize
    PRINT 'Used size:' + CAST(@usedSize AS VARCHAR(10)) + 'MB'

    -- Validate target size
    IF @targetSize <= @usedSize
    BEGIN
        PRINT 'The target size is too small. Specify a new size. The target size cannot be smaller than: ' + CAST(@usedSize AS VARCHAR(20)) + 'MB'
        BREAK
    END

    -- Exit when target is reached
    IF @currentSize <= @targetSize
    BEGIN
        PRINT 'Shrink completed. Current size: ' + CAST(@currentSize AS VARCHAR(20)) + 'MB'
        BREAK
    END

    -- Calculate the new size for this iteration
    DECLARE @newSize INT = @currentSize - @shrinkSize
    IF @newSize < @targetSize
        SET @newSize = @targetSize

    -- Run the shrink
    SET @sql = 'USE [' + @dbName + '];DBCC SHRINKFILE (N''' + @fileName + ''', ' + CAST(@newSize AS VARCHAR(20)) + ')'
    PRINT 'Executing shrink: ' + @sql
    EXEC (@sql)

    -- Wait before the next iteration
    PRINT 'Waiting ' + CAST(@waitTime AS VARCHAR(10)) + ' seconds to continue...'
    WAITFOR DELAY '00:00:10'
END

Método 2 — DBCC SHRINKFILE direto

Execute DBCC SHRINKFILE para reduzir um único arquivo de dados para um tamanho alvo. Isso libera o espaço não alocado de volta para o sistema operacional. Para referência, consulte Reduzir um banco de dados e DBCC SHRINKFILE.

DBCC SHRINKFILE(<File ID>, <Target size in MB>)

Clique em para ver um exemplo

Exemplo: Na figura abaixo, cada extensão tem 64 KB. Tamanho total do arquivo de dados = (1673344 × 64) / 1024 = 104.584 MB. Espaço alocado = (1313432 × 64) / 1024 = 82.089,5 MB. O arquivo não pode ser reduzido para menos de 82.089,5 MB. Para reduzir para 90.000 MB, execute:

DBCC SHRINKFILE(1, 90000)

DBCC SHRINKFILE example

Solucionar problemas comuns de espaço de dados

Após reconstruir um índice, por que a taxa de fragmentação na tabela Index Usage não atualiza?

Após a conclusão de uma reconstrução, o console coleta estatísticas atualizadas de forma assíncrona em segundo plano. Clique em Recollect para acionar uma atualização manual. Assim que a coleta terminar, clique em Export Script para baixar e verificar a taxa de fragmentação atual.

Index Usage after rebuild

Após executar SHRINKFILE, por que ele trava sem progresso?

Descrição do problema

Em uma instância do Alibaba Cloud RDS for SQL Server, ao tentar executar a operação SHRINKFILE em um arquivo de dados ou arquivo de log do banco de dados para recuperar espaço livre, você pode encontrar os seguintes problemas:

  • O comando SHRINKFILE não é concluído por um longo período.

  • A porcentagem de progresso (percent_complete) não é atualizada por um longo período.

Esses problemas são tipicamente causados por bloqueio de transações longas, especialmente quando o Isolamento de Snapshot está habilitado para o banco de dados, pois a retenção de versões de snapshot impede que a operação SHRINKFILE seja concluída normalmente.

Solução

  1. Conecte-se à instância do RDS for SQL Server usando o SQL Server Management Studio (SSMS).

  2. Execute a seguinte consulta para confirmar o status e o progresso da operação SHRINKFILE:

    SELECT 
        r.session_id AS [SPID],
        r.start_time AS [Start Time],
        r.status AS [Status],
        r.command AS [Command Type],
        r.wait_type AS [Wait Type],
        r.wait_time AS [Wait Time (ms)],
        r.last_wait_type AS [Last Wait Type],
        t.text AS [Executed Statement],
        r.percent_complete AS [Execution Progress]
    FROM 
        sys.dm_exec_requests r
    CROSS APPLY 
        sys.dm_exec_sql_text(r.sql_handle) t;

    Se a coluna de status mostrar suspenso e o valor na coluna percent_complete não tiver sido atualizado por um longo tempo, a operação SHRINKFILE está bloqueada. Prossiga para a próxima etapa.

    image

  3. Verifique o log de erros do RDS for SQL Server procurando uma mensagem semelhante à seguinte:

    DBCC SHRINKFILE for file ID 1 is waiting for the snapshot
    transaction with timestamp 15 and other snapshot transactions linked to
    timestamp 15 or with timestamps older than 109 to finish.

    Resultado de exemplo:

    Este log indica que, como o isolamento de snapshot está habilitado para o banco de dados, a operação SHRINKFILE está bloqueada por uma transação de snapshot e não pode prosseguir.

    image

  4. Execute a seguinte consulta para verificar se o isolamento de snapshot está habilitado para o banco de dados:

    SELECT 
        name,
        is_read_committed_snapshot_on,
        snapshot_isolation_state,
        snapshot_isolation_state_desc
    FROM 
        sys.databases;

    Se is_read_committed_snapshot_on=1 ou snapshot_isolation_state_desc=ON, o recurso de snapshot está habilitado para o banco de dados, e você deve investigar mais a fundo por transações longas.

    image

  5. Execute a seguinte instrução SQL para verificar se há transações longas que possam estar causando o bloqueio e para verificar sua duração:

    SELECT db_name(exe.database_id),tr.* FROM sys.dm_tran_active_snapshot_database_transactions AS tr JOIN sys.dm_exec_requests AS exe ON tr.session_id=exe.session_id;

    Após a conclusão da execução, preste muita atenção aos campos session_id e elapsed_time_seconds. O campo elapsed_time_seconds indica a duração da transação. Um valor maior indica que a transação está em execução há mais tempo e requer mais atenção. Se descobrir que certas transações longas estão causando bloqueio, considere encerrar (KILL) essas transações e observe se a operação SHRINKFILE é retomada.

    Nota

    Uma operação SHRINKFILE bloqueada não é necessariamente causada por transações longas no banco de dados atual. A causa raiz também pode ser transações longas em outros bancos de dados com snapshots habilitados, especialmente em cenários que envolvem consultas entre bancos de dados. Portanto, ao solucionar problemas, verifique o status das transações de todos os bancos de dados relacionados para identificar e resolver o problema com precisão.

    image

  6. Se confirmar pelas etapas anteriores que uma ou mais transações longas estão bloqueando a operação SHRINKFILE, avalie se pode parar (KILL) essas transações para retomar a execução normal da operação SHRINKFILE. Note que parar uma transação longa faz com que ela seja revertida. Portanto, antes de executar a operação KILL, avalie totalmente o impacto da reversão em seus negócios. Se não puder parar as transações longas por motivos comerciais, veja as sugestões a seguir:

    • Aguarde a conclusão da transação longa. Após a conclusão, execute a operação SHRINKFILE novamente.

    • Pare a operação SHRINKFILE. Se a janela atual não for um momento adequado para esperar, pare a operação SHRINKFILE e reagende-a para uma janela de manutenção adequada.

Recuperar espaço de log

Verificar uso de espaço de log

Use DBCC SQLPERF(LOGSPACE) ou a página Monitoring and Alerts para verificar a porcentagem de espaço utilizado no arquivo de log de cada banco de dados.

Se a porcentagem utilizada for alta, reduzir o arquivo de log terá pouco efeito. O log não pode ser truncado até que a condição de bloqueio seja resolvida. Consulte sys.databases e verifique a coluna log_reuse_wait_desc para identificar por que o truncamento está aguardando:

SELECT name, log_reuse_wait, log_reuse_wait_desc FROM sys.databases;

Para uma lista completa de valores de log_reuse_wait_desc, consulte sys.databases (Transact-SQL).

Reduzir logs de transação

Aviso

Se o log de transações estiver cheio, não será possível reduzi-lo pelo console. É necessário executar SQL manualmente, o que envolve riscos. Expanda o armazenamento em disco primeiro sempre que possível. Para procedimentos de emergência, consulte Solução para espaço de log insuficiente (apenas para uso emergencial).

Escolha a abordagem que se adequa à sua situação:

Solução 1: Redução de banco único (sem backup)

Solução 2: Backup e redução no nível da instância

Escopo

Banco de dados único

Instância inteira

Backup

Nenhum backup realizado

Faz backup automático de todos os logs de transação primeiro

Velocidade

Rápida

Mais lenta — o backup é executado antes da redução

Quando usar

O log está crescendo rápido e não é possível aguardar um backup agendado

Existe espaço de log suficiente e deseja-se otimização global

Impacto em outros bancos de dados

Nenhum

Afeta a instância inteira

Como executar

Reduzir logs de transação do banco de dados

Fazer backup e reduzir logs de transação

Após a conclusão da redução, acesse Monitoring and Alerts para verificar o espaço de log atualizado.

Log space after shrink

Recuperar espaço do tempdb

Como o tempdb usa espaço

O tempdb é um banco de dados de sistema do SQL Server que armazena dados temporários. Três categorias de objetos consomem o espaço de seu arquivo de dados:

  • Objetos de usuário: Tabelas temporárias criadas por sessões de usuário (por exemplo, #TempTable).

  • Objetos internos: Estruturas temporárias criadas internamente pelo SQL Server (por exemplo, para operações de classificação ou hash joins).

  • Armazenamento de versões: Quando o isolamento de snapshot ou o isolamento de snapshot de leitura confirmada (RCSI) está habilitado, o SQL Server armazena versões de linha no tempdb. Transações longas impedem que essas versões sejam limpas.

Se qualquer uma dessas categorias crescer muito — especialmente devido a transações longas, uso intenso de tabelas temporárias ou isolamento de snapshot — o arquivo de dados do tempdb pode ficar inchado muito além de seu tamanho normal. Para contexto, consulte a documentação do tempdb da Microsoft.

Recuperar espaço de arquivo de dados do tempdb

O SHRINKFILE geralmente é ineficaz para arquivos de dados do tempdb. A maneira mais confiável de recuperar espaço é reiniciar a instância fora do horário de pico. O SQL Server redefine o tempdb na inicialização. Para detalhes, consulte Reduzir o banco de dados tempdb.

Antes de reiniciar, diagnostique o que causou o crescimento para evitar reincidência.

Cenário 1: tempdb está grande atualmente (instância ativa)

Passo 1 — Verificar espaço por tipo de objeto

Execute a seguinte consulta para ver quanto espaço cada categoria (objetos de usuário, objetos internos, armazenamento de versões) está consumindo:

SELECT
    SUM(version_store_reserved_page_count) AS [version store pages used],
    (SUM(version_store_reserved_page_count) * 1.0 / 128) AS [version store space (MB)],
    SUM(user_object_reserved_page_count) AS [user object pages used],
    (SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space (MB)],
    SUM(internal_object_reserved_page_count) AS [internal object pages used],
    (SUM(internal_object_reserved_page_count) * 1.0 / 128) AS [internal object space (MB)]
FROM
    sys.dm_db_file_space_usage;

Para referência, consulte sys.dm_db_file_space_usage.

Passo 2a — Se objetos de usuário ou objetos internos estiverem grandes

Identifique quais sessões estão usando mais espaço do tempdb:

SELECT
    session_id,
    SUM(user_objects_alloc_page_count) AS [user object pages used],
    (SUM(user_objects_alloc_page_count) * 1.0 / 128) AS [user object space (MB)],
    SUM(internal_objects_alloc_page_count) AS [internal object pages used],
    (SUM(internal_objects_alloc_page_count) * 1.0 / 128) AS [internal object space (MB)]
FROM
    sys.dm_db_session_space_usage
GROUP BY
    session_id;

Para referência, consulte sys.dm_db_session_space_usage.

Em seguida, use o session_id para encontrar a instrução SQL que a sessão está executando:

SELECT
    r.session_id AS [SPID],
    r.start_time AS [Start Time],
    r.status AS [Status],
    r.command AS [Command Type],
    r.wait_type AS [Wait Type],
    r.wait_time AS [Wait Time (ms)],
    r.last_wait_type AS [Last Wait Type],
    t.text AS [Executing Statement]
FROM
    sys.dm_exec_requests r
CROSS APPLY
    sys.dm_exec_sql_text(r.sql_handle) t
WHERE
    r.session_id = <session_id>; -- Replace with the session_id from the previous query

Passo 2b — Se o armazenamento de versões estiver grande

O banco de dados provavelmente tem o isolamento de snapshot habilitado com transações longas impedindo a limpeza.

Verifique quais bancos de dados têm o isolamento de snapshot habilitado:

SELECT
    name,
    is_read_committed_snapshot_on,
    snapshot_isolation_state
FROM sys.databases;

Se is_read_committed_snapshot_on ou snapshot_isolation_state for 1, o isolamento de snapshot está ativo.

Snapshot isolation state

Encontre sessões com transações longas não confirmadas que estão bloqueando a limpeza do armazenamento de versões:

SELECT * FROM sys.dm_tran_active_snapshot_database_transactions ORDER BY elapsed_time_seconds DESC;

Active snapshot transactions

Use o session_id para verificar o que a sessão está fazendo:

SELECT * FROM sys.sysprocesses WHERE spid = <session_id>;

Session process details

Se o status da sessão for sleeping, verifique a última instrução executada:

DBCC INPUTBUFFER(<session_id>);

DBCC INPUTBUFFER result

Cenário 2: Investigar crescimento passado do tempdb após uma reinicialização

Se a instância já foi reiniciada e os dados em tempo real não estão disponíveis, use Sessões Ativas Médias (AAS), logs de consultas lentas e logs de auditoria para reconstruir o que aconteceu.

Passo 1 — Encontrar a janela de crescimento

Na página de detalhes da instância, acesse Monitoring and Alerts > Standard Monitoring. Na seção Instance Storage, anote quando a métrica tmp_size começou e parou de subir. Lembre-se de que o tempdb pode reutilizar o espaço livre existente primeiro — a expansão real do arquivo acontece apenas depois que o espaço existente se esgota, então o crescimento no gráfico pode ocorrer após o início da operação SQL.

tmp_size metric

Passo 2 — Analisar usando AAS

Acesse Autonomy Services > Performance Optimization > Performance Insight. Selecione a janela de tempo, estendendo o horário de início para capturar todas as operações relacionadas. Procure por instruções SQL que usam intensivamente tabelas temporárias baseadas em disco (por exemplo, criação frequente de tabelas #).

Performance Insight AAS

Passo 3 — Filtrar logs de consultas lentas por palavra-chave

Acesse Autonomy Services > Slow Query Logs. Pesquise por palavra-chave (por exemplo, nome de uma tabela temporária). Verifique os horários de início e duração das consultas para ver se o horário de término da consulta coincide com o momento em que o tempdb parou de crescer.

Slow query logs

Recuperar espaço de arquivo de log do tempdb

Os arquivos de log do tempdb crescem quando uma transação longa impede o truncamento do log.

  1. Verifique log_reuse_wait_desc em sys.databases:

    SELECT
        name AS [DatabaseName],
        recovery_model_desc AS [RecoveryModel],
        log_reuse_wait_desc AS [LogReuseWaitDescription]
    FROM sys.databases;

    Se LogReuseWaitDescription for NOTHING, reduza o arquivo de log diretamente com SHRINKFILE. Se mostrar ACTIVE_TRANSACTION, encerre primeiro a transação longa ativa.

    Log reuse wait status

  2. Encontre a transação mais longa no tempdb:

    USE tempdb;
    GO
    DBCC OPENTRAN;
    GO

    Anote o ID da sessão (SPID) e o horário de início da transação.

    DBCC OPENTRAN result

  3. Verifique o que a sessão está fazendo:

    SELECT * FROM sys.sysprocesses WHERE spid = <spid>;

    Session process

  4. Se o status da sessão for sleeping, verifique sua última instrução executada:

    DBCC INPUTBUFFER(<session_id>);

    DBCC INPUTBUFFER

Após encerrar a transação bloqueadora, reduza o arquivo de log do tempdb:

USE tempdb;
DBCC SHRINKFILE(templog, 1);
GO

Recuperar espaço de outros arquivos

O que o espaço de outros arquivos inclui

O espaço de outros arquivos abrange arquivos de bancos de dados do sistema: sqlserver.other_size, mastersize, modelsize e msdbsize. Estes geralmente são pequenos, mas podem crescer inesperadamente em dois cenários:

  • Logs de erro: O arquivo errorlog pode crescer para vários gigabytes ou mais se a instância gerar muitos eventos de erro.

  • Arquivos de dump de memória: O SQL Server gera dumps de memória automaticamente durante exceções críticas.

Identificar e limpar arquivos superdimensionados

  1. Acesse Monitoring and Alerts > Standard Monitoring e verifique o espaço usado por esses tipos de arquivo. Para definições de métricas, consulte Visualizar monitoramento padrão.

    Other file space monitoring

  2. Se errorlog estiver consumindo uma grande quantidade de espaço, acesse a página Logs para limpar os logs de erro. Para instruções, consulte Gerenciar logs.

Se outros arquivos de sistema (como sqlserver.other_size ) estiverem inesperadamente grandes, entre em contato com o suporte técnico para identificar a causa raiz.

Expandir espaço de armazenamento

Se o uso de espaço permanecer alto após aplicar as etapas acima, expanda a capacidade de armazenamento da instância. Para instruções, consulte Alterar especificações da instância. O novo armazenamento entra em vigor imediatamente sem reinicialização da instância.