web-dev-qa-db-fra.com

Table tronquée de 200 Go mais espace disque non libéré

Il ne me reste que 2 Go, je dois donc supprimer cette table d'historique. Cette table est maintenant vide mais l'espace disque de la base de données n'est pas libéré. Et le fichier de base de données est de 320 Go.

23

Si vous faites référence à la consommation réelle de fichiers de base de données sur le volume, alors SQL Server ne gère pas cela automatiquement. Ce n'est pas parce que vous avez supprimé des données de la base de données que les fichiers de la base de données rétréciront pour n'adapter qu'aux données existantes.

Ce que vous rechercheriez, si vous avez pour récupérer de l'espace sur le volume, réduirait le fichier particulier avec DBCC SHRINKFILE . Il convient de noter quelques bonnes pratiques, conformément à cette documentation:

Meilleures pratiques

Tenez compte des informations suivantes lorsque vous prévoyez de réduire un fichier:

  • Une opération de réduction est plus efficace après une opération qui crée beaucoup d'espace inutilisé, comme une table tronquée ou une opération de suppression de table.

  • La plupart des bases de données nécessitent de l'espace libre pour les opérations quotidiennes normales. Si vous réduisez une base de données à plusieurs reprises et remarquez que la taille de la base de données augmente à nouveau, cela indique que l'espace qui a été réduit est requis pour les opérations normales. Dans ces cas, la réduction répétée de la base de données est une opération inutile.

  • Une opération de réduction ne préserve pas l'état de fragmentation des index dans la base de données et augmente généralement la fragmentation dans une certaine mesure. C'est une autre raison de ne pas réduire à plusieurs reprises la base de données.

  • Rétrécissez plusieurs fichiers dans la même base de données de manière séquentielle au lieu de simultanément. Les conflits sur les tables système peuvent entraîner des retards dus au blocage.

A noter également:

DBCC SHRINKFILE les opérations peuvent être arrêtées à tout moment du processus et tout travail terminé est conservé.

Il y a sûrement quelques éléments à considérer lors de cette opération, et je vous recommande de jeter un œil à article de blog de Paul Randal sur ce qui se passe lorsque vous effectuez cette opération.

La première étape serait certainement de vérifier combien d'espace et d'espace libre vous pouvez réellement remplacer, ainsi que l'espace utilisé sur le (s) fichier (s):

use AdventureWorks2012;
go

;with db_file_cte as
(
    select
        name,
        type_desc,
        physical_name,
        size_mb = 
            convert(decimal(11, 2), size * 8.0 / 1024),
        space_used_mb = 
            convert(decimal(11, 2), fileproperty(name, 'spaceused') * 8.0 / 1024)
    from sys.database_files
)
select
    name,
    type_desc,
    physical_name,
    size_mb,
    space_used_mb,
    space_used_percent = 
        case size_mb
            when 0 then 0
            else convert(decimal(5, 2), space_used_mb / size_mb * 100)
        end
from db_file_cte;
25
Thomas Stringer

En plus des réponses de Tom et Shanky, si votre base de données contient des données LOB/BLOB, le DBCC SHRINKFILE peut ne pas fonctionner. Si tel est le cas, vous disposez de deux options, selon que vous pouvez mettre la base de données hors ligne ou non. Si vous pouvez mettre la base de données hors ligne, vous devrez copier les données et les recopier pour supprimer l'espace vide. Vous pouvez accomplir cela par l'un des moyens suivants:

  1. Utilisation d'une instruction SELECT INTO pour transférer la table entière vers une nouvelle table. Supprimez la table d'origine, exécutez DBCC SHRINKFILE . Renommez la nouvelle table en son nom d'origine.
  2. À l'aide de bcp pour copier la table en mode natif, supprimez la table, exécutez DBCC SHRINKFILE , créez une table, puis bcp les données dans la table.
  3. Utilisez Export/Import pour déplacer toutes les données vers une nouvelle base de données, supprimez la base de données existante, renommez la nouvelle base de données en son nom d'origine.

Si vous ne pouvez pas mettre la base de données hors ligne, vous pouvez utiliser DBCC SHRINKFILE avec la commande [~ # ~ ] emptyfile [~ # ~] option.

Détails pour la copie hors ligne: http://support.Microsoft.com/kb/324432/en-us

Informations actuelles sur l'option EMPTYFILE http://msdn.Microsoft.com/en-us/library/ms189493 (v = sql.105) .aspx

6
stacylaray

Il s'agit d'un comportement normal lorsque vous tronquez la table et qui implique la suppression de plus de 128 extensions comme Per Books Online

Lorsque vous supprimez ou reconstruisez des index volumineux, ou supprimez ou tronquez des tables volumineuses, le moteur de base de données reporte les désallocations de page réelles et leurs verrous associés jusqu'à ce qu'une transaction soit validée. Cette implémentation prend en charge à la fois la validation automatique et les transactions explicites dans un environnement multi-utilisateur, et s'applique aux grandes tables et aux index qui utilisent plus de 128 extensions.

Le moteur de base de données évite les verrous d'allocation requis pour supprimer des objets volumineux en divisant le processus en deux phases distinctes: logique et physique.

Dans la phase logique, les unités d'allocation existantes utilisées par la table ou l'index sont marquées pour la désallocation et verrouillées jusqu'à ce que la transaction soit validée. Avec un index cluster qui est supprimé, les lignes de données sont copiées puis déplacées vers de nouvelles unités d'allocation créées dans le magasin, soit un index cluster reconstruit, soit un segment. (Dans le cas d'une reconstruction d'index, les lignes de données sont également triées.) En cas de restauration, seule cette phase logique doit être restaurée.

La phase physique se produit après la validation de la transaction. Les unités d'allocation marquées pour la désallocation sont physiquement supprimées par lots. Ces suppressions sont traitées dans de courtes transactions qui se produisent en arrière-plan et ne nécessitent pas beaucoup de verrous.

Étant donné que la phase physique se produit après la validation d'une transaction, l'espace de stockage de la table ou de l'index peut toujours apparaître comme indisponible. Si cet espace est nécessaire à la croissance de la base de données avant la fin de la phase physique, le moteur de base de données tente de récupérer de l'espace à partir des unités d'allocation marquées pour la désallocation. Pour trouver l'espace actuellement utilisé par ces unités d'allocation, utilisez la vue de catalogue sys.allocation_units.

Les opérations de suppression différée ne libèrent pas immédiatement l'espace alloué et entraînent des frais généraux supplémentaires dans le moteur de base de données. Par conséquent, les tables et les index qui utilisent 128 extensions ou moins sont supprimés, tronqués et reconstruits comme dans SQL Server 2000. Cela signifie que les phases logique et physique se produisent avant la validation de la transaction.

Vous devrez attendre et bien sûr vous devrez manuellement réduire le fichier pour récupérer de l'espace, il convient également de mentionner que le rétrécissement provoque une fragmentation logique et doit être évité à moins que votre besoin ne soit grave. Vous auriez à un certain équilibre entre le rétrécissement et la fragmentation. Il vaut mieux vous demander si la réduction résoudrait réellement le problème compte tenu du scénario dans lequel les données augmenteront à nouveau de toute façon.

Utilisez la requête ci-dessous pour vérifier la quantité d'espace libre dans la base de données

SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;
6
Shanky