web-dev-qa-db-fra.com

Obtenez MS SQL Server pour libérer de l'espace disque

Une table de base de données mal gérée est devenue énorme. 48 + concerts d'enregistrements orphelins. J'essaie de le nettoyer et de remettre mon disque dur dangereusement plein dans un état normal. Je vais supprimer environ 400 millions d'enregistrements de ce tableau. Cela fonctionne comme je tape. Je remarque que je ne vois aucune baisse de l'espace sur mon disque dur mais je vois la mémoire chuter sur les requêtes de table système, je cours pour obtenir la taille de la table. La base de données utilise "Simple Recovery Model".

Il existe de nombreuses questions similaires à celle-ci avec des réponses indiquant que vous devez réduire la base de données. Mais ils expliquent à quel point cela est mauvais/effrayant à cause de données fragmentées, etc.

  1. Étant donné que la base de données ne doit pas être de cette taille. Est-il toujours mauvais pour moi de le rétrécir?
  2. Il s'agit d'une base de données de production. Si je rétrécis, cela entraînera-t-il des temps d'arrêt ou verrouillera la base de données?
  3. Dans SQL Server Management Studio, vous avez deux options pour la réduction, la base de données ou les fichiers. Compte tenu de ma situation, quelle serait la meilleure option?
  4. existe-t-il une règle sur le pourcentage d'espace libre qu'une base de données devrait avoir?

Même la lecture de la description de la balise de psy me donne envie de ne pas le faire. Y a-t-il une autre façon?

9
jackncoke

Je vais supprimer environ 400 millions d'enregistrements de ce tableau.

Avec un peu de chance, vous le faites en morceaux - pour éviter de gonfler le journal des transactions.

remarquez que je ne vois aucune goutte dans mon espace de disque dur

Vous ne le ferez pas, car vous devez réduire explicitement le fichier de base de données pour libérer de l'espace. Il suffit de supprimer les enregistrements, le serveur SQL ne libérera pas l'espace sur le système d'exploitation .

  1. Puisque la base de données ne doit pas avoir cette taille. Est-il toujours mauvais pour moi de le rétrécir?

C'est généralement une mauvaise pratique car les bases de données doivent être correctement dimensionnées. Si vous êtes sûr à 100% que votre base de données ne sera pas [~ # ~] [~ # ~] de nouveau de cette taille, c'est OK pour vous de réduire la base de données (dans votre scénario).

  1. Il s'agit d'une base de données de production. Si je rétrécis, cela entraînera-t-il des temps d'arrêt ou verrouillera la base de données?

La réduction d'une base de données est très IO intensive. Il est conseillé de réduire l'utilisation de DBCC SHRINKFILE pendant la fenêtre de maintenance ou en cas d'activité minimale.

  1. Dans le studio de gestion, vous avez deux options, Base de données ou Fichiers. Compte tenu de ma situation, quelle serait la meilleure option?

Vous devez utiliser TSQL pour effectuer la réduction. (depuis que vous avez demandé, la réduction du fichier [~ # ~] [~ # ~] est la voie à suivre à la place de la base de données). Vous pouvez utiliser la base de données de réduction en morceaux - tsql script pour effectuer la réduction en morceaux.

N'oubliez pas que lorsque vous réduisez, vous fragmentez vos index.

  1. existe-t-il une règle sur le pourcentage d'espace libre qu'une base de données devrait avoir?

Vous pouvez vous référer à Estimation de l'espace disque requis pour les bases de données article. Il n'y a pas de règle fixe, vous devez prendre en compte la croissance prévue de votre base de données. Vous devez également prendre en compte, croissance automatique de vos bases de données .

Références: Pourquoi le journal des transactions continue-t-il de croître ou de manquer d'espace?

14
Kin Shah

vous avez de bonnes raisons de vous inquiéter car la taille de DB dans SQL Server "suce" souvent. Paul Randal, chef du moteur de stockage dans SQL 2005, a déclaré que ShrinkDB est très mal écrit. Il trouvera de l'espace vide en prenant les données à la toute fin et en les plaçant au tout début et continuera ainsi jusqu'à ce qu'il ait de l'espace libre à la "fin" des fichiers DB. À ce stade, il peut ensuite libérer l'espace de SQL Server et le restituer au système d'exploitation. Vous inversez efficacement vos fichiers de base de données, vous verrez donc généralement une fragmentation massive. Vous pouvez lire ses opinions sur ce blog ou sur ce MCM Internals Video

Comme pour tout, vous devez d'abord les tester dans votre environnement. Une meilleure façon de procéder consiste à déplacer les données vers un autre groupe de fichiers. Vous pouvez effectuer une reconstruction d'index en ligne avec l'index cluster, puis réindexer dans le nouveau groupe de fichiers. Ensuite, vous pouvez supprimer l'ancien et libérer l'espace et n'avoir presque aucune fragmentation. Notez que cela prendra environ 120% d'espace supplémentaire pendant qu'il fonctionne. Le problème avec cela est que vous avez besoin d'un espace libre supplémentaire, ce qui semble ne pas être le cas. Il s'agit d'une fonctionnalité d'entreprise.

Si l'espace libre est à un prix aussi élevé, vous devrez peut-être mordre la balle et rétrécir lentement la base de données un petit morceau à la fois pour éviter de longs processus. Notez que vos données seront fortement fragmentées et vous voudrez tout réindexer à nouveau. Notez qu'après avoir tout réindexé, vous remonterez un peu votre espace utilisé et reviendrez à l'espace libre supplémentaire. Voir les conseils de Brent ici .

En ce qui concerne la quantité d'espace libre qui vous convient, il s'agit de savoir dans quelle mesure vous pouvez vous permettre des activités de fragmentation et de croissance de fichiers. Avec IFI activé, la croissance du fichier est presque instantanée mais vous obtenez toujours une fragmentation. Une bonne règle de base est de pré-allouer autant d'espace que vous pensez en avoir besoin, ou de surveiller la croissance et de l'ajuster périodiquement si vous le devez. Cela réduit la fragmentation physique.

La croissance des fichiers journaux est également beaucoup plus importante. Des fichiers journaux supplémentaires peuvent provoquer une fragmentation VLF. Cela rend vos restaurations beaucoup plus lentes et peut affecter les points de contrôle/tronqués. En voici quelques-uns les risques de performances que vous prenez avec un journal fragmenté. une DBCC LOGINFO(); sur chaque base de données. Essayez de garder le nombre autour de 50ish par Kim Tripp, mais si vous voyez des centaines, vous avez des problèmes de fragmentation, ce qui signifie que vos fichiers journaux ont dû se développer pour prendre en charge les opérations. Une bonne façon de voir ce que votre fichier journal devrait être selon Paul Randal, c'est simplement de le laisser croître pendant une semaine et de réindexer. Cela pourrait être un bon point, peut-être que vous pouvez y ajouter un peu plus d'espace libre au cas où. Assurez-vous que vos journaux ne sont pas fragmentés avec DBCC LOGINFO (); encore une fois et s'ils le sont, cela signifie qu'ils ont beaucoup augmenté. Rétrécissez et développez à nouveau le fichier journal en utilisant cette méthode .

5
Ali Razeghi

Il est normal que vous le réduisiez suffisamment pour vous assurer que votre serveur ne se bloquera pas dans le temps qu'il vous faudra pour évaluer vos besoins de stockage et planifier le matériel/les services d'hébergement de manière appropriée (voir question 4). Non, cela ne le verrouille pas Voir restrictions . Rétrécissez la base de données car elle simplifie les choses.

Je suggère de contracter l'expertise pour mener l'étude et rédiger le plan.

2
user41207