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 |
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.

-
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.

-
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.

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 |
|
|
Tamanho total (arquivos de dados + arquivos de log) para cada banco de dados |
|
|
Nome, espaço utilizado e espaço não alocado do banco de dados atual |
|
|
Tamanho total do arquivo de log e espaço de log utilizado para cada banco de dados |
|
|
Espaço de dados total e utilizado para todos os arquivos de dados no banco de dados atual |
|
|
Tamanhos dos arquivos de dados e de log para cada banco de dados |
|
|
Espaço de log total e utilizado para o banco de dados atual. Apenas SQL Server 2012 e versões posteriores. |
|
|
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:
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:
Verifique o tipo de espera de reutilização de log no campo
log_reuse_wait_descdesys.database. Se o tipo de espera de reutilização de log forACTIVE_TRANSACTION, existe uma transação longa.Identifique quais transações longas estão em execução no banco de dados
tempdb. Após encerrar as transações longas, useSHRINKFILEpara reduzir o arquivo de log.
Use as soluções a seguir para analisar o uso de espaço dos arquivos de log do tempdb:
-
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
LogReuseWaitDescriptionforNOTHING, reduza o arquivo de log diretamente comSHRINKFILE. Se o valor não forNOTHING, como o valor comumACTIVE_TRANSACTION, existe uma transação longa ativa. Encerre a transação longa antes de reduzir o arquivo de log comSHRINKFILE.SELECT name AS [DatabaseName], recovery_model_desc AS [RecoveryModel], log_reuse_wait_desc AS [LogReuseWaitDescription] FROM sys.databases;
-
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; GOConforme mostrado na figura a seguir, anote o ID da sessão (SPID) e o horário de início da transação (Start time):

-
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 stepPor exemplo:

-
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 stepA figura a seguir mostra um exemplo.

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, consultesys.dm_db_index_physical_statsno modoSAMPLEDouDETAILEDe verifique a colunaavg_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.
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.

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.
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>)
Solucionar problemas comuns de espaço de dados
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
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 |
Após a conclusão da redução, acesse Monitoring and Alerts para verificar o espaço de log atualizado.

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.

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;

Use o session_id para verificar o que a sessão está fazendo:
SELECT * FROM sys.sysprocesses WHERE spid = <session_id>;

Se o status da sessão for sleeping, verifique a última instrução executada:
DBCC INPUTBUFFER(<session_id>);

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.

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 #).

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.

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.
-
Verifique
log_reuse_wait_descemsys.databases:SELECT name AS [DatabaseName], recovery_model_desc AS [RecoveryModel], log_reuse_wait_desc AS [LogReuseWaitDescription] FROM sys.databases;Se
LogReuseWaitDescriptionforNOTHING, reduza o arquivo de log diretamente comSHRINKFILE. Se mostrarACTIVE_TRANSACTION, encerre primeiro a transação longa ativa.
-
Encontre a transação mais longa no
tempdb:USE tempdb; GO DBCC OPENTRAN; GOAnote o ID da sessão (SPID) e o horário de início da transação.

-
Verifique o que a sessão está fazendo:
SELECT * FROM sys.sysprocesses WHERE spid = <spid>;
-
Se o status da sessão for
sleeping, verifique sua última instrução executada:DBCC INPUTBUFFER(<session_id>);
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
errorlogpode 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
-
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.

Se
errorlogestiver 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.




