web-dev-qa-db-fra.com

Espace disque complet mais logique disponible dans la base de données

Nous avons une base de données relativement grande MS SQL 2008R2 qui réside sur un lecteur SSD. Le lecteur lui-même n'a que 110 Go d'espace et les fichiers de base de données sont les seuls fichiers du lecteur.

La base de données est en mode de récupération "simple" et n'a que deux fichiers, .MDF et .ldf.

Le disque est maintenant presque complet: le MDF est actuellement de 109 Go de taille. Cependant, SSMS me dit qu'il y a près de 18 Go d'un "espace disponible" (dans la page de propriétés "générale"), et si je Passez à travers les mouvements de Shrinking le fichier, il me dit aussi que 18 Go d'espace libre. SSMS me dit également que la taille de la base de données est d'environ 132 Go, ce qui me surprendrait - cela ne correspondrait pas au lecteur!

D'après ce que j'ai lu, shrink est une très mauvaise idée. Cependant, je commence à voir des erreurs de réplication (could not allocate space for object). Nous avons déjà essayé de rétrécir la base de données, mais dans quelques heures, le fichier était de retour à sa taille d'origine.

Comment devrions-nous procéder - étant donné que 18 Go d'espace libre devront-il utiliser automatiquement cet espace libre? Ou est-ce aussi simple que: nous avons vraiment besoin de plus d'espace disque?

5
KenD

L'espace est disponible dans la base de données car les données ont été déplacées. Peut-être avez-vous des niveaux très élevés de scissions de page ou ont récemment supprimé une grande partie des données qui avaient précédemment amené le fichier de données à croître.

SQL Server ne réduit pas les fichiers de base de données automatiquement lorsque vous avez libéré de l'espace en leur, car l'hypothèse logique est que si vous avez utilisé cet espace une fois, vous l'utiliserez à nouveau. Autogrow peut être un événement coûteux et inutile si vous n'avez que libéré de l'espace temporairement (que pouvez-vous faire avec tout cet espace libre entre-temps?). Pour les mêmes raisons, vous ne devriez pas essayer de récupérer temporairement l'espace, non plus. Laissez simplement SQL Server utiliser le 18 Go d'espace disponible lorsque vous ajoutez plus de données. Si vous pensez que vous aurez besoin de plus de 18 Go d'espace supplémentaire à l'avenir (auquel cas vous devrez ajouter des fichiers sur d'autres disques ou passer à un disque plus grand).

sp_spaceused (et à son tour, la boîte de dialogue UI que vous envisagez) peut retourner plus d'espace que possible en raison de problèmes de synchronisation dans les métadonnées de vos tables/index/fichiers. Afin de s'assurer qu'il reflète un espace précis, courez ceci:

DBCC UPDATEUSAGE(0);

J'ai également vu des scénarios où des index de reconstruction étaient nécessaires pour corriger les comptes/espaces, mais je n'ai pas vu ce cas spécifique depuis SQL Server 2000.

(Je soupçonne que ce n'est pas un cas simple dans lequel votre base de données couvre déjà plusieurs disques, sinon vous auriez sûrement mentionné que dans la question.)

Que tout a dit, le fait que lorsque vous réduisez que le fichier de données augmente me conduit presque immédiatement à croire que vous utilisez réellement l'espace, mais vous devez également effectuer de grandes suppressions ou des mises à jour qui le libérent (ce qui est quand vous voyez 18 Go. libre). Malheureusement, il est impossible pour nous de voir exactement pourquoi le fichier de données est en expansion, puis vous effaceriez-vous peut-être des transactions dans lesquelles vous tronquez/renouvelez de grandes tables, effectuant des opérations d'archives massives, etc.

8
Aaron Bertrand

SQL Server attribue l'espace disque pour un fichier (.MDF ou .ldf) lorsque l'espace est nécessaire (en fonction de vos paramètres de cours), le fichier reste la même taille même si le journal de transaction (.LDF) est effacé ou des données (. MDF) est supprimé.
[.____] Cela explique pourquoi vous voyez 18Gb of "Space Available", et cet espace est disponible uniquement dans votre fichier, pas sur le disque (il est attribué).
[.____] C'est aussi la raison pour laquelle la rétrécissement ne vous a pas aidé - DBCC SHRINK[FILE|DATABASE] est parfois utile après des opérations exceptionnellement importantes - dans votre cas, l'espace traditionnel a été réaffecté ultérieurement, ce qui signifie qu'il était nécessaire.

Votre base de données peut être plus grande que le lecteur si votre fichier journal de transaction (.LDF) est situé sur un disque différent ou si vous avez plus d'un fichier de données (et l'autre fichier est sur un disque différent).

Il est possible que vous ayez des données anciennes que vous n'avez pas besoin et que vous pouvez être supprimé,
[.____] Une fois que cette opération se contracte sera probablement utile.

Une autre option consiste à archiver les anciens enregistrements dans des partitions ou des tables sur un fichier différent sur un autre disque.

Bien sûr, vous pouvez déplacer toute votre base de données sur un disque différent (plus grand) si l'option précédente n'était pas satisfaisante.

1
Roi Gavish