Réduire une base de données en dessous de sa taille initiale


10

J'ai une base de données de développement SQL Server 2005 qui est une copie de 30 Go de live. Nous avons supprimé certaines données qui ne sont pas nécessaires dans le développement, ce qui réduit l'espace de fichier de données utilisé à 20 Go. Nous avons donc environ 33% inutilisés.

J'ai besoin de récupérer l'espace, ce qui nous permettra d'avoir une deuxième DB de développement sur le serveur (basé sur la version réduite); cependant, je ne peux pas récupérer l'espace, j'ai fait ce qui suit:

  • La taille initiale du fichier SMS2_Dataest de 30 Go.

    DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)

    suivi par

    DBCC SHRINKFILE (N'SMS2_Data' , 19500)

Pas de joie. J'ai essayé de faire une sauvegarde, de créer une nouvelle base de données avec une taille initiale faible puis de restaurer, pas de joie car la taille initiale est écrasée. Ont également essayé:

ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000) 

Cette erreur, en disant:

Échec de MODIFY FILE. La taille spécifiée est inférieure à la taille actuelle.

J'ai essayé 20800 et j'ai continué à monter jusqu'à 29000 (29 Go) et cela ne me laissera toujours pas le changer.

Ont fait le psy alors changé le mode de récupération de FULLla SIMPLEet de retour. Pas de joie.

Je pensais que cela avait à voir avec certains TEXTdomaines. Nous en avons environ 6 dans le système. Donc, comme test, je les ai tous laissés tomber, puis j'ai réduit le fichier et toujours aucun changement.

La seule option qui reste est de réimporter les données vers une autre base de données. Ce n'est pas pratique, car cela devrait être fait sur la base de données en direct, qui comporte trop de risques. Nous récupérons semi-régulièrement une copie de la base de données en direct et écrasons dev / test. Nous avons quelque chose comme 500 tables. Je voudrais un moyen de le faire qui n'aurait pas le risque d'exporter des données vers une nouvelle base de données.

J'ai essayé de déplacer les données vers un autre fichier, et il a copié toutes les données sauf 5%. C'est ce qui m'a amené à essayer de supprimer toutes les colonnes de texte.

Le serveur est en mode de compatibilité 90, mais est SP2. J'ai maintenant fait les 3 fois suivantes: réindexer toutes les tables, la base de données de sauvegarde, le fichier rétréci, la base de données rétrécie. Toujours pas de joie.

EXECUTE sp_spaceused Retour:

database_name   database_size   unallocated space
SMS2Tests       31453.94 MB     13903.16 MB

reserved     data         index_size   unused
16545568 KB  10602264 KB  4254360 KB   1688944 KB

Réponses:


3

Comme certaines personnes l'ont déjà mentionné, vous pouvez créer une nouvelle base de données et "copier" des éléments de l'ancienne base de données. Ce serait la meilleure option pour vous. Cependant, j'ai remarqué que vous voulez le faire assez régulièrement. Votre meilleure option est donc Redgate Data Compare et Redgate Compare . Les deux font partie du package Redgate SqlToolbelt .

Alors ce que tu fais:

  1. Créez une base de données vide avec une petite taille initiale.
  2. Utilisez Redgate Compare pour copier la structure, les fonctions, etc. de la base de données de l'ancienne base de données
  3. Utilisez Redgate Data Compare pour copier des données de l'ancienne base de données vers la nouvelle
  4. Vous travaillez sur la base de données de développement et à tout moment, vous effectuez simplement la comparaison de données et la mise à jour régulière de la base de données de développement, ou si vous apportez des modifications à db, vous pouvez déployer ces modifications à l'aide de Redgate Compare, puis à l'aide de Redgate Data Compare.

Ce qui est bien avec Data Compare, c'est qu'après avoir copié ces 30 Go de données (vous pouvez le faire en commençant par certaines tables uniquement) après un certain temps, il suffit de `` recompare '' seulement certaines modifications et non 30 Go de données entières. Ce qui signifie qu'il aura beaucoup moins d'impact sur les deux bases de données qu'il le ferait en le copiant normalement.


2

Quelques possibilités ici.

Tout d'abord, êtes-vous sur SQL 2005 SP3 ou une version ultérieure? Certains ont signalé des problèmes SHRINKFILE sur les versions précédentes (voir http://www.sqlservercentral.com/Forums/Topic981292-146-6.aspx#bm985164 )

Deuxièmement, pouvez-vous vérifier que la base de données est définie sur la compatibilité avec le mode 90 et non avec le mode 80? Il s'agissait apparemment d'un problème avec SQL 2000, mais la restriction a été levée dans SQL 2005. Si votre base de données est toujours définie sur la compatibilité mode 80, cela peut toujours être un problème.

Troisièmement, cela pourrait être un problème avec les données LOB (texte, ntext, varchar (max)). Voir l'excellent article de Paul Randall ici

Je suppose que vous comprenez ce que fait réellement SHRINKing et que cela peut affecter négativement vos performances:

  • SHRINK fonctionne en déplaçant aveuglément les pages de la fin du fichier au début
  • En tant que tel, il peut horriblement fragmenter les index, ce qui peut entraîner des problèmes de performances importants
  • Parce que c'est une opération aussi gourmande en données, le retrait peut prendre un temps considérable

Je recommanderais normalement de suivre le rétrécissement avec une réindexation complète (qui récupérera une partie de l'espace qui vient d'être libéré), mais il ne semble pas que vous puissiez même arriver à ce point.

Si vous regardez votre SPID rétréci dans le moniteur d'activité, semble-t-il faire quelque chose? (Les compteurs IO et CPU changent) Ou est-il bloqué? La seule autre chose à laquelle je peux penser, c'est s'il y a une autre activité sur la base de données, bloquant la réduction. Assurez-vous qu'aucun autre spid actif n'utilise la base de données à ce moment.

Passer au mode de récupération simple pendant ce processus est également une bonne idée, pour éviter que le journal ne se développe trop.


1

SHRINKDATABASE ne fera que réduire la base de données (au mieux) à sa taille minimale, ce qui ne vous aidera pas.

Lorsque vous essayez de réduire le FICHIER via l'interface utilisateur SSMS en utilisant les valeurs par défaut, il utilise 'DBCC SHRINKFILE (N'MyDB', 0, TRUNCATEONLY) '. Cette commande ne réduira le fichier (au mieux) que dans la dernière étendue allouée.

Si vous souhaitez réduire le fichier sous la taille minimale, modifiez simplement le paramètre DBCC SHRINKFILEde 0 à la taille à laquelle vous souhaitez tenter de réduire le fichier en Mo. Un nombre différent de zéro indiquera à SHRINKFILE de réduire le fichier à cette taille si possible. Alors , DBCC SHRINKFILE('MyDB', 300, TRUNCATEONLY)va réduire le fichier à 300Mo si la base de données possède un espace.

Vous pouvez voir le MinSize en exécutant ceci:

DBCC TRACEON(3604)
go
DBCC PAGE('MyDB', 1, 0, 3) with tableresults
go

MinSize en Mo est calculé de cette façon: (MinSize * 8) / 1024


0

Si vous voulez vraiment faire ça:

  • réglé pour récupérer le mode simple
  • Soyez conscient de: DBCC SHRINKDATABASE (MyDatabase, TRUNCATEONLY);

0

Si vous avez, disons, 20003 (mb) de données réelles dans la base de données, alors "SIZE = 20000" serait trop petit. Essayez avec 21000 ou 25000, voyez si cela fonctionne. (Et rappelez-vous, 1 Go = 1024 Mo.)


0

Essayer

DBCC SHRINKDATABASE (N'SMS2_Data' , 0)

Je l'ai utilisé sur une base de données SQL 2005 que j'ai ici et l'espace alloué pour le fichier de données est passé de 10,2 Go à 3 Go.

Pour info, c'est un long processus qui a pris un peu plus de 19 minutes pour ma base de données.


ps Je viens de vérifier et le modèle de récupération de ma base de données est défini sur Simple.

Cela n'a fait aucune différence, je suis sûr que c'est la même chose qui se fait via le front-end.

0

Je suppose que vous avez un seul fichier de base de données avec le nom logique SMS2_Data. Vous avez également un ou plusieurs fichiers journaux de transactions dans la base de données.

Vous avez un défi qui ne peut pas être résolu sur la copie actuelle de la base de données. L'information importante que vous déclarez est que la «taille d'origine du fichier de base de données est de 30 Go». Malheureusement, ce fichier ne peut pas être réduit plus petit que sa taille d'origine.

Comme vous l'avez déjà expérimenté, SHRINKDB et SHRINKFILE ne vous donnent pas ce que vous voulez. Ces commandes suivent la règle de taille ne pouvant pas être inférieure à la taille d'origine. Ainsi, vous pouvez uniquement réduire une base de données à sa taille d'origine et pas plus petite.

La sauvegarde et la restauration de la base de données vers une base de données existante plus petite ne fonctionne pas non plus. Lorsque vous effectuez une restauration de base de données, les fichiers de base de données sont restaurés aux tailles de fichier telles qu'elles étaient lors de la sauvegarde. Et, le modèle de récupération (simple, complet, etc.) n'a aucun rapport avec ce problème.

Et, un dernier mauvais point. Vous pouvez envisager d'ajouter d'autres fichiers de base de données plus petits à la base de données, de transférer toutes les données du fichier de 30 Go, puis de les supprimer. Malheureusement, cela ne fonctionnera pas non plus car vous ne pouvez pas supprimer le fichier initial de la base de données.

La meilleure solution consiste donc à copier les données dans une autre base de données. Vous avez quelques options ici, et vous les connaissez peut-être déjà. La première étape consiste à créer une nouvelle base de données avec une taille inférieure à la taille des données. Ensuite, vous pouvez étendre la taille de la base de données à la taille requise.

Vous pouvez considérer SSIS comme un moyen de transférer les données d'une base de données à l'autre. Vous trouverez une tâche de copie de base de données qui vous aidera. Vous pouvez utiliser les étapes suivantes:

  1. Créer une nouvelle base de données avec une taille plus petite que la base de données source
  2. Configurez le package SSIS avec la tâche de transfert de la base de données. Définissez la tâche pour utiliser le transfert en ligne.
  3. Exécutez le package SSIS.
  4. Le package SSIS peut modifier la taille de la base de données pour correspondre à la taille de la base de données source. Réduisez cette base de données, car elle a une taille de fichier d'origine plus petite.

Voir des informations supplémentaires sur la tâche de base de données de transfert SSIS .


0

Un espace inutilisé dans la base de données est normal.
Si vous avez de nombreux enregistrements volumineux (par exemple, de longues chaînes), il peut y avoir beaucoup d'espace inutilisé dans les pages de données (car un enregistrement n'est généralement pas divisé entre les pages).
Une autre chose est un facteur de remplissage - au départ, les index cluster ne sont pas créés à 100% pour éviter les sauts de page (une opération coûteuse) lors des insertions suivantes.
Si de nombreuses données ont été supprimées de la base de données, l'espace précédemment occupé par ces données ne sera pas automatiquement récupéré - il restera alloué à la table.

Essayez d'appeler DBCC DBREINDEX (table_name, '', 100)toutes les tables de votre base de données - cela reconstruira tous les index avec un facteur de remplissage de 100%, afin que les données soient placées de la manière la plus compacte possible. Essayez à nouveau de réduire la base de données.


0

J'ai découvert que la réduction d'une base de données SQL Server peut être gênante. C'est comme si vous deviez faire une chanson et une danse.

C'est le processus que je passe habituellement:

Base de données de sauvegarde Shrink Journal de sauvegarde Shrink et fichiers de base de données séparément. Répétez la sauvegarde jusqu'à ce qu'elle diminue finalement.

J'ai dû faire ce processus plusieurs fois jusqu'à trois fois pour que cela fonctionne enfin. Nous avions une base de données de plus de 68 Go, avec quelque chose à 98% d'espace inutilisé. J'ai suivi plusieurs fois cette routine de chant et de danse, mais elle a finalement diminué à moins de 1 Go.


0

J'aurais essayé de réduire la taille initiale du fichier mdf à 29 000 Mo en premier, puis à 28 000 en détectant le gros plan.

Il est déraisonnable de s'attendre à réduire de 30% la taille du fichier de base de données en supprimant 30% des données.

Vous pouvez estimer la quantité d'espace inutilisé dans votre base de données en

execute sp_spaceused

dans le contexte de votre base de données (utilisez votre nom de données;)
Pouvez-vous poster le résultat de son exécution?


Mise à jour:
j'ai posté ma question connexe dessus:


Cela n'a pas trop bien fonctionné. 13903,16 Mo d'espace non alloué. Index inutilisé 1688944 Ko
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.