Tous les produits
Search
Centre de documentation

ApsaraDB RDS:Problèmes d'espace insuffisant pour RDS for SQL Server

Dernière mise à jour :Aug 08, 2026

Le manque d'espace de stockage sur une instance RDS for SQL Server peut entraîner des échecs d'écriture et empêcher la finalisation des sauvegardes. Cette rubrique explique comment identifier le type de fichier consommant l'espace et comment récupérer ou étendre le stockage.

Comprendre les concepts d'espace de stockage

Avant de dépanner, assurez-vous de bien comprendre la signification des valeurs d'espace :

Concept

Définition

Notes

Espace de données utilisé

Espace occupé par les données réelles stockées dans les fichiers de base de données

Augmente lors des insertions. Peut ne pas diminuer lors des suppressions si l'espace alloué est conservé.

Espace de données alloué

Espace de fichier formaté et réservé pour l'utilisation de la base de données

Croît automatiquement. Ne diminue pas après les suppressions sauf si vous exécutez une opération de réduction.

Espace de données alloué mais non utilisé

Différence entre l'espace alloué et l'espace utilisé

Quantité maximale que vous pouvez récupérer en réduisant les fichiers de données.

Taille totale du fichier

Taille sur disque des fichiers de données ou des fichiers journaux

Affichée dans les métriques de la console et sys.master_files. Inclut à la fois l'espace alloué et non alloué.

Important

Les métriques de la console et la plupart des API de surveillance signalent la taille du fichier (allouée), et non l'utilisation réelle des données. Pour afficher les deux valeurs simultanément, interrogez sys.dm_db_file_space_usage ou sys.master_files. Cette distinction détermine si la réduction libérera un espace significatif.

Afficher l'utilisation de l'espace

Utilisez l'une des méthodes suivantes pour vérifier l'utilisation actuelle de l'espace :

  • Méthode 1 — Page Informations de base : Affiche uniquement l'utilisation totale actuelle de l'espace. Aucune ventilation par type de fichier ni historique des tendances.

    Basic Information

  • Méthode 2 — Surveillance et alertes > Surveillance standard : Affiche l'espace disque ventilé par type de fichier (données, journal, temp, autre) et l'historique des tendances. Pour les définitions des métriques, consultez Afficher la surveillance standard.

    Monitoring and Alerts

  • Méthode 3 — Services d'autonomie > Gestion du stockage : Fournit une ventilation détaillée incluant l'utilisation des données par rapport aux journaux, l'historique des tendances et l'allocation d'espace pour les principales bases de données et tables. Pour plus d'informations, consultez Gestion de l'espace.

    La gestion du stockage n'est pas disponible pour les instances exécutant SQL Server 2008 R2 avec des disques cloud.

    Storage Management

  • Méthode 4 — SQL Server Management Studio (SSMS) ou un autre outil client : Connectez-vous directement à l'instance et exécutez des requêtes T-SQL. Pour les instructions de connexion, consultez Se connecter à une instance RDS for SQL Server à l'aide d'un client SSMS.

Les commandes T-SQL suivantes sont couramment utilisées pour inspecter l'utilisation de l'espace :

Commande ou vue

Ce qu'elle affiche

sp_helpdb

Taille totale (fichiers de données + fichiers journaux) pour chaque base de données

sp_spaceused

Nom, espace utilisé et espace non alloué pour la base de données actuelle

DBCC SQLPERF(LOGSPACE)

Taille totale du fichier journal et espace journal utilisé pour chaque base de données

DBCC SHOWFILESTATS

Espace de données total et utilisé pour tous les fichiers de données de la base de données actuelle

SELECT * FROM sys.master_files

Tailles des fichiers de données et des fichiers journaux pour chaque base de données

SELECT * FROM sys.dm_db_log_space_usage

Espace journal total et utilisé pour la base de données actuelle. Uniquement pour SQL Server 2012 et versions ultérieures.

SELECT * FROM sys.dm_db_file_space_usage

Espace de fichier de données total et utilisé pour la base de données actuelle. Uniquement pour SQL Server 2012 et versions ultérieures.

Si l'utilisation de l'espace est élevée, accédez à Monitoring and Alerts dans la console RDS et vérifiez quel type de fichier augmente le plus rapidement : données, journal, temp ou autre. Suivez ensuite la section pertinente ci-dessous.

Récupérer l'espace de données

Analyse des causes

La base de données tempdb est une base de données système dans SQL Server qui stocke des données temporaires. L'espace du fichier de données dans tempdb est fréquemment utilisé dans de nombreux scénarios, tels que :

  • Objets utilisateur : Tables temporaires créées par les utilisateurs.

  • Objets internes : Tables temporaires générées en interne par SQL Server.

  • Magasin de versions : Lorsque l'isolation instantanée ou l'instantané de lecture validée est activée pour une base de données, les informations de versioning sont stockées dans tempdb.

Si certaines opérations, telles que des transactions de longue durée, la création de nombreuses tables temporaires ou l'isolation instantanée, utilisent une grande quantité d'espace, le fichier de données peut devenir volumineux. Cela signifie que la taille du fichier augmente considérablement au-delà de sa plage normale. Pour plus d'informations, consultez le tutoriel officiel Microsoft pour la base de données tempdb.

Solutions

Une base de données RDS for SQL Server contient des fichiers de données et des fichiers journaux. Les méthodes pour récupérer l'espace pour chacun sont les suivantes :

Récupération de l'espace des fichiers de données

Si l'espace du fichier de données pour tempdb devient important, l'utilisation de la commande SHRINKFILE pour le réduire n'est pas très efficace. Vous pouvez plutôt redémarrer l'instance pendant les heures creuses pour libérer l'espace tempdb, comme décrit dans le tutoriel officiel Microsoft (Réduire la base de données tempdb).

Vous pouvez utiliser les solutions suivantes pour analyser l'utilisation de l'espace des fichiers de données tempdb :

Scénario 1 : L'espace du fichier de données tempdb est important

  1. Si une grande quantité d'espace de fichier de données tempdb est utilisée, exécutez l'instruction SQL suivante. Utilisez la vue système sys.dm_db_file_space_usage pour vérifier l'espace tempdb utilisé par différents types d'objets (User Objects, Internal Objects et Version Store) :

    Pour plus d'informations sur l'utilisation de sys.dm_db_file_space_usage, consultez le tutoriel officiel 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. Si User Objects ou Internal Objects utilisent une grande quantité d'espace :

    1. Exécutez l'instruction SQL suivante. Vous pouvez utiliser la vue système sys.dm_db_session_space_usage pour trouver quelles sessions utilisent une grande quantité d'espace tempdb :

      Pour plus d'informations sur l'utilisation de sys.dm_db_session_space_usage, consultez le tutoriel officiel 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. Utilisez l'ID de session renvoyé pour interroger l'instruction SQL que la session est en train d'exécuter :

      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 le Version Store utilise une grande quantité d'espace, la base de données a probablement l'isolation instantanée activée. Cela entraîne le stockage de nombreuses versions instantanées dans tempdb.

    1. Interrogez les bases de données ayant l'isolation instantanée activée :

      SELECT 
          name, 
          is_read_committed_snapshot_on, 
          snapshot_isolation_state 
      FROM sys.databases;

      Si la valeur du champ is_read_committed_snapshot_on ou snapshot_isolation_state est 1, la base de données correspondante a l'isolation instantanée activée, comme illustré dans la figure suivante :

      image

    2. Utilisez la vue système sys.dm_tran_active_snapshot_database_transactions pour vérifier les sessions avec des transactions de longue durée qui n'ont pas été validées. Ces transactions empêchent les enregistrements dans le Version Store d'être nettoyés automatiquement :

      SELECT * FROM sys.dm_tran_active_snapshot_database_transactions ORDER BY elapsed_time_seconds DESC;

      Les détails sont les suivants :

      image

    3. Après avoir obtenu le session_id, interrogez sys.sysprocesses et sys.dm_exec_requests/sys.dm_exec_sql_text pour vérifier l'état de la session et la commande exécutée :

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

      Les détails sont les suivants :

      image

    4. Si l'état de la session est sleeping, utilisez la commande SQL suivante pour vérifier l'instruction exécutée :

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

      Les détails sont les suivants :

      image

Scénario 2 : Investigation de la cause de la croissance passée de l'espace tempdb après un redémarrage

Si les données en direct ne sont pas disponibles, analysez le problème à l'aide des Sessions Actives Moyennes (AAS), des journaux de requêtes lentes et des journaux d'audit. Les étapes sont les suivantes :

  1. Analysez les heures de début et de fin de la croissance de l'espace tempdb

    Tout d'abord, analysez la tendance de croissance de l'utilisation de l'espace tempdb. Sur la page des détails de l'instance, accédez à Monitoring and Alerts > Standard Monitoring. Dans la section Instance Storage, notez les heures de début et de fin lorsque la métrique tmp_size a augmenté. Lorsqu'une opération SQL démarre, tempdb peut encore disposer d'espace libre disponible qui est réutilisé en premier. Par conséquent, l'heure réelle d'expansion de l'espace peut être postérieure à l'heure de début de l'opération SQL. Le système déclenche une opération d'expansion de fichier pour allouer un nouvel espace de stockage uniquement après l'épuisement de l'espace existant dans tempdb.

    image

  2. Analysez à l'aide d'AAS (Average Active Sessions)

    Sur la page des détails de l'instance, accédez à Autonomy Service > Performance Optimization > Performance Insight. Sélectionnez la période cible. Étendez le début de la plage de temps pour vous assurer de capturer toutes les opérations connexes. Analysez les enregistrements d'exécution SQL dans cette période pour identifier les opérations qui utilisent fortement les tables temporaires basées sur le disque.

    Par exemple, vérifiez la création et l'utilisation de tables temporaires telles que #RKD_SJ. L'utilisation fréquente de ces tables temporaires peut être une cause majeure de la croissance de l'espace tempdb.

    image

  3. Analysez en filtrant les journaux de requêtes lentes par mots-clés

    Sur la page des détails de l'instance, accédez à Autonomy Service > Slow Query Logs. Filtrez les journaux de requêtes lentes par mot-clé. Vérifiez le temps d'exécution SQL et l'heure de début. Analysez si l'heure de fin de la requête correspond au moment où l'espace tempdb a cessé de croître.

    image

Récupération de l'espace des fichiers journaux

Si l'espace du fichier journal pour tempdb devient important, c'est généralement parce qu'une transaction de longue durée empêche la troncation du journal. Récupérez l'espace comme suit :

  1. Vérifiez le type d'attente de réutilisation du journal dans le champ log_reuse_wait_desc de sys.database. Si le type d'attente de réutilisation du journal est ACTIVE_TRANSACTION, une transaction de longue durée existe.

  2. Identifiez les transactions de longue durée s'exécutant dans la base de données tempdb. Après avoir mis fin aux transactions de longue durée, utilisez SHRINKFILE pour réduire le fichier journal.

Vous pouvez utiliser les solutions suivantes pour analyser l'utilisation de l'espace des fichiers journaux tempdb :

  1. Tout d'abord, vérifiez l'état du fichier journal de la base de données.

    Dans les résultats d'exécution, vérifiez l'état de l'espace journal tempdb. Si LogReuseWaitDescription est NOTHING, réduisez le fichier journal directement avec SHRINKFILE. Si la valeur n'est pas NOTHING, comme la valeur courante ACTIVE_TRANSACTION, une transaction active de longue durée existe. Mettez fin à la transaction de longue durée avant de réduire le fichier journal avec SHRINKFILE.

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

    image

  2. La croissance du fichier journal tempdb est souvent causée par des transactions actives de longue durée. Utilisez la commande SQL suivante pour vérifier la transaction la plus longue dans la base de données tempdb et décider si vous devez y mettre fin :

    USE tempdb;
    GO
    DBCC OPENTRAN;
    GO

    Comme illustré dans la figure suivante, notez l'ID de session (SPID) et l'heure de début de la transaction (Start time) :

    image

  3. Ensuite, vérifiez ce que fait la session et son état. Utilisez l'ID de session de l'étape précédente :

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

    Par exemple :

    image

  4. Si l'état de la session est sleeping, utilisez la commande SQL suivante pour vérifier l'instruction exécutée :

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

    La figure suivante montre un exemple.

    image

Fonctionnement de l'espace de données

L'espace total de données équivaut à la somme de toutes les tailles de fichiers de données, divisée en deux parties :

  • Espace alloué : Espace attribué aux tables ou aux index. Comprend à la fois les lignes contenant des données et les pages réservées pour les insertions futures dans la même table ou le même index. Les autres objets ne peuvent pas utiliser cet espace directement.

  • Espace non alloué : Étendues complètement libres (chaque étendue est de 64 Ko d'espace contigu) non associées à aucun objet. La réduction d'un fichier restitue cet espace au système d'exploitation.

Si les données continuent de croître, l'espace non alloué est généralement faible. La réduction directe des fichiers a peu d'effet. Récupérez d'abord l'espace alloué, puis envisagez la réduction.

Récupérer l'espace alloué

Archiver ou supprimer des données

Supprimez ou migrez les données rarement consultées — par exemple, les anciens enregistrements historiques — vers une autre instance ou un format d'archive. Cela réduit directement l'espace de données utilisé et constitue la solution à long terme la plus efficace, bien qu'elle nécessite des modifications de la logique applicative et de la conception de la base de données.

Compresser les données

Les instances exécutant SQL Server 2016 ou versions ultérieures, ainsi que les instances Enterprise Edition exécutant des versions antérieures, prennent en charge la compression de ligne et de page au niveau de la table, de l'index ou de la partition. Pour plus de détails, consultez Compression des données.

Les économies varient considérablement (10–90 %) selon le schéma, les types de colonnes et la distribution des données. Utilisez sp_estimate_data_compression_savings pour estimer les économies avant d'activer la compression.

La modification des paramètres de compression est une opération DDL (Data Definition Language). Sur les grandes tables, cela peut provoquer des verrous de table de longue durée. Exécutez-la pendant les heures creuses.
Sur les instances Enterprise Edition, définissez ONLINE = ON pour minimiser l'impact sur l'activité.
La compression augmente la surcharge CPU. Activez-la uniquement sur les grandes tables où les économies d'espace justifient le coût.

Défragmenter les index

Une fragmentation élevée des index ralentit les requêtes et gaspille du stockage. Pour afficher les taux de fragmentation, accédez à Autonomy Services > Performance Optimization et cliquez sur l'onglet Index Usage. La console affiche le taux de fragmentation par table et suggère s'il faut reconstruire ou réorganiser chaque index.

Le taux de fragmentation des index mesure le pourcentage de pages d'index logiquement adjacentes qui ne sont pas physiquement adjacentes. Cela diffère du pourcentage d'espace libre dans les pages. Pour mesurer l'espace libre moyen par page, interrogez sys.dm_db_index_physical_stats en mode SAMPLED ou DETAILED et vérifiez la colonne avg_page_space_used_in_percent . Pour plus de détails, consultez sys.dm_db_index_physical_stats (Transact-SQL) . Cette requête lit de nombreuses pages d'index — exécutez-la pendant les heures creuses.

Reconstruction d'index (REBUILD) : Recrée complètement l'index. Plus efficace que la réorganisation pour les index fortement fragmentés. Par défaut, verrouille la table pendant l'opération. Sur les instances Enterprise Edition, définissez ONLINE = ON pour éviter les verrous de table prolongés.

Important

Une reconstruction augmente temporairement le stockage de la base de données et la taille du journal de manière significative. Avant de reconstruire, vérifiez que l'instance dispose d'un espace de stockage libre au moins deux fois supérieur à la taille de l'index en cours de reconstruction.

  • Vérifiez l'espace libre : accédez à la page Basic Information de l'instance et consultez la section Instance Resources.

  • Si l'espace libre est insuffisant, étendez le stockage d'abord. Le nouvel espace prend effet immédiatement sans redémarrage.

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

Après la reconstruction, la console met à jour les statistiques d'index de manière asynchrone. Cliquez sur Recollect pour obtenir les dernières données, puis cliquez sur Export Script pour télécharger et vérifier le taux de fragmentation.

Index Usage

Réorganisation d'index (REORGANIZE) : Restructure les pages de niveau feuille sans verrouiller la table. Moins efficace que la reconstruction, mais appropriée pour les index faiblement fragmentés.

Réduire les fichiers de données

Après avoir récupéré l'espace alloué à l'aide des méthodes ci-dessus, utilisez l'une des approches suivantes si la pression sur le stockage persiste.

Important

Une seule opération de réduction à grande échelle peut provoquer une croissance significative du journal des transactions et un blocage prolongé. Utilisez la méthode 1 pour réduire par petits lots.

Méthode 1 — Boucle de réduction incrémentielle (recommandée)

Réduisez par itérations d'environ 5 Go chacune. Le script suivant s'applique à SQL Server 2012 et versions ultérieures :

-- 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éthode 2 — DBCC SHRINKFILE direct

Exécutez DBCC SHRINKFILE pour réduire un seul fichier de données à une taille cible. Cela restitue l'espace non alloué au système d'exploitation. Pour référence, consultez Réduire une base de données et DBCC SHRINKFILE.

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

Cliquez pour afficher un exemple

Exemple : Dans la figure ci-dessous, chaque étendue est de 64 Ko. Taille totale du fichier de données = (1673344 × 64) / 1024 = 104 584 Mo. Espace alloué = (1313432 × 64) / 1024 = 82 089,5 Mo. Le fichier ne peut pas être réduit en dessous de 82 089,5 Mo. Pour réduire à 90 000 Mo, exécutez :

DBCC SHRINKFILE(1, 90000)

DBCC SHRINKFILE example

Résoudre les problèmes courants d'espace de données

Après la reconstruction d'un index, pourquoi le taux de fragmentation dans la table Index Usage ne se met-il pas à jour ?

Une fois la reconstruction terminée, la console collecte les statistiques mises à jour de manière asynchrone en arrière-plan. Cliquez sur Recollect pour déclencher une actualisation manuelle. Une fois la collecte terminée, cliquez sur Export Script pour télécharger et vérifier le taux de fragmentation actuel.

Index Usage after rebuild

Après avoir exécuté SHRINKFILE, pourquoi l'opération reste-t-elle bloquée sans progression ?

Description du problème

Dans une instance Alibaba Cloud RDS for SQL Server, lorsque vous tentez d'exécuter l'opération SHRINKFILE sur un fichier de données ou un fichier journal de base de données pour récupérer l'espace libre, vous pouvez rencontrer les problèmes suivants :

  • La commande SHRINKFILE ne se termine pas pendant une longue période.

  • Le pourcentage de progression (percent_complete) n'est pas mis à jour pendant une longue période.

De tels problèmes sont généralement causés par un blocage dû à des transactions de longue durée, en particulier lorsque l'Isolation Instantanée est activée pour la base de données, car la conservation des versions instantanées empêche l'opération SHRINKFILE de se terminer normalement.

Solution

  1. Connectez-vous à l'instance RDS for SQL Server à l'aide de SQL Server Management Studio (SSMS).

  2. Exécutez la requête suivante pour confirmer l'état et la progression de l'opération 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 colonne status indique suspended et que la valeur dans la colonne percent_complete n'a pas été mise à jour depuis longtemps, l'opération SHRINKFILE est bloquée. Passez à l'étape suivante.

    image

  3. Vérifiez le journal des erreurs RDS for SQL Server pour un message similaire au suivant :

    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.

    Résultat exemple :

    Ce journal indique que, parce que l'isolation instantanée est activée pour la base de données, l'opération SHRINKFILE est bloquée par une transaction instantanée et ne peut pas progresser.

    image

  4. Exécutez la requête suivante pour vérifier si l'isolation instantanée est activée pour la base de données :

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

    Si is_read_committed_snapshot_on=1 ou snapshot_isolation_state_desc=ON, la fonctionnalité instantanée est activée pour la base de données, et vous devez enquêter davantage sur les transactions de longue durée.

    image

  5. Exécutez l'instruction SQL suivante pour vérifier les transactions de longue durée susceptibles de causer le blocage et vérifier leur durée :

    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;

    Une fois l'exécution terminée, portez une attention particulière aux champs session_id et elapsed_time_seconds. Le champ elapsed_time_seconds indique la durée de la transaction. Une valeur plus élevée indique que la transaction s'exécute depuis plus longtemps et nécessite plus d'attention. Si vous constatez que certaines transactions de longue durée causent un blocage, vous pouvez envisager de terminer (KILL) ces transactions et observer si l'opération SHRINKFILE reprend.

    Remarque

    Une opération SHRINKFILE bloquée n'est pas nécessairement causée par des transactions de longue durée dans la base de données actuelle. La cause racine peut également être des transactions de longue durée dans d'autres bases de données avec des instantanés activés, en particulier dans les scénarios impliquant des requêtes inter-bases de données. Par conséquent, lors du dépannage, vous devez vérifier l'état des transactions de toutes les bases de données concernées pour identifier et résoudre précisément le problème.

    image

  6. Si vous confirmez grâce aux étapes précédentes qu'une ou plusieurs transactions de longue durée bloquent l'opération SHRINKFILE, évaluez si vous pouvez arrêter (KILL) ces transactions pour reprendre l'exécution normale de l'opération SHRINKFILE. Notez que l'arrêt d'une transaction de longue durée entraîne son annulation. Par conséquent, avant d'exécuter l'opération KILL, évaluez pleinement l'impact de l'annulation sur votre activité. Si vous ne pouvez pas arrêter les transactions de longue durée pour des raisons commerciales, suivez les suggestions suivantes :

    • Attendez que la transaction de longue durée se termine. Une fois terminée, exécutez à nouveau l'opération SHRINKFILE.

    • Arrêtez l'opération SHRINKFILE. Si la fenêtre actuelle n'est pas un moment approprié pour attendre, arrêtez l'opération SHRINKFILE et reprogrammez-la pour une fenêtre de maintenance appropriée.

Récupérer l'espace journal

Vérifier l'utilisation de l'espace journal

Utilisez DBCC SQLPERF(LOGSPACE) ou la page Monitoring and Alerts pour vérifier le pourcentage d'espace utilisé dans le fichier journal de chaque base de données.

Si le pourcentage utilisé est élevé, la réduction du fichier journal aura peu d'effet. Le journal ne peut pas être tronqué tant que la condition de blocage n'est pas résolue. Interrogez sys.databases et vérifiez la colonne log_reuse_wait_desc pour identifier pourquoi la troncation est en attente :

SELECT name, log_reuse_wait, log_reuse_wait_desc FROM sys.databases;

Pour la liste complète des valeurs log_reuse_wait_desc, consultez sys.databases (Transact-SQL).

Réduire les journaux des transactions

Avertissement

Si le journal des transactions est plein, vous ne pouvez pas le réduire depuis la console. Vous devez exécuter SQL manuellement, ce qui comporte des risques. Étendez d'abord le stockage sur disque lorsque cela est possible. Pour les procédures d'urgence, consultez Solution pour l'espace journal insuffisant (pour usage d'urgence uniquement).

Choisissez l'approche adaptée à votre situation :

Solution 1 : Réduction mono-base de données (sans sauvegarde)

Solution 2 : Sauvegarde et réduction au niveau de l'instance

Portée

Base de données unique

Instance entière

Sauvegarde

Aucune sauvegarde effectuée

Sauvegarde automatique de tous les journaux des transactions d'abord

Vitesse

Rapide

Plus lente — la sauvegarde s'exécute avant la réduction

À utiliser lorsque

Le journal croît rapidement et vous ne pouvez pas attendre une sauvegarde planifiée

L'espace journal est suffisant et vous souhaitez une optimisation globale

Impact sur les autres bases de données

Aucun

Affecte l'instance entière

Comment exécuter

Réduire les journaux des transactions de la base de données

Sauvegarder et réduire les journaux des transactions

Une fois la réduction terminée, accédez à Monitoring and Alerts pour vérifier l'espace journal mis à jour.

Log space after shrink

Récupérer l'espace tempdb

Utilisation de l'espace par tempdb

tempdb est une base de données système SQL Server qui stocke des données temporaires. Trois catégories d'objets consomment son espace de fichier de données :

  • Objets utilisateur : Tables temporaires créées par les sessions utilisateur (par exemple, #TempTable).

  • Objets internes : Structures temporaires créées en interne par SQL Server (par exemple, pour les opérations de tri ou les jointures de hachage).

  • Magasin de versions : Lorsque l'isolation instantanée ou l'isolation instantanée de lecture validée (RCSI) est activée, SQL Server stocke les versions de ligne dans tempdb. Les transactions de longue durée empêchent le nettoyage de ces versions.

Si l'une de ces catégories devient importante — en particulier à cause de transactions de longue durée, d'une utilisation intensive de tables temporaires ou de l'isolation instantanée — le fichier de données tempdb peut devenir volumineux bien au-delà de sa taille normale. Pour plus de contexte, consultez la documentation Microsoft sur tempdb.

Récupérer l'espace du fichier de données tempdb

SHRINKFILE est généralement inefficace pour les fichiers de données tempdb. Le moyen le plus fiable de récupérer de l'espace consiste à redémarrer l'instance pendant les heures creuses. SQL Server réinitialise tempdb au démarrage. Pour plus de détails, consultez Réduire la base de données tempdb.

Avant de redémarrer, diagnostiquez ce qui a causé la croissance afin de prévenir sa récurrence.

Scénario 1 : tempdb est actuellement volumineux (instance active)

Étape 1 — Vérifiez l'espace par type d'objet

Exécutez la requête suivante pour voir combien d'espace chaque catégorie (objets utilisateur, objets internes, magasin de versions) consomme :

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;

Pour référence, consultez sys.dm_db_file_space_usage.

Étape 2a — Si les objets utilisateur ou les objets internes sont volumineux

Trouvez quelles sessions utilisent le plus d'espace 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;

Pour référence, consultez sys.dm_db_session_space_usage.

Ensuite, utilisez le session_id pour trouver l'instruction SQL que la session exécute :

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

Étape 2b — Si le magasin de versions est volumineux

La base de données a probablement l'isolation instantanée activée avec des transactions de longue durée empêchant le nettoyage.

Vérifiez quelles bases de données ont l'isolation instantanée activée :

SELECT
    name,
    is_read_committed_snapshot_on,
    snapshot_isolation_state
FROM sys.databases;

Si is_read_committed_snapshot_on ou snapshot_isolation_state est 1, l'isolation instantanée est active.

Snapshot isolation state

Trouvez les sessions avec des transactions non validées de longue durée qui bloquent le nettoyage du magasin de versions :

SELECT * FROM sys.dm_tran_active_snapshot_database_transactions ORDER BY elapsed_time_seconds DESC;

Active snapshot transactions

Utilisez le session_id pour vérifier ce que fait la session :

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

Session process details

Si l'état de la session est sleeping, vérifiez la dernière instruction exécutée :

DBCC INPUTBUFFER(<session_id>);

DBCC INPUTBUFFER result

Scénario 2 : Investigation de la croissance passée de tempdb après un redémarrage

Si l'instance a déjà été redémarrée et que les données en direct ne sont pas disponibles, utilisez les Sessions Actives Moyennes (AAS), les journaux de requêtes lentes et les journaux d'audit pour reconstituer ce qui s'est passé.

Étape 1 — Trouvez la fenêtre de croissance

Sur la page des détails de l'instance, accédez à Monitoring and Alerts > Standard Monitoring. Dans la section Instance Storage, notez quand la métrique tmp_size a commencé et arrêté d'augmenter. Gardez à l'esprit que tempdb peut réutiliser d'abord l'espace libre existant — l'expansion réelle du fichier se produit uniquement après l'épuisement de l'espace existant, donc la croissance dans le graphique peut être en retard par rapport au début de l'opération SQL.

tmp_size metric

Étape 2 — Analysez à l'aide d'AAS

Accédez à Autonomy Services > Performance Optimization > Performance Insight. Sélectionnez la fenêtre de temps, en étendant l'heure de début plus tôt pour capturer toutes les opérations connexes. Recherchez les instructions SQL qui utilisent fortement les tables temporaires basées sur le disque (par exemple, création fréquente de tables #).

Performance Insight AAS

Étape 3 — Filtrez les journaux de requêtes lentes par mot-clé

Accédez à Autonomy Services > Slow Query Logs. Recherchez par mot-clé (par exemple, un nom de table temporaire). Vérifiez les heures de début et les durées des requêtes pour voir si l'heure de fin de la requête correspond au moment où tempdb a cessé de croître.

Slow query logs

Récupérer l'espace du fichier journal tempdb

Les fichiers journaux tempdb augmentent lorsqu'une transaction de longue durée empêche la troncation du journal.

  1. Vérifiez log_reuse_wait_desc dans sys.databases :

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

    Si LogReuseWaitDescription est NOTHING, réduisez le fichier journal directement avec SHRINKFILE. Si cela indique ACTIVE_TRANSACTION, mettez d'abord fin à la transaction active de longue durée.

    Log reuse wait status

  2. Trouvez la transaction la plus longue dans tempdb :

    USE tempdb;
    GO
    DBCC OPENTRAN;
    GO

    Notez l'ID de session (SPID) et l'heure de début de la transaction.

    DBCC OPENTRAN result

  3. Vérifiez ce que fait la session :

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

    Session process

  4. Si l'état de la session est sleeping, vérifiez sa dernière instruction exécutée :

    DBCC INPUTBUFFER(<session_id>);

    DBCC INPUTBUFFER

Après avoir mis fin à la transaction bloquante, réduisez le fichier journal tempdb :

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

Récupérer l'espace d'autres fichiers

Ce que comprend l'espace d'autres fichiers

L'espace d'autres fichiers couvre les fichiers de base de données système : sqlserver.other_size, mastersize, modelsize et msdbsize. Ceux-ci sont généralement petits, mais peuvent augmenter de manière inattendue dans deux scénarios :

  • Journaux d'erreurs : Le fichier errorlog peut atteindre plusieurs gigaoctets ou plus si l'instance génère de nombreux événements d'erreur.

  • Fichiers de vidage mémoire : SQL Server génère automatiquement des vidages mémoire lors d'exceptions critiques.

Identifier et effacer les fichiers trop volumineux

  1. Accédez à Monitoring and Alerts > Standard Monitoring et vérifiez l'espace utilisé par ces types de fichiers. Pour les définitions des métriques, consultez Afficher la surveillance standard.

    Other file space monitoring

  2. Si errorlog consomme une grande quantité d'espace, accédez à la page Logs pour effacer les journaux d'erreurs. Pour les instructions, consultez Gérer les journaux.

Si d'autres fichiers système (tels que sqlserver.other_size ) sont anormalement volumineux, contactez le support technique pour identifier la cause racine.

Étendre l'espace de stockage

Si l'utilisation de l'espace reste élevée après avoir appliqué les étapes ci-dessus, étendez la capacité de stockage de l'instance. Pour les instructions, consultez Modifier les spécifications de l'instance. Le nouveau stockage prend effet immédiatement sans redémarrage de l'instance.