Commandes DBCC SHRINKFILE et SHRINKDATABASE peuvent ne pas fonctionnent en raison de sparsely remplie texte, ntext ou image colonnes

Traductions disponibles Traductions disponibles
Numéro d'article: 324432 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Symptômes

Les commandes DBCC SHRINKFILE et DBCC SHRINKDATABASE ne pas déplacer des données et réduire la taille du fichier Si la valeur EstimatedPages est égale à la valeur MinimumSize qui est signalée lorsque la commande se termine. En raison de requêtes de modification des données sur des tables avec types de données objet BLOB binary large () Object ( texte , ntext , image ), il est possible pour que plusieurs étendues d'uniformes alloués qui sont sparsely remplies avec des données (par exemple, uniquement 1 sur 8 pages que les contrôles d'étendue est affecté), qui entraîne la DBCC SHRINKFILE et le DBCC SHRINKDATABASE commandes à over-estimate le nombre de EstimatedPages et les commandes n'effectuent pas les opérations de réduction. En général, dans le cas où ce comportement est rencontré, la taille d'une sauvegarde complète de la base de données est jusqu'à 8 fois inférieure à la taille des fichiers de la base de données après avoir exécuté un DBCC SHRINKFILE sur les fichiers de base de données.

Résolution

Si les tables concernées est inutile d'être connecté en permanence pendant que vous corrigez cette situation, vous pouvez utiliser l'une des solutions de contournement suivantes pour résoudre ce problème :
  • Utiliser une instruction SELECT INTO pour transférer l'ensemble du tableau à une nouvelle table dans la même base de données. Supprimer la table d'origine, puis exécutez une instruction DBCC SHRINKFILE. Renommez la nouvelle table en le nom de table d'origine.
  • Une instruction SELECT INTO permet de transférer l'ensemble du tableau à une nouvelle table dans une base de données différente. Tronquer la table d'origine et exécutez une instruction DBCC SHRINKFILE. Transférer les données de nouveau vers la table d'origine.
  • Le programme copie en bloc permet de copier la table en mode natif. Scripts de la table, puis supprimer la table existante. Exécutez une instruction DBCC SHRINKFILE. Créer une nouvelle table et puis utilisez le programme copie en bloc pour copier les données de retour à la table.
  • DTS (Data Transformation Services) permet de transférer la base de données entière vers une nouvelle base de données. SQL Server 7.0 Data Transformation Services peut ne transfère pas de texte et image données plues à 64 Ko correctement. Ce problème ne s'applique pas à la version de SQL Server 2000 de Data Transformation Services. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
    257425 CORRECTIF : transfert d'objet DTS ne transfert pas données BLOB Plues de 64
    Vous pouvez rechercher des colonnes de texte et image qui sont supérieures à 64 Ko avec la requête suivante :
    SELECT MAX (DATALENGTH (TextImageColumn)) FROM TableName
    si les données texte et image sont supérieure à 64 Ko, le transfert tronque les données et ne génère pas toute erreur sauf dans le DTS des fichiers journaux. Si vous disposez données texte ou l'image est supérieure à 64 Ko, utilisez les informations dans le troisième élément de puce pour les tables contenant des données texte ou l'image. Ensuite, utilisez DTS pour le reste des éléments dans la base de données.
Si la base de données doit être en ligne ou la taille de la base de données est trop grande pour déplacer les données dans un fichier externe ou une autre base de données, vous pouvez utiliser la commande DBCC SHRINKFILE avec l'option EMPTYFILE. Pour utiliser ce travail autour, procédez comme suit :
  1. Si vous exécutez Microsoft SQL Server 7.0 Service Pack 3, activer les indicateurs de suivi 1180 et 1197.
  2. Si vous exécutant Microsoft SQL Server 7.0 Service Pack 3 créer 7.00.987, ou version ultérieure, y compris Service Pack 4, Activer suivi indicateur 1180.
  3. Si vous avez double la base de données dans plusieurs fichiers de problèmes d'espace disque ou des raisons de performances, créer 1 ou plus des fichiers dans la base de données en utilisant la commande ALTER DATABASE avec une taille totale comparable aux résultats de la requête suivante.
    select 'size in MB'=ceiling(sum(ei.pg_alloc)/128.000), sfg.groupname
    from extentinfo ei inner join sysfiles sf on ei.[file_id] = sf.fileid and ei.[file_id] != 1
     inner join sysfilegroups sfg on sf.groupid = sfg.groupid
    group by sfg.groupname
    Remarque : la requête précédente utilise la table qui est créée par la requête dans la section « Plus d'informations » de cet article. En outre, les totaux de taille de fichier sont divisées en groupes de fichiers.

  4. Exécuter une requête DBCC SHRINKFILE, avec l'option EMPTYFILE comme deuxième paramètre sur chaque fichier qui a rempli sparsely blob uniforme étendues.
  5. Vous pouvez suivre la progression de la commande DBCC SRHINKFILE en créant une ou plusieurs tables avec le même schéma que la table extentinfo dans la section « Plus d'informations » de cet article. Puis exécutez « INSERT.. EXEC import_extentinfo « requête pour remplir les données pour les nouvelles tables. Utiliser la requête suivante pour analyser les résultats :
    select [file_id], 'page count'=sum(pg_alloc), 'min page'=min(page_id), 'max page'=max(page_id) from extentinfo group by [file_id]
    en outre, vous pouvez utiliser la requête suivante pour effectuer le suivi des lors de la commande DBCC EXTENTINFO exécution si les tables démarrer avec le même modèle de lettres et que créés près de l'heure que la commande DBCC EXTENTINFO :
    select crdate, [name] from sysobjects where type = 'U' and [name] like 'extent%' order by crdate
  6. Lorsque la requête DBCC SHRINKFILE terminée, exécute une ALTER DATABASE requête supprimer les anciens fichiers de la base de données.
  7. Vous pouvez éventuellement supprimer espace supplémentaire en exécutant une requête DBCC SHRINKFILE avec l'option TRUNCATEONLY sur les nouveaux fichiers créés dans l'étape 3.
  8. Si vous exécutez Microsoft SQL Server 7.0, désactivez les indicateurs de suivi activée sur étape 1 ou 2.

Plus d'informations

Vous pouvez exécuter la requête Transact-SQL suivante à partir de n'importe quel outil de requête, tel que l'Analyseur de requêtes, si vous êtes connecté en tant qu'un utilisateur disposant de droits sysadmin . Vous exécutez la requête Transact-SQL sur SQL Server pour déterminer si la commande DBCC SHRINKDATABASE et la commande ne peut pas compresser les tables en raison de sparsely DBCC SHRINKFILE renseignés BLOB uniformes étendues.

Remarque : vous devez mettre à jour la chaîne « < database name > » sur le nom de la base de données du problème et placez entre le nom de guillemets unique.

use pubs
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
begin 
   create table extentinfo 
   (
   [file_id] smallint,
   page_id int,
   pg_alloc int,
   ext_size tinyint,
   obj_id int,
   index_id tinyint,
   pfs_bytes varbinary(10)
   )
end
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
begin
   create table extentinfo 
   (
   [file_id] smallint,
   page_id int,
   pg_alloc int,
   ext_size tinyint,
   obj_id int,
   index_id tinyint,
   pfs_bytes varbinary(10),
   avg_used tinyint
   )
end
go
create procedure import_extentinfo as
dbcc extentinfo('<database name>')
go
insert extentinfo exec import_extentinfo
go

select [file_id],obj_id, index_id, ext_size, 'actual extent count'=count(*), 'actual page count'=sum(pg_alloc),
 'possible extent count'=ceiling(sum(pg_alloc)*1.0/ext_size),
 'possible extents / actual extents' = (ceiling(sum(pg_alloc)*1.00/ext_size)*100.00) / count(*)
 from extentinfo where ext_size != 1 and index_id = 255
 group by [file_id],obj_id, index_id, ext_size
 having count(*)-ceiling(sum(pg_alloc)*1.0/ext_size) > 0
 order by obj_id, index_id, [file_id]
Si vous voyez des lignes de résultat de la dernière requête ont des valeurs index_id de 255 et le étendue possible/réel étendue colonne est inférieure à 75, cette base de données ont rempli sparsely BLOB étendues et peut être réduite de taille par les méthodes décrites dans la section « Résolution » de cet article.

Remarque : cette requête s'appuie sur la fonctionnalité de la EXTENTINFO DBCC commande. N'utilisez pas la commande DBCC EXTENTINFO en dehors de cette situation car la fonctionnalité peut changer ou même être supprimée des versions futures de Microsoft SQL Server.

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :
272220 CORRECTIF : Text/image données espace de stockage non réclamée correctement
308627 CORRECTIF : DBCC SHRINKDATABASE ou DBCC SHRINKFILE peut développer base de données avec texte ou des données d'image

Propriétés

Numéro d'article: 324432 - Dernière mise à jour: vendredi 9 décembre 2005 - Version: 5.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2000 Standard
  • Microsoft SQL Server 7.0 Standard
Mots-clés : 
kbmt kbprb KB324432 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 324432
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com