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_Data
est 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 FULL
la SIMPLE
et de retour. Pas de joie.
Je pensais que cela avait à voir avec certains TEXT
domaines. 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
la source
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:
Voir des informations supplémentaires sur la tâche de base de données de transfert SSIS .
la source
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.la source
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.
la source
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
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:
la source