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

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server 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 ID de la base de données à réduire.Is the database name or ID to be shrunk. 0 indique que la base de données active est utilisée.0 specifies that 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
Déplace les pages affectées de la fin du fichier vers les pages non affectées du début du fichier.Moves assigned pages from the file's end to unassigned pages in the front of the file. Cette action compacte les données dans le fichier.This action compacts the data within the file. target_percent est facultatif.target_percent is optional. Azure SQL Data Warehouse ne prend pas en charge cette option.Azure SQL Data Warehouse doesn't support this option.

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 isn't returned to the operating system, and the physical size of the file doesn't change. Ainsi, la base de données ne paraît pas être réduite quand vous spécifiez l’option NOTRUNCATE.As such, the database appears not to shrink when you specify NOTRUNCATE.

NOTRUNCATE n'est applicable qu'aux fichiers de données.NOTRUNCATE is applicable only to data files. NOTRUNCATE n’affecte pas le fichier journal.NOTRUNCATE doesn't affect the log file.

TRUNCATEONLYTRUNCATEONLY
Libère tout l’espace libre à la fin du fichier pour le système d’exploitation.Releases all free space at the end of the file to the operating system. N’effectue aucun déplacement de page au sein du fichier.Doesn't move any pages inside the file. Le fichier de données est réduit seulement jusqu’à la dernière extension affectée.The data file shrinks only to the last assigned extent. target_percent est ignoré s’il est spécifié avec TRUNCATEONLY.Ignores target_percent if specified with TRUNCATEONLY. Azure SQL Data Warehouse ne prend pas en charge cette option.Azure SQL Data Warehouse doesn't support this option.

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. Cette valeur correspond à la taille minimale ou à la taille de création d’un fichier.This value 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.

Notes

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.

NotesRemarks

Notes

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 kept.

La base de données ne peut pas être réduite à une taille inférieure à la taille minimale configurée de la base de données.The database can't be smaller than the configured minimum size of the database. Vous indiquez la taille minimale lors de la création de la base de données.You specify the minimum size when the database is originally created. Il peut s’agir aussi de la dernière taille explicitement définie à l’aide d’une opération de changement de taille de fichier.Or, the minimum size can be the last size explicitly set by using a file size changing operation. Des opérations comme DBCC SHRINKFILE ou ALTER DATABASE sont des exemples d’opérations de changement de taille de fichier.Operations like DBCC SHRINKFILE or ALTER DATABASE are examples of file-size changing operations.

Supposons qu’une base de données est créée avec une taille de 10 Mo.Let's say a database is originally created with a size of 10 MB in size. Elle atteint ensuite une taille de 100 Mo.Then, it grows to 100 MB. 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.The smallest the database can be reduced to is 10 MB, even if all the data in the database has been deleted.

Spécifiez l’option NOTRUNCATE ou l’option TRUNCATEONLY quand vous exécutez DBCC SHRINKDATABASE.Specify either the NOTRUNCATE option or the TRUNCATEONLY option when you run DBCC SHRINKDATABASE. Sinon, cela revient à exécuter une opération DBCC SHRINKDATABASE avec NOTRUNCATE suivie d’une opération DBCC SHRINKDATABASE avec TRUNCATEONLY.If you don't, the result is the same as if you run 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 en mode mono-utilisateur.The shrunk database doesn't have to be in single user mode. D’autres utilisateurs peuvent travailler dans la base de données quand elle est réduite, notamment les bases de données système.Other users can be working in the database when it's shrunk, including system databases.

Vous ne pouvez pas réduire la taille d’une base de données en cours de sauvegarde.You can't 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 can't back up 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 vous disposez de deux fichiers journaux, d’un fichier de données et d’une base de données nommée mydb.Assume you have a couple of log files, a data file, and a database named mydb. 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,The Moteur de base de donnéesDatabase Engine calculates a target size for each file. qui est la taille à laquelle le fichier doit être réduit.This value 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 tout espace libre dans les 8 premiers Mo du fichier de données, puis réduit le fichier.As such, the Moteur de base de donnéesDatabase Engine moves any data from the data file's last 2 MB to any free space in the data file's first 8 MB 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 doesn't shrink the data file because the Moteur de base de donnéesDatabase Engine won't shrink a file to a size smaller than the data currently occupies.

Ce problème peut également être envisagé autrement : 40 % d’espace libre souhaité ajoutés à 70 % pour la taille du fichier de données (7 Mo sur 10 Mo) dépassent 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. Toute valeur target_size supérieure à 30 n’entraîne pas la réduction du fichier de données.Any target_size greater than 30 won't shrink the data file. En effet, la somme du pourcentage d’espace libre souhaité et du pourcentage actuel occupé par le fichier de données est supérieure à 100 %.It won't shrink because the percentage free you want plus the current percentage that the data file occupies is over 100 percent.

Dans le cas des fichiers journaux, le Moteur de base de donnéesDatabase Engine utilise target_percent pour calculer la taille cible de l’ensemble du journal.For log files, the Moteur de base de donnéesDatabase Engine uses target_percent to calculate the target size for the whole log. target_percent correspond donc à la quantité d’espace libre dans le journal après l’opération de réduction.That's why 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. Supposons qu’aucune partie du journal logique ne reste dans les journaux virtuels au-delà de la taille cible du fichier journal.Let's say no part of the logical log stays in the virtual logs beyond the target size of the log file. Le fichier est alors tronqué avec succès et DBCC SHRINKDATABASE s’exécute sans émettre de messages.Then the file is successfully truncated and DBCC SHRINKDATABASE finishes without any messages. Toutefois, si une partie du journal logique reste 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 stays 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. Une fois les actions exécutées, DBCC SHRINKDATABASE peut être utilisé pour libérer l’espace restant.After the actions are run, DBCC SHRINKDATABASE can be used to free the remaining space.

Un fichier journal ne peut être réduit que jusqu’à une limite virtuelle.A log file can only be shrunk to a virtual log file boundary. C’est pourquoi il arrive qu’il ne soit pas possible de réduire un fichier journal à une taille inférieure à celle d’un fichier journal virtuel,That's why shrinking a log file to a size smaller than the size of a virtual log file might not be possible. même s’il n’est pas utilisé.It might not be possible even if it isn't 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 est plus efficace après une opération.A shrink operation is most effective after an operation. Cette opération crée un espace inutilisé, par exemple une troncature ou une suppression de table.This operation creates 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. Vous pouvez réduire plusieurs fois la taille d’une base de données et constater que la taille augmente de nouveau.You might shrink a database repeatedly and notice that the database size grows again. Cette croissance indique que l’espace qui a été réduit est nécessaire pour les opérations courantes.This growth indicates that the shrunken space 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 ; en général, elle augmente la fragmentation dans une certaine mesure.A shrink operation doesn't preserve the fragmentation state of indexes in the database, and generally increases fragmentation to a degree. Ce résultat représente une raison supplémentaire de ne pas réduire la taille de la base de données de manière répétitive.This result 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, don't 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's possible to block shrink operations by a transaction that is running under a row versioning-based isolation level. Par exemple, si une opération de suppression de grande envergure 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,For example, a large delete operation running under a row versioning-based isolation level is in progress when a DBCC SHRINK DATABASE operation is executed. l’opération de réduction attend la fin de l’opération de suppression pour réduire la taille des fichiers.When this situation happens, the shrink operation will wait for the delete operation to complete before it shrinks 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).When the shrink operation waits, DBCC SHRINKFILE and DBCC SHRINKDATABASE operations print out an informational message (5202 for SHRINKDATABASE and 5203 for SHRINKFILE). Ce message s’affiche dans le journal des erreurs SQL ServerSQL Server toutes les cinq minutes au cours de la première heure, puis toutes les heures.This message prints to the SQL ServerSQL Server error log every five minutes in the first hour and then every upcoming hour. 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.  

Cette erreur signifie que l’opération de réduction est bloquée par des transactions d’instantanés ayant des valeurs d’horodatage plus anciennes que 109.This error means snapshot transactions that have timestamps older than 109 will block the shrink operation. Cette transaction est la dernière transaction que l’opération de réduction a effectuée.That transaction is the last transaction that the shrink operation completed. Cela indique également que la colonne transaction_sequence_num ou first_snapshot_sequence_num dans la vue de gestion dynamique sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) contient une valeur de 15.It also indicates the transaction_sequence_num or first_snapshot_sequence_num columns in the sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dynamic management view contain a value of 15. La colonne transaction_sequence_num ou first_snapshot_sequence_num dans la vue peut contenir un numéro inférieur à la dernière transaction effectuée par une opération de réduction (109).The transaction_sequence_num or first_snapshot_sequence_num column in the view might contain a number that is less than the last transaction completed by a shrink operation (109). Dans ce cas, l’opération de réduction attend que ces transactions soient terminées.If so, 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:

  • Mettez fin à la transaction qui bloque l'opération de réduction.End the transaction that is blocking the shrink operation.
  • Mettez fin à l'opération de réduction.End the shrink operation. Tout travail achevé sera conservé.Any completed work is kept.
  • 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.

AutorisationsPermissions

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 reduces 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 affectée.The following example shrinks the data and log files in the AdventureWorks sample database to the last assigned 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