Cette question est posée sous différentes formes ici, mais la question se résume à:
Je sais que réduire une base de données est risqué. Dans ce cas, j'ai supprimé tellement de données et je ne les utiliserai plus jamais.
- Comment puis-je réduire ma base de données? Quels fichiers dois-je réduire?
- Quelles devraient être mes considérations en faisant cela?
- Devrais-je faire quelque chose après?
- Et si c'est une grande base de données? Puis-je le réduire par incréments plus petits?
sql-server
shrink
Mike Walsh
la source
la source
Réponses:
Quelques mises en garde initiales:
Si vous avez lu des articles sur les préoccupations et les risques et que vous avez toujours besoin de le réduire, car vous avez libéré beaucoup d'espace, nous espérons que le reste de cette réponse vous aidera. Mais considérez les risques.
Il y a deux approches principales que deux considèrent ici:
1.) Réduire Oui, effectuez la réduction - Pensez à utiliser
DBCC SHRINKFILE
au lieu deDBCC SHRINKDATABASE
, vous contrôlez mieux ce qui est rétréci et comment. Cela va entraîner une dégradation des performances à coup sûr - il est une grande opération à faire beaucoup de IO. Vous pouvez éventuellement vous en tirer avec des réductions de taille répétées jusqu'à une taille cible de plus en plus petite.Voici l'exemple "A.)" du
DBCC SHRINKFILE
lien ci-dessus . Dans cet exemple, un fichier de données est réduit à une taille cible de 7 Mo. Ce format est un bon moyen de réduire de façon répétitive les délais d'indisponibilité de votre fenêtre. Je ferais cela en testant le développement pour voir à quoi ressemblent les performances et comment augmenter / diminuer l’incrément et pour déterminer le timing attendu en production. Il s'agit d'une opération en ligne - vous pouvez l'exécuter avec des utilisateurs du système accédant à la base de données en cours de réduction, mais les performances risquent de se dégrader, ce qui est presque garanti. Alors surveillez et regardez ce que vous faites sur le serveur, choisissez une fenêtre d'indisponibilité ou une période d'activité plus légère, idéalement.Rappelez-vous toujours que: - chaque fois que vous réduisez, vous fragmentez vos index et vous devez procéder à une reconstruction de l'index si vous souhaitez réduire la taille des morceaux sur une période prolongée. Vous engagez maintenant ce coût à chaque fois si vous ne pouvez pas le faire en une seule fenêtre.
2.) Nouvelle base de données - Vous pouvez créer une nouvelle base de données et y migrer des données. Vous devez scripter la base de données vide et toutes ses clés, index, objets, procs, fonctions, etc., puis y migrer des données. Vous pouvez écrire des scripts pour cela ou utiliser un outil tel que SQL Data Compare de Red Gate ou d’autres fournisseurs proposant des outils similaires. C’est davantage un travail d’installation de votre côté, davantage de développement et de tests, et selon votre environnement, la fenêtre d’indisponibilité peut également s’éjecter, mais constitue une option à envisager.
Lorsque je suis obligé de réduire une base de données Si c'était mon environnement, je laisserais un espace vide dans le fichier de données, car j'aime bien être un gros disque et être prêt pour une croissance future / inattendue. Je serais donc d'accord pour laisser de l'espace si nous supprimions simplement une majorité de cet espace, mais je ne ferais jamais confiance à ceux qui disent "mais ça ne grandira plus jamais" tout en laissant un espace blanc. La route avec laquelle j'irais probablement ( soupir) est l’approche de réduction si j’avais de plus petites fenêtres d’indisponibilité et que je ne voulais pas subir la complexité de la création d’une base de données vide et de la migration de données vers celle-ci. Donc, je le réduirais un tas de fois de manière incrémentielle (en fonction du nombre de fois que je pensais devoir le faire en fonction de mes tests en dev et de la taille souhaitée. En choisissant progressivement une taille de fichier plus petite), puis en reconstruisant les index .. Et puis je ' d jamais dire à personne que je réduis ma base de données ;-)
la source
DBCC SHRINKFILE
commande que vous mentionnez. Cela dépend de votre serveur du nombre de fichiers de votre base de données. Une base de données simple a un fichier de base de données et un fichier de journal des transactions.Nous savons tous qu'il n'est pas conseillé de faire SHRINK régulièrement de toute façon. J'essaie de laisser de côté tous les avertissements et dénis que vous connaissez probablement de toute façon. Faites une sauvegarde et ne le faites pas à la maison si possible :)
Bonus: dans l'environnement de réplication, si vous effectuez cette opération sur la base de données de l'éditeur, les bases de données des abonnés ne seront pas réduites (ce qui peut poser un problème de taille car il s'agit d'éditions Express).
Enfin, mon script de réindexation:
La seule variable dans ceci est la 14, qui peut être obtenue en émettant select
DB_ID('YourDBName')
, et le script suppose que vous n'êtes intéressé que par les tables du schéma dba. *.la source
Vous avez entendu tous les avertissements concernant la réduction des bases de données et ils sont tous vrais. Cela fragmentera vos index et, en général, gâchera votre base de données et ne devrait pas être fait sur un système de production.
Cependant, je le fais généralement chaque semaine lorsque je restaure une sauvegarde sur mon poste de travail en raison de l'espace disponible sur mon lecteur SSD. Remarquez que je n'ai pas écrit ce script mais que je l'ai trouvé il y a des années. Sur d’autres bases de données [250 Go], j’ai créé un package SSIS qui transfèrera les tables dont j’ai besoin, puis recrée les index pour cette sensation d’indexation si nouvelle.
la source
Cette citation ci-dessous provient directement de Microsoft (s’applique aux versions 2008-2016) et donne des indications sur la question de savoir si / quand et comment utiliser cette
DBCC SHRINKFILE
commande.https://msdn.microsoft.com/en-us/library/ms189493.aspx
la source