DBCC SHRINKDATABASE (Transact-SQL)DBCC SHRINKDATABASE (Transact-SQL)

S’APPLIQUE À : ouiSQL Server (à partir de 2008) ouiAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Réduit la taille des fichiers de données et journaux dans la base de données spécifiée.Shrinks the size of the data and log files in the specified database.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

DBCC SHRINKDATABASE   
( database_name | database_id | 0   
     [ , target_percent ]   
     [ , { NOTRUNCATE | TRUNCATEONLY } ]   
)  
[ WITH NO_INFOMSGS ]  

ArgumentsArguments

database_name | database_id | 0database_name | database_id | 0
Nom ou identificateur de la base de données à réduire.Is the name or ID of the database to be shrunk. Si 0 est spécifié, la base de données active est utilisée.If 0 is specified, the current database is used.

target_percenttarget_percent
Pourcentage d'espace que vous voulez laisser disponible dans le fichier de la base de données après sa réduction.Is the percentage of free space that you want left in the database file after the database has been shrunk.

NOTRUNCATENOTRUNCATE
Compacte les données des fichiers de données en déplaçant les pages allouées de la fin du fichier vers les pages non allouées du début du fichier.Compacts the data in data files by moving allocated pages from the end of a file to unallocated pages in the front of the file. target_percent est facultatif.target_percent is optional. Cette option n’est pas prise en charge avec Azure SQL Data Warehouse.This option is not supported with Azure SQL Data Warehouse.

L'espace libre à la fin du fichier n'est pas restitué au système d'exploitation et la taille physique du fichier ne change pas.The free space at the end of the file is not returned to the operating system, and the physical size of the file does not change. Ainsi, lorsque l'option NOTRUNCATE est spécifiée, la base de données ne paraît pas être réduite.Therefore, when NOTRUNCATE is specified, the database appears not to shrink.

NOTRUNCATE n'est applicable qu'aux fichiers de données.NOTRUNCATE is applicable only to data files. Le fichier journal n'est pas affecté.The log file is not affected.

TRUNCATEONLYTRUNCATEONLY
Libère pour le système d'exploitation tout l'espace libre à la fin du fichier, mais n'effectue aucun déplacement de page au sein du fichier.Releases all free space at the end of the file to the operating system but does not perform any page movement inside the file. Le fichier de données est réduit seulement jusqu'à la dernière extension allouée.The data file is shrunk only to the last allocated extent. target_percent est ignoré si spécifié avec TRUNCATEONLY.target_percent is ignored if specified with TRUNCATEONLY. Cette option n’est pas prise en charge avec Azure SQL Data Warehouse.This option is not supported with Azure SQL Data Warehouse.

TRUNCATEONLY affecte le fichier journal.TRUNCATEONLY affects the log file. Pour tronquer uniquement le fichier de données, utilisez DBCC SHRINKFILE.To truncate only the data file, use DBCC SHRINKFILE.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Supprime tous les messages d'information dont les niveaux de gravité sont compris entre 0 et 10.Suppresses all informational messages that have severity levels from 0 through 10.

Jeux de résultatsResult Sets

Le tableau suivant décrit les colonnes du jeu de résultats.The following table describes the columns in the result set.

Nom de colonneColumn name DescriptionDescription
DbIdDbId Numéro d'identification de base de données du fichier que le Moteur de base de donnéesDatabase Engine tente de réduire.Database identification number of the file the Moteur de base de donnéesDatabase Engine tried to shrink.
FileIdFileId Numéro d'identification du fichier que le Moteur de base de donnéesDatabase Engine tente de réduire.File identification number of the file the Moteur de base de donnéesDatabase Engine tried to shrink.
CurrentSizeCurrentSize Nombre de pages de 8 Ko que le fichier occupe actuellement.Number of 8-KB pages the file currently occupies.
MinimumSizeMinimumSize Nombre de pages de 8 Ko que le fichier pourrait occuper au minimum.Number of 8-KB pages the file could occupy, at minimum. Ceci correspond à la taille minimale ou à la taille de création d'un fichier.This corresponds to the minimum size or originally created size of a file.
UsedPagesUsedPages Nombre de pages de 8 Ko que le fichier utilise actuellement.Number of 8-KB pages currently used by the file.
EstimatedPagesEstimatedPages Nombre de pages de 8 Ko estimé par le Moteur de base de donnéesDatabase Engine auquel la taille du fichier peut être ramenée.Number of 8-KB pages that the Moteur de base de donnéesDatabase Engine estimates the file could be shrunk down to.

Note

Le Moteur de base de donnéesDatabase Engine n'affiche pas de ligne pour les fichiers qui ne sont pas réduits.The Moteur de base de donnéesDatabase Engine does not display rows for those files not shrunk.

Notes Remarks

Note

Actuellement, Azure SQL Data Warehouse ne prend pas en charge DBCC SHRINKDATABASE.Currently Azure SQL Data Warehouse does not support DBCC SHRINKDATABASE. L’exécution de cette commande n’est pas recommandée, car c’est une opération qui consomme beaucoup d’E/S et qui peut déconnecter votre entrepôt de données.Running this command is not recommended as this is an i/o intensive operation and can take your data warehouse offline. Par ailleurs, l’exécution de cette commande entraîne de coûteuses implications sur vos instantanés d’entrepôt de données.In addition, there will be costing implications to your data warehouse snapshots after running this command.

Pour réduire tous les fichiers de données et fichiers journaux d'une base de données particulière, exécutez la commande DBCC SHRINKDATABASE.To shrink all data and log files for a specific database, execute the DBCC SHRINKDATABASE command. Pour réduire un fichier de données ou un fichier journal d'une base de données particulière, exécutez la commande DBCC SHRINKFILE.To shrink one data or log file at a time for a specific database, execute the DBCC SHRINKFILE command.

Pour afficher la quantité d'espace actuellement libre (non allouée) dans la base de données, exécutez sp_spaceused.To view the current amount of free (unallocated) space in the database, run sp_spaceused.

Les opérations DBCC SHRINKDATABASE peuvent être arrêtées à n'importe quel stade du processus, chaque travail terminé étant conservé.DBCC SHRINKDATABASE operations can be stopped at any point in the process, and any completed work is retained.

La base de données ne peut pas être réduite à une taille inférieure à la taille minimale de la base de données.The database cannot be made smaller than the minimum size of the database. La taille minimale correspond à la taille spécifiée lors de la création initiale de la base de données ou à la dernière taille explicitement spécifiée à l'aide d'une opération de modification de taille de fichier, notamment en utilisant l'instruction DBCC SHRINKFILE ou ALTER DATABASE.The minimum size is the size specified when the database is originally created, or the last size explicitly set by using a file size changing operation such as DBCC SHRINKFILE or ALTER DATABASE. Par exemple, si une base de données est créée avec une taille de 10 Mo et atteint une taille de 100 Mo, la base de données ne peut pas être réduite à moins de 10 Mo, même si toutes les données de la base de données sont supprimées.For example, if a database is originally created with a size of 10 MB in size and grows to 100 MB, the smallest the database can be reduced to is 10 MB, even if all the data in the database has been deleted.

Exécuter DBCC SHRINKDATABASE sans spécifier l'option NOTRUNCATE ou TRUNCATEONLY revient à exécuter une opération DBCC SHRINKDATABASE avec NOTRUNCATE suivie d'une opération DBCC SHRINKDATABASE avec TRUNCATEONLY.Running DBCC SHRINKDATABASE without specifying either the NOTRUNCATE option or the TRUNCATEONLY option is equivalent to running a DBCC SHRINKDATABASE operation with NOTRUNCATE followed by running a DBCC SHRINKDATABASE operation with TRUNCATEONLY.

Il n'est pas nécessaire que la base de données réduite soit mono-utilisateur ; d'autres utilisateurs peuvent travailler sur cette base au cours de l'opération.The database being shrunk does not have to be in single user mode; other users can be working in the database when it is shrunk. Ceci inclut également les bases de données système.This includes system databases.

Vous ne pouvez pas réduire la taille d'une base de données en cours de sauvegarde.You cannot shrink a database while the database is being backed up. Inversement, vous ne pouvez pas sauvegarder une base de données alors qu'elle fait l'objet d'une opération de réduction.Conversely, you cannot backup a database while a shrink operation on the database is in process.

Fonctionnement de DBCC SHRINKDATABASEHow DBCC SHRINKDATABASE Works

DBCC SHRINKDATABASE réduit les fichiers de données, fichier par fichier, mais réduit les fichiers journaux comme si tous les fichiers journaux existaient dans un groupe de journaux contigus.DBCC SHRINKDATABASE shrinks data files on a per-file basis, but shrinks log files as if all the log files existed in one contiguous log pool. Les fichiers sont toujours réduits à partir de la fin.Files are always shrunk from the end.

Supposons que la base de données mydb a un fichier de données et deux fichiers journaux.Assume a database named mydb with a data file and two log files. La taille de chacun des fichiers est de 10 Mo et le fichier de données contient 6 Mo de données.The data and log files are 10 MB each and the data file contains 6 MB of data.

Pour chaque fichier, le Moteur de base de donnéesDatabase Engine calcule une taille cible,For each file, the Moteur de base de donnéesDatabase Engine calculates a target size. qui est la taille à laquelle le fichier doit être réduit.This is the size to which the file is to be shrunk. Quand DBCC SHRINKDATABASE est spécifié avec target_percent, le Moteur de base de donnéesDatabase Engine calcule la taille cible pour qu'elle corresponde à la quantité target_percent d'espace disponible dans le fichier après la réduction.When DBCC SHRINKDATABASE is specified with target_percent, the Moteur de base de donnéesDatabase Engine calculates target size to be the target_percent amount of space free in the file after shrinking. Par exemple, si vous spécifiez un target_percent de 25 pour réduire mydb, le Moteur de base de donnéesDatabase Engine calcule une taille cible de 8 Mo pour le fichier de données (6 Mo de données plus 2 Mo d'espace libre).For example, if you specify a target_percent of 25 for shrinking mydb, the Moteur de base de donnéesDatabase Engine calculates the target size for the data file to be 8 MB (6 MB of data plus 2 MB of free space). Par conséquent, le Moteur de base de donnéesDatabase Engine déplace toutes les données des 2 derniers Mo du fichier de données vers l'espace libre des 8 premiers Mo du fichier de données, puis réduit le fichier.Therefore, the Moteur de base de donnéesDatabase Engine moves any data from the last 2 MB of the data file to any free space in the first 8 MB of the data file and then shrinks the file.

Supposons que le fichier de données de mydb contient 7 Mo de données.Assume the data file of mydb contains 7 MB of data. Si vous spécifiez un target_percent de 30, le fichier de données peut être réduit à 30 % d'espace libre.Specifying a target_percent of 30 allows for this data file to be shrunk to the free percentage of 30. En revanche, si vous spécifiez un target_percent de 40, le fichier de données ne peut pas être réduit, car le Moteur de base de donnéesDatabase Engine ne peut pas réduire un fichier à une taille inférieure à celle qu’occupent les données actuellement.However, specifying a target_percent of 40 does not shrink the data file because the Moteur de base de donnéesDatabase Engine will not shrink a file to a size smaller than the data currently occupies. En d’autres termes : si vous ajoutez 40 % d’espace libre souhaité à 70 % d’espace occupé dans le fichier de données (7 Mo sur un total de 10 Mo), vous obtenez plus de 100 %.You can also think of this issue another way: 40 percent wanted free space + 70 percent full data file (7 MB out of 10 MB) is more than 100 percent. Comme la somme du pourcentage d'espace libre souhaité et du pourcentage actuel occupé par les données est supérieure à 100 % (de 10 %), toute valeur target_size supérieure à 30 n'entraîne pas la réduction du fichier de données.Because the percentage free that is wanted plus the current percentage that the data file occupies is over 100 percent (by 10 percent), any target_size greater than 30 will not shrink the data file.

Pour les fichiers journaux, le Moteur de base de donnéesDatabase Engine utilise target_percent pour calculer la taille cible du fichier journal complet. target_percent correspond donc à l'espace libre dans le journal après l'opération de réduction.For log files, the Moteur de base de donnéesDatabase Engine uses target_percent to calculate the target size for the whole log; therefore, target_percent is the amount of free space in the log after the shrink operation. La taille cible pour le journal complet est alors convertie en taille cible pour chaque fichier journal.Target size for the whole log is then translated to a target size for each log file.

DBCC SHRINKDATABASE essaie immédiatement de réduire chaque fichier journal physique à sa taille cible.DBCC SHRINKDATABASE tries to shrink each physical log file to its target size immediately. Si aucune partie du journal logique ne se trouve dans les journaux virtuels au-delà de la taille cible du fichier journal, le fichier est tronqué avec succès et DBCC SHRINKDATABASE s'exécute normalement sans émettre de messages.If no part of the logical log resides in the virtual logs beyond the target size of the log file, the file is successfully truncated and DBCC SHRINKDATABASE finishes without any messages. Toutefois, si une partie du journal logique se trouve dans les journaux virtuels au-delà de la taille cible, le Moteur de base de donnéesDatabase Engine libère autant d'espace que possible, puis envoie un message d'information.However, if part of the logical log resides in the virtual logs beyond the target size, the Moteur de base de donnéesDatabase Engine frees as much space as possible, and then issues an informational message. Le message décrit les actions à effectuer pour déplacer le journal logique à partir des journaux virtuels à la fin du fichier.The message describes what actions are required to move the logical log out of the virtual logs at the end of the file. Lorsque les actions sont effectuées, DBCC SHRINKDATABASE peut être utilisé pour libérer l'espace restant.After the actions are performed, DBCC SHRINKDATABASE can be used to free the remaining space.

Comme un fichier journal ne peut être réduit que jusqu'à une limite virtuelle, il arrive qu'il ne soit pas possible de réduire un fichier journal à une taille inférieure à celle d'un fichier journal virtuel, même s'il n'est pas utilisé.Because a log file can only be shrunk to a virtual log file boundary, shrinking a log file to a size smaller than the size of a virtual log file might not be possible, even if it is not being used. La taille du fichier journal virtuel est choisie dynamiquement par le Moteur de base de donnéesDatabase Engine au moment de la création ou de l'extension des fichiers journaux.The size of the virtual log file is chosen dynamically by the Moteur de base de donnéesDatabase Engine when log files are created or extended.

Bonnes pratiquesBest Practices

Prenez en compte les informations suivantes lorsque vous envisagez de réduire une base de données :Consider the following information when you plan to shrink a database:

  • Une opération de réduction de taille de fichier est plus efficace après l'exécution d'une opération qui crée une grande quantité d'espace inutilisé, telle qu'une troncature de table ou une suppression de table.A shrink operation is most effective after an operation that creates lots of unused space, such as a truncate table or a drop table operation.
  • Un certain espace libre doit exister pour les opérations quotidiennes courantes pour la plupart des bases de données.Most databases require some free space to be available for regular day-to-day operations. Si vous réduisez plusieurs fois la taille d'une base de données et que vous constatez que la taille augmente de nouveau, cela indique que l'espace qui a été réduit est nécessaire pour les opérations courantes.If you shrink a database repeatedly and notice that the database size grows again, this indicates that the space that was shrunk is required for regular operations. Dans ce cas, la réduction de la taille de la base de données ne sert à rien.In these cases, repeatedly shrinking the database is a wasted operation.
  • Une opération de réduction ne conserve pas l'état de fragmentation des index de la base de données, et augmente généralement la fragmentation.A shrink operation does not preserve the fragmentation state of indexes in the database, and generally increases fragmentation to a degree. Il s'agit là d'une raison supplémentaire pour ne pas réduire la taille de la base de données de manière répétitive.This is another reason not to repeatedly shrink the database.
  • Sauf en cas de besoin précis, n'attribuez pas la valeur ON à l'option de base de données AUTO_SHRINK.Unless you have a specific requirement, do not set the AUTO_SHRINK database option to ON.

DépannageTroubleshooting

Les opérations de réduction peuvent être bloquées par une transaction en cours d'exécution sous un niveau d'isolation basé sur le contrôle de version de ligne.It is possible for shrink operations to be blocked by a transaction that is running under a row versioning-based isolation level. Par exemple, si une importante opération de suppression exécutée sous un niveau d'isolation basé sur le contrôle de version de ligne se déroule parallèlement à une opération DBCC SHRINK DATABASE, l'opération de réduction attendra la fin de l'opération de suppression pour réduire la taille des fichiers.For example, if a large delete operation running under a row versioning-based isolation level is in progress when a DBCC SHRINK DATABASE operation is executed, the shrink operation will wait for the delete operation to complete before shrinking the files. Dans ce cas, les opérations DBCC SHRINKFILE et DBCC SHRINKDATABASE envoient un message d'information (5202 pour SHRINKDATABASE et 5203 pour SHRINKFILE) dans le journal des erreurs SQL ServerSQL Server toutes les cinq minutes au cours de la première heure, puis toutes les heures.When this happens, DBCC SHRINKFILE and DBCC SHRINKDATABASE operations print out an informational message (5202 for SHRINKDATABASE and 5203 for SHRINKFILE) to the SQL ServerSQL Server error log every five minutes in the first hour and then every hour after that. Par exemple, si le journal des erreurs contient le message d'erreur :For example, if the error log contains the following error message:

DBCC SHRINKDATABASE for database ID 9 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.  

cela signifie que l'opération de réduction est bloquée par des transactions d'instantané ayant des valeurs d'horodateur plus anciennes que 109, qui est le numéro de la dernière transaction que l'opération de réduction a effectuée.This means that the shrink operation is blocked by snapshot transactions that have timestamps older than 109, which is the last transaction that the shrink operation completed. Cela indique également que les colonnes transaction_sequence_num ou first_snapshot_sequence_num dans la vue de gestion dynamique sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) contiennent une valeur de 15.It also indicates that the transaction_sequence_num, or first_snapshot_sequence_num columns in the sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dynamic management view contains a value of 15. Si les colonnes transaction_sequence_num ou first_snapshot_sequence_num dans la vue contiennent un numéro inférieur à la dernière transaction effectuée par une opération de réduction (109), l'opération de réduction attend que ces transactions soient terminées.If either the transaction_sequence_num, or first_snapshot_sequence_num columns in the view contains a number that is less than the last transaction completed by a shrink operation (109), the shrink operation will wait for those transactions to finish.

Pour résoudre ce problème, vous pouvez effectuer l'une des tâches suivantes :To resolve the problem, you can do one of the following tasks:

  • Achevez la transaction qui bloque l'opération de réduction.Terminate the transaction that is blocking the shrink operation.
  • Achevez l'opération de réduction.Terminate the shrink operation. Tout travail achevé sera conservé.Any completed work is retained.
  • Laissez simplement l'opération de réduction attendre que la transaction bloquante s'achève.Do nothing and allow the shrink operation to wait until the blocking transaction completes.

PermissionsPermissions

Nécessite l’appartenance au rôle de serveur fixe sysadmin ou au rôle de base de données fixe db_owner .Requires membership in the sysadmin fixed server role or the db_owner fixed database role.

ExemplesExamples

A.A. Réduction de la taille d'une base de données et spécification d'un pourcentage d'espace libreShrinking a database and specifying a percentage of free space

L'exemple suivant diminue la taille des fichiers de données et journaux de la base de données utilisateur UserDB pour obtenir 10 % d'espace libre dans la base de données.The following example decreases the size of the data and log files in the UserDB user database to allow for 10 percent free space in the database.

DBCC SHRINKDATABASE (UserDB, 10);  
GO  

B.B. Troncation d'une base de donnéesTruncating a database

L'exemple suivant réduit la taille des fichiers de données et des fichiers journaux de l'exemple de base de données AdventureWorks jusqu'à la dernière extension allouée.The following example shrinks the data and log files in the AdventureWorks sample database to the last allocated extent.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY);  

Voir aussiSee also

ALTER DATABASE (Transact-SQL)ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)DBCC SHRINKFILE (Transact-SQL)
Réduire une base de donnéesShrink a Database