Todos los productos
Search
Centro de documentos

ApsaraDB RDS:Insufficient space issues for RDS for SQL Server

Última actualización: Sep 24, 2026

Cuando se agota el almacenamiento en una instancia de RDS for SQL Server, las escrituras pueden fallar y las copias de seguridad no se completan. En este tema se explica cómo identificar qué tipo de archivo consume espacio y cómo recuperar o ampliar el almacenamiento.

Conceptos sobre el espacio de almacenamiento

Antes de solucionar problemas, comprenda el significado de los valores de espacio:

Concept

Definition

Notes

Espacio de datos utilizado

Espacio que ocupan los datos reales almacenados en los archivos de la base de datos

Aumenta con las inserciones. Es posible que no disminuya al eliminar datos si se conserva el espacio asignado.

Espacio de datos asignado

Espacio del archivo formateado y reservado para uso de la base de datos

Crece automáticamente. No se reduce tras las eliminaciones a menos que ejecute una operación de reducción.

Espacio de datos asignado pero sin usar

Diferencia entre el espacio asignado y el utilizado

Cantidad máxima que puede recuperar al reducir los archivos de datos.

Tamaño total del archivo

Tamaño en disco de los archivos de datos o de registro

Se muestra en las métricas de la consola y en sys.master_files. Incluye el espacio asignado y el no asignado.

Importante

Las métricas de la consola y la mayoría de las API de monitoreo reportan el tamaño del archivo (asignado), no el uso real de datos. Para ver ambos valores al mismo tiempo, consulte sys.dm_db_file_space_usage o sys.master_files. Esta distinción determina si la reducción liberará una cantidad significativa de espacio.

Consulta del uso de espacio

Utilice cualquiera de los siguientes métodos para comprobar el uso actual de espacio:

  • Método 1: página Basic Information. Muestra únicamente el uso total actual de espacio. No incluye un desglose por tipo de archivo ni tendencias históricas.

    Basic Information

  • Método 2: Monitoring and Alerts > Standard Monitoring. Presenta el espacio en disco desglosado por tipo de archivo (datos, registro, temporal, otros) junto con sus tendencias históricas. Consulte View standard monitoring para conocer las definiciones de las métricas.

    Monitoring and Alerts

  • Método 3: Autonomy Services > Storage Management. Ofrece un desglose detallado que incluye el uso de datos frente al de registros, las tendencias históricas y la asignación de espacio para las bases de datos y tablas principales. Para obtener más información, consulte Space Management.

    Storage Management no está disponible para instancias que ejecutan SQL Server 2008 R2 con discos en la nube.

    Storage Management

  • Método 4: SQL Server Management Studio (SSMS) u otra herramienta cliente. Conéctese directamente a la instancia y ejecute consultas T-SQL. Consulte Connect to an RDS for SQL Server instance using an SSMS client para ver las instrucciones de conexión.

A continuación se muestran los comandos T-SQL más comunes para inspeccionar el uso de espacio:

Command or view

What it shows

sp_helpdb

Tamaño total (archivos de datos + archivos de registro) de cada base de datos

sp_spaceused

Nombre, espacio utilizado y espacio no asignado de la base de datos actual

DBCC SQLPERF(LOGSPACE)

Tamaño total del archivo de registro y espacio de registro utilizado para cada base de datos

DBCC SHOWFILESTATS

Espacio de datos total y utilizado para todos los archivos de datos de la base de datos actual

SELECT * FROM sys.master_files

Tamaños de los archivos de datos y de registro de cada base de datos

SELECT * FROM sys.dm_db_log_space_usage

Espacio de registro total y utilizado de la base de datos actual. Solo para SQL Server 2012 y versiones posteriores.

SELECT * FROM sys.dm_db_file_space_usage

Espacio de archivos de datos total y utilizado de la base de datos actual. Solo para SQL Server 2012 y versiones posteriores.

Si el uso de espacio es alto, vaya a Monitoring and Alerts en la consola de RDS y compruebe qué tipo de archivo crece más rápido: datos, registro, temporal u otro. Después, siga la sección correspondiente a continuación.

Recuperación de espacio de datos

Análisis de causas

La base de datos tempdb es una base de datos del sistema en SQL Server que almacena datos temporales. El espacio de los archivos de datos en tempdb se utiliza con frecuencia en diversos escenarios, como los siguientes:

  • Objetos de usuario: tablas temporales creadas por los usuarios.

  • Objetos internos: tablas temporales generadas internamente por SQL Server.

  • Almacén de versiones: cuando se habilita el aislamiento de instantáneas o la instantánea de lectura confirmada para una base de datos, la información de versiones se almacena en tempdb.

Si ciertas operaciones consumen mucho espacio, como las transacciones de larga duración, la creación de numerosas tablas temporales o el aislamiento de instantáneas, el archivo de datos puede crecer de forma desproporcionada. Esto significa que su tamaño aumenta significativamente más allá de su rango normal. For more information, see el tutorial oficial de Microsoft sobre la base de datos tempdb.

Soluciones

Una instancia de RDS for SQL Server database contains data files and log files. The methods to reclaim space for each are as follows:

Recuperación de espacio de archivos de datos

Si el espacio del archivo de datos de tempdb crece demasiado, usar el comando SHRINKFILE para reducirlo no resulta muy eficaz. En su lugar, puede restart the instance durante las horas de menor actividad para liberar espacio de tempdb, tal como se describe en el tutorial oficial de Microsoft (Reducción de la base de datos tempdb).

Para analizar el uso de espacio de los archivos de datos de tempdb, utilice las siguientes soluciones:

Scenario 1: The tempdb data file space is large

  1. If se utiliza una gran cantidad de espacio del archivo de datos de tempdb, you can execute the following SQL statement. Use the system view sys.dm_db_file_space_usage para comprobar el espacio de tempdb que utilizan los distintos tipos de objetos ( User Objects , Internal Objects , and Version Store ):

    Para obtener más información sobre cómo usar sys.dm_db_file_space_usage, consulte el tutorial oficial de 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. If User Objects or Internal Objects consumen una gran cantidad de espacio:

    1. Execute the following SQL statement. Puede usar la vista del sistema sys.dm_db_session_space_usage para identificar qué sesiones consumen una gran cantidad de tempdb space:

      Para obtener más información sobre cómo usar sys.dm_db_session_space_usage, consulte el tutorial oficial de 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. Con el identificador de sesión devuelto, consulte la instrucción SQL que la sesión ejecuta actualmente:

      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. Si Version Store consume mucho espacio, es probable que la base de datos tenga habilitado el aislamiento de instantáneas. Esto provoca que se almacenen muchas versiones de instantáneas en tempdb.

    1. Consulte qué bases de datos tienen habilitado el aislamiento de instantáneas:

      SELECT 
          name, 
          is_read_committed_snapshot_on, 
          snapshot_isolation_state 
      FROM sys.databases;

      Si el valor del campo is_read_committed_snapshot_on o snapshot_isolation_state es 1, la base de datos correspondiente tiene habilitado el aislamiento de instantáneas, como se muestra en la siguiente figura:

      image

    2. Utilice la vista del sistema sys.dm_tran_active_snapshot_database_transactions para buscar sesiones con transacciones de larga duración que no se hayan confirmado. Estas transacciones impiden que los registros de Version Store se limpien automáticamente:

      SELECT * FROM sys.dm_tran_active_snapshot_database_transactions ORDER BY elapsed_time_seconds DESC;

      Los detalles son los siguientes:

      image

    3. Una vez que obtenga el session_id, consulte sys.sysprocesses y sys.dm_exec_requests/sys.dm_exec_sql_text para verificar el estado de la sesión y el comando ejecutado:

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

      Los detalles son los siguientes:

      image

    4. Si el estado de la sesión es sleeping, use el siguiente comando SQL para revisar la instrucción ejecutada:

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

      Los detalles son los siguientes:

      image

Scenario 2: Investigating the cause of past tempdb space growth after a restart

Si los datos en vivo no están disponibles, analice el problema mediante Average Active Sessions (AAS), los registros de consultas lentas y los registros de auditoría. Siga estos pasos:

  1. Analice las horas de inicio y fin del crecimiento de espacio en tempdb

    Primero, analice la tendencia de crecimiento del uso de espacio en tempdb. En la página de detalles de la instancia, vaya a Monitoring and Alerts > Standard Monitoring. En la sección Instance Storage, anote las horas de inicio y fin en las que aumentó la métrica tmp_size. Cuando comienza una operación SQL, es posible que tempdb aún tenga espacio libre disponible que se reutiliza primero. Por lo tanto, la hora real de expansión del espacio podría ser posterior a la hora de inicio de la operación SQL. El sistema activa una operación de expansión de archivos para asignar nuevo espacio de almacenamiento solo después de que se agota el espacio existente en tempdb.

    image

  2. Realice el análisis con AAS (Average Active Sessions)

    En la página de detalles de la instancia, vaya a Autonomy Service > Performance Optimization > Performance Insight. Seleccione el periodo de tiempo objetivo. Extienda el inicio del rango de tiempo para asegurarse de capturar todas las operaciones relacionadas. Analice los registros de ejecución SQL de este periodo e identifique cualquier operación que utilice intensivamente tablas temporales basadas en disco.

    Por ejemplo, busque la creación y el uso de tablas temporales como #RKD_SJ. El uso frecuente de estas tablas temporales suele ser una causa principal del crecimiento de espacio en tempdb.

    image

  3. Filtre los registros de consultas lentas por palabras clave

    En la página de detalles de la instancia, vaya a Autonomy Service > Slow Query Logs. Filtre los registros de consultas lentas por palabra clave. Check the SQL running time and start time. You can analyze whether the end time of the query matches the time when the espacio de tempdb stopped growing.

    image

Recuperación de espacio de archivos de registro

Si el espacio del archivo de registro de tempdb crece demasiado, generalmente se debe a que una transacción de larga duración impide truncar el registro. Recupere el espacio de la siguiente manera:

  1. Compruebe el tipo de espera de reutilización del registro en el campo log_reuse_wait_desc de sys.database. Si el tipo de espera de reutilización del registro es ACTIVE_TRANSACTION, existe una transacción de larga duración.

  2. Identifique qué transacciones de larga duración se están ejecutando en la base de datos tempdb. Una vez que finalice dichas transacciones, utilice SHRINKFILE para reducir el archivo de registro.

Para analizar el uso de espacio de los archivos de registro de tempdb, utilice las siguientes soluciones:

  1. Primero, compruebe el estado del archivo de registro de la base de datos.

    En los resultados de ejecución, revise el estado del espacio de registro de tempdb. Si LogReuseWaitDescription es NOTHING, reduzca el archivo de registro directamente con SHRINKFILE. Si el valor no es NOTHING, como ocurre con el valor común ACTIVE_TRANSACTION, existe una transacción de larga duración activa. Debe finalizar dicha transacción antes de reducir el archivo de registro con SHRINKFILE.

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

    image

  2. El crecimiento del archivo de registro de tempdb suele deberse a transacciones de larga duración activas. Use el siguiente comando SQL para buscar la transacción más antigua en la base de datos tempdb y decida si debe finalizarla:

    USE tempdb;
    GO
    DBCC OPENTRAN;
    GO

    Como se muestra en la siguiente figura, anote el identificador de sesión (SPID) y la hora de inicio de la transacción (Start time):

    image

  3. A continuación, compruebe qué tarea realiza la sesión y cuál es su estado. Utilice el identificador de sesión del paso anterior:

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

    Por ejemplo:

    image

  4. Si el estado de la sesión es sleeping, use el siguiente comando SQL para revisar la instrucción ejecutada:

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

    La siguiente figura muestra un ejemplo.

    image

Funcionamiento del espacio de datos

El espacio total de datos equivale a la suma de los tamaños de todos los archivos de datos y se divide en dos partes:

  • Espacio asignado: espacio destinado a tablas o índices. Incluye tanto las filas con datos como las páginas reservadas para futuras inserciones en la misma tabla o índice. Otros objetos no pueden utilizar este espacio directamente.

  • Espacio no asignado: extensiones completamente libres (cada extensión consta de 64 KB de espacio contiguo) que no están asociadas a ningún objeto. Al reducir un archivo, este espacio se libera de vuelta al sistema operativo.

Si los datos siguen creciendo, el espacio no asignado suele ser pequeño. Reducir los archivos directamente tiene poco efecto. Primero recupere el espacio asignado y luego considere la reducción.

Recuperación del espacio asignado

Archivado o eliminación de datos

Elimine o migre los datos a los que rara vez se accede (por ejemplo, registros históricos antiguos) a otra instancia o a un formato de archivo. Esto reduce directamente el espacio de datos utilizado y constituye la solución más eficaz a largo plazo, aunque requiere cambios en la lógica de la aplicación y en el diseño de la base de datos.

Compresión de datos

Las instancias que ejecutan SQL Server 2016 o versiones posteriores, así como las instancias Enterprise Edition con versiones anteriores, admiten compresión de filas y de páginas a nivel de tabla, índice o partición. Para obtener más información, consulte Compresión de datos.

El ahorro varía considerablemente (del 10 al 90 %) según el esquema, los tipos de columna y la distribución de los datos. Utilice sp_estimate_data_compression_savings para estimar el ahorro antes de habilitar la compresión.

Cambiar la configuración de compresión es una operación de lenguaje de definición de datos (DDL). En tablas grandes, esto puede provocar bloqueos prolongados. Ejecútela durante las horas de menor actividad.
En instancias Enterprise Edition, establezca ONLINE = ON para minimizar el impacto en el negocio.
La compresión incrementa la sobrecarga de CPU. Habilítela solo en tablas grandes donde el ahorro de espacio justifique el costo.

Desfragmentación de índices

Una alta fragmentación de índices ralentiza las consultas y desperdicia almacenamiento. Para ver las tasas de fragmentación, vaya a Autonomy Services > Performance Optimization y haga clic en la pestaña Index Usage. La consola muestra la tasa de fragmentación por tabla y sugiere si conviene reconstruir o reorganizar cada índice.

La tasa de fragmentación de índices mide el porcentaje de páginas de índice lógicamente adyacentes que no lo están físicamente. Esto difiere del porcentaje de espacio libre dentro de las páginas. Para medir el espacio libre promedio por página, consulte sys.dm_db_index_physical_stats en modo SAMPLED o DETAILED y revise la columna avg_page_space_used_in_percent . Para obtener más información, consulte sys.dm_db_index_physical_stats (Transact-SQL) . Esta consulta lee muchas páginas de índice, por lo que debe ejecutarla durante las horas de menor actividad.

Reconstrucción de índices (REBUILD): recrea el índice por completo. Resulta más eficaz que la reorganización para índices con alta fragmentación. De forma predeterminada, bloquea la tabla durante la operación. En instancias Enterprise Edition, establezca ONLINE = ON para evitar bloqueos prolongados de la tabla.

Importante

Una reconstrucción aumenta temporalmente y de forma significativa el almacenamiento de la base de datos y el tamaño del registro. Antes de reconstruir, compruebe que la instancia cuente con espacio de almacenamiento libre equivalente, como mínimo, al doble del tamaño del índice que se va a reconstruir.

  • Compruebe el espacio libre: vaya a la página Basic Information de la instancia y revise la sección Instance Resources.

  • Si el espacio libre es insuficiente, scale out storage primero. El nuevo espacio surte efecto de inmediato sin necesidad de reiniciar.

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

Después de la reconstrucción, la consola actualiza las estadísticas de índices de forma asíncrona. Haga clic en Recollect para obtener los datos más recientes y luego haga clic en Export Script para descargar y comprobar la tasa de fragmentación.

Index Usage

Reorganización de índices (REORGANIZE): reestructura las páginas de nivel hoja sin bloquear la tabla. Es menos eficaz que la reconstrucción, pero adecuada para índices con baja fragmentación.

Reducción de archivos de datos

Después de recuperar el espacio asignado con los métodos anteriores, utilice uno de los siguientes enfoques si persiste la presión sobre el almacenamiento.

Importante

Una única operación de reducción a gran escala puede provocar un crecimiento significativo del registro de transacciones y bloqueos prolongados. Utilice el método 1 para reducir en lotes pequeños.

Método 1: bucle de reducción incremental (recomendado)

Reduzca en iteraciones de aproximadamente 5 GB cada una. El siguiente script aplica a SQL Server 2012 y versiones 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 directo

Ejecute DBCC SHRINKFILE para reducir un único archivo de datos a un tamaño objetivo. Esto libera el espacio no asignado de vuelta al sistema operativo. Como referencia, consulte Reducción de una base de datos y DBCC SHRINKFILE.

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

Haga clic para ver un ejemplo

Ejemplo: en la siguiente figura, cada extensión es de 64 KB. Tamaño total del archivo de datos = (1673344 × 64) / 1024 = 104,584 MB. Espacio asignado = (1313432 × 64) / 1024 = 82,089.5 MB. El archivo no se puede reducir por debajo de 82,089.5 MB. Para reducirlo a 90,000 MB, ejecute:

DBCC SHRINKFILE(1, 90000)

DBCC SHRINKFILE example

Solución de problemas comunes de espacio de datos

¿Por qué no se actualiza la tasa de fragmentación en la tabla Index Usage después de reconstruir un índice?

Cuando finaliza una reconstrucción, la consola recopila las estadísticas actualizadas de forma asíncrona en segundo plano. Haga clic en Recollect para iniciar una actualización manual. Una vez que termine la recopilación, haga clic en Export Script para descargar y comprobar la tasa de fragmentación actual.

Index Usage after rebuild

¿Por qué se detiene SHRINKFILE sin mostrar avances tras ejecutarlo?

Descripción del problema

En una instancia de Alibaba Cloud RDS for SQL Server, al intentar execute the SHRINKFILE operation on a database data file or log file to reclaim free space, es posible que se presenten los siguientes problemas:

  • El comando SHRINKFILE no finaliza durante mucho tiempo.

  • El porcentaje de progreso (percent_complete) no se actualiza durante mucho tiempo.

Estos problemas suelen deberse al bloqueo por transacciones de larga duración, especialmente cuando el aislamiento de instantáneas está habilitado para la base de datos. La retención de versiones de instantáneas impide que la operación SHRINKFILE finalice correctamente.

Solución

  1. Connect to the RDS for SQL Server instance using SQL Server Management Studio (SSMS).

  2. Ejecute la siguiente consulta para confirmar el estado y el progreso de la operación 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;

    Si la columna de estado muestra suspended y el valor de la columna percent_complete no se ha actualizado durante mucho tiempo, la operación SHRINKFILE está bloqueada. Continúe con el siguiente paso.

    image

  3. Revise el registro de errores de RDS for SQL Server en busca de un mensaje similar al siguiente:

    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 ejemplo:

    Este registro indica que, dado que el aislamiento de instantáneas está habilitado para la base de datos, la operación SHRINKFILE queda bloqueada por una transacción de instantánea y no puede continuar.

    image

  4. Ejecute la siguiente consulta para comprobar si el aislamiento de instantáneas está habilitado para la base de datos:

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

    Si is_read_committed_snapshot_on=1 o snapshot_isolation_state_desc=ON, la función de instantáneas está habilitada para la base de datos y debe investigar si existen transacciones de larga duración.

    image

  5. Ejecute la siguiente instrucción SQL para buscar transacciones de larga duración que puedan estar causando el bloqueo y para revisar su duración:

    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;

    Una vez finalizada la ejecución, preste especial atención a los campos session_id y elapsed_time_seconds. El campo elapsed_time_seconds indica la duración de la transacción. Un valor mayor señala que la transacción lleva más tiempo ejecutándose y requiere más atención. Si detecta que ciertas transacciones de larga duración causan bloqueos, considere terminarlas (KILL) y observe si la operación SHRINKFILE se reanuda.

    Nota

    Una operación SHRINKFILE bloqueada no necesariamente se debe a transacciones de larga duración en la base de datos actual. La causa raíz también pueden ser transacciones de larga duración en otras bases de datos con instantáneas habilitadas, sobre todo en escenarios que implican consultas entre bases de datos. Por lo tanto, al solucionar el problema, debe comprobar el estado de las transacciones de todas las bases de datos relacionadas para identificarlo y resolverlo con precisión.

    image

  6. Si confirma mediante los pasos anteriores que una o más transacciones de larga duración bloquean la operación SHRINKFILE, evalúe si puede detenerlas (KILL) para reanudar la ejecución normal de la operación SHRINKFILE. Tenga en cuenta que detener una transacción de larga duración provoca su reversión. Por ello, antes de ejecutar la operación KILL, evalúe completamente el impacto de la reversión en su negocio. Si por motivos de negocio no puede detener las transacciones de larga duración, considere las siguientes sugerencias:

    • Espere a que finalice la transacción de larga duración. Una vez concluida, vuelva a ejecutar la operación SHRINKFILE.

    • Detenga la operación SHRINKFILE. Si el momento actual no es adecuado para esperar, detenga la operación SHRINKFILE y prográmela nuevamente para una ventana de mantenimiento apropiada.

Recuperación de espacio de registros

Comprobación del uso de espacio de registros

Use DBCC SQLPERF(LOGSPACE) o la página Monitoring and Alerts para comprobar el porcentaje de espacio utilizado en el archivo de registro de cada base de datos.

Si el porcentaje de uso es alto, reducir el archivo de registro tendrá poco efecto. El registro no se puede truncar hasta que se resuelva la condición que lo bloquea. Consulte sys.databases y revise la columna log_reuse_wait_desc para identificar por qué está en espera el truncamiento:

SELECT name, log_reuse_wait, log_reuse_wait_desc FROM sys.databases;

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

Reducción de los registros de transacciones

Aviso

Si el registro de transacciones está lleno, no es posible reducirlo desde la consola. Debe ejecutar SQL manualmente, lo cual implica riesgos. Cuando sea posible, amplíe primero el almacenamiento en disco. Para conocer los procedimientos de emergencia, consulte Solution for insufficient log space (for emergency use only).

Elija el enfoque que mejor se adapte a su situación:

Solution 1: Single-database shrink (no backup)

Solution 2: Instance-level backup and shrink

Alcance

Una sola base de datos

Toda la instancia

Copia de seguridad

No se genera ninguna copia de seguridad

Genera automáticamente una copia de seguridad de todos los registros de transacciones antes de continuar

Velocidad

Rápido

Más lento, ya que la copia de seguridad se ejecuta antes de la reducción

Cuándo usarlo

El registro crece con rapidez y no es posible esperar a una copia de seguridad programada

Existe espacio de registro suficiente y se busca una optimización global

Impacto en otras bases de datos

Ninguno

Afecta a toda la instancia

Cómo ejecutarlo

Shrink database transaction logs

Back up and shrink transaction logs

Una vez finalizada la reducción, vaya a Monitoring and Alerts para comprobar el espacio de registro actualizado.

Log space after shrink

Recuperación de espacio en tempdb

Uso del espacio en tempdb

tempdb es una base de datos del sistema de SQL Server que almacena datos temporales. Tres categorías de objetos consumen el espacio de su archivo de datos:

  • Objetos de usuario: tablas temporales creadas por las sesiones de usuario (por ejemplo, #TempTable).

  • Objetos internos: estructuras temporales que SQL Server crea de forma interna (por ejemplo, para operaciones de ordenamiento o hash joins).

  • Almacén de versiones: cuando se habilita el aislamiento de instantánea o el aislamiento de lectura confirmada mediante instantáneas (RCSI), SQL Server guarda las versiones de fila en tempdb. Las transacciones de larga duración impiden que estas versiones se limpien.

Si alguna de estas categorías crece demasiado —especialmente por transacciones prolongadas, un uso intensivo de tablas temporales o el aislamiento de instantáneas—, el archivo de datos de tempdb puede aumentar mucho más allá de su tamaño normal. Como contexto, consulte la documentación de Microsoft sobre tempdb.

Recuperación del espacio del archivo de datos de tempdb

El comando SHRINKFILE suele ser ineficaz para los archivos de datos de tempdb. La forma más confiable de recuperar espacio es restart the instance fuera del horario de mayor actividad. SQL Server restablece tempdb durante el inicio. Para más detalles, consulte Shrink the tempdb database.

Antes de reiniciar, diagnostique qué provocó el crecimiento para evitar que vuelva a ocurrir.

Escenario 1: tempdb tiene un tamaño grande actualmente (instancia en ejecución)

Paso 1: compruebe el espacio por tipo de objeto

Ejecute la siguiente consulta para ver cuánto espacio consume cada categoría (objetos de usuario, objetos internos y almacén de versiones):

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;

Como referencia, consulte sys.dm_db_file_space_usage.

Paso 2a: si los objetos de usuario o internos son grandes

Identifique qué sesiones utilizan más espacio en 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;

Como referencia, consulte sys.dm_db_session_space_usage.

Después, use el valor de session_id para encontrar la instrucción SQL que ejecuta la sesión:

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

Paso 2b: si el almacén de versiones es grande

Es probable que la base de datos tenga habilitado el aislamiento de instantáneas y que existan transacciones de larga duración que impidan la limpieza.

Compruebe qué bases de datos tienen habilitado el aislamiento de instantáneas:

SELECT
    name,
    is_read_committed_snapshot_on,
    snapshot_isolation_state
FROM sys.databases;

Si is_read_committed_snapshot_on o snapshot_isolation_state es 1, el aislamiento de instantáneas está activo.

Snapshot isolation state

Busque las sesiones con transacciones no confirmadas de larga duración que bloquean la limpieza del almacén de versiones:

SELECT * FROM sys.dm_tran_active_snapshot_database_transactions ORDER BY elapsed_time_seconds DESC;

Active snapshot transactions

Utilice el valor de session_id para revisar qué hace la sesión:

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

Session process details

Si el estado de la sesión es sleeping, compruebe la última instrucción ejecutada:

DBCC INPUTBUFFER(<session_id>);

DBCC INPUTBUFFER result

Escenario 2: investigación de un crecimiento anterior de tempdb después de un reinicio

Si la instancia ya se reinició y los datos en tiempo real no están disponibles, utilice las sesiones activas promedio (AAS), los registros de consultas lentas y los registros de auditoría para reconstruir lo sucedido.

Paso 1: identifique la ventana de crecimiento

En la página de detalles de la instancia, vaya a Monitoring and Alerts > Standard Monitoring. En la sección Instance Storage, anote cuándo comenzó y terminó de subir la métrica tmp_size. Tenga en cuenta que tempdb puede reutilizar primero el espacio libre existente. La expansión real del archivo ocurre solo cuando se agota dicho espacio, por lo que el crecimiento en la gráfica podría aparecer después del inicio de la operación SQL.

tmp_size metric

Paso 2: analice mediante AAS

Vaya a Autonomy Services > Performance Optimization > Performance Insight. Seleccione la ventana de tiempo y extienda la hora de inicio hacia atrás para capturar todas las operaciones relacionadas. Busque instrucciones SQL que utilicen de forma intensiva tablas temporales basadas en disco (por ejemplo, creación frecuente de tablas #).

Performance Insight AAS

Paso 3: filtre los registros de consultas lentas por palabra clave

Vaya a Autonomy Services > Slow Query Logs. Realice la búsqueda por palabra clave (por ejemplo, el nombre de una tabla temporal). Revise las horas de inicio y la duración de las consultas para determinar si la hora de finalización coincide con el momento en que tempdb dejó de crecer.

Slow query logs

Recuperación del espacio del archivo de registro de tempdb

Los archivos de registro de tempdb crecen cuando una transacción de larga duración impide el truncamiento del registro.

  1. Consulte log_reuse_wait_desc en sys.databases:

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

    Si LogReuseWaitDescription es NOTHING, reduzca el archivo de registro directamente con SHRINKFILE. Si muestra ACTIVE_TRANSACTION, finalice primero la transacción activa de larga duración.

    Log reuse wait status

  2. Localice la transacción de mayor duración en tempdb:

    USE tempdb;
    GO
    DBCC OPENTRAN;
    GO

    Anote el identificador de sesión (SPID) y la hora de inicio de la transacción.

    DBCC OPENTRAN result

  3. Revise qué hace la sesión:

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

    Session process

  4. Si el estado de la sesión es sleeping, compruebe la última instrucción ejecutada:

    DBCC INPUTBUFFER(<session_id>);

    DBCC INPUTBUFFER

Después de finalizar la transacción que causa el bloqueo, reduzca el archivo de registro de tempdb:

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

Recuperación de espacio de otros archivos

Qué abarca el espacio de otros archivos

El espacio de otros archivos corresponde a los archivos de las bases de datos del sistema: sqlserver.other_size, mastersize, modelsize y msdbsize. Por lo general, estos archivos son pequeños, pero pueden crecer de manera inesperada en dos escenarios:

  • Registros de errores: el archivo errorlog puede alcanzar varios gigabytes o más si la instancia genera muchos eventos de error.

  • Archivos de volcado de memoria: SQL Server genera volcados de memoria automáticamente durante excepciones críticas.

Identificación y limpieza de archivos de gran tamaño

  1. Vaya a Monitoring and Alerts > Standard Monitoring y compruebe el espacio que utilizan estos tipos de archivos. Para conocer las definiciones de las métricas, consulte View standard monitoring.

    Other file space monitoring

  2. Si errorlog consume una cantidad considerable de espacio, vaya a la página Logs para limpiar los registros de errores. Para ver las instrucciones, consulte Gestión de registros.

Si otros archivos del sistema (como sqlserver.other_size ) presentan un tamaño inesperadamente grande, póngase en contacto con el soporte técnico para identificar la causa raíz.

Ampliación del espacio de almacenamiento

Si el uso de espacio continúa siendo alto después de aplicar los pasos anteriores, amplíe la capacidad de almacenamiento de la instancia. Para ver las instrucciones, consulte Change instance specifications. El nuevo almacenamiento entra en vigor de inmediato, sin necesidad de reiniciar la instancia.