DBCC SHRINKFILE sur le fichier de log ne réduit pas la taille, même après le JOURNAL de SAUVEGARDE sur le DISQUE
J'ai une base de données, [Ma DB], qui a les informations suivantes:
SQL Server 2008
MDF taille: 30 GO
LDF taille: 67 GO
Je voulais réduire le fichier journal, autant que possible, et j'ai donc commencé ma quête pour comprendre comment le faire. Mise en garde: je ne suis pas un DBA (ou même à l'approche d'un DBA) et ont été en progression par se sentir à travers cette quête.
Tout d'abord, je suis juste allé dans SSMS, DB propriétés, Fichiers, et édité la Taille Initiale (MO) sur la valeur 10. Qui réduit le fichier journal de 62 GO (pas exactement le 10 MO que je suis entré). Donc, j'ai attaché le générateur de profils SQL, vu que la commande DBCC SHRINKFILE a été appelé. J'ai ensuite entré cette commande dans l'éditeur de requête et voici les résultats.
DBCC SHRINKFILE (N'My DB_Log' , 10)
Et le résultat a été:
Cannot shrink log file 2 (My DB_Log) because the logical log file located at the end of the file is in use.
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
------ ----------- ----------- ----------- ----------- --------------
8 2 8044104 12800 8044104 12800
(1 row(s) affected)
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Puis j'ai fait quelques recherches et trouvé ceci:
http://support.microsoft.com/kb/907511
Qui dit que j'ai besoin de sauvegarder le fichier journal avant de le shrinkfile de sorte que les fichiers journaux virtuels seront libérés et les shrinkfile peut faire son travail - je ne sais pas ce que ça veut dire que... je suis juste paraphrase ici 🙂
Donc, j'ai pensé que je voudrais essayer de sauvegarder le fichier journal, puis faire un DBCC SHRINKFILE (et j'ai changé à la nouvelle taille du fichier journal à 12800 puisque c'était le MinimumSize identifiés dans les résultats de la précédente commande DBCC SHRINKFILE)
BACKUP LOG [My DB] TO DISK = 'D:\SQLBackup110824-MyDB-Log.bak'
GO
DBCC SHRINKFILE (N'My DB_Log' , 12800)
GO
Le résultat est le même que le début. Je ne peux obtenir le fichier journal à 62 GO.
Je ne suis pas sûr de ce que je fais mal et ce que je devrais essayer la prochaine.
- afin d'éviter que cela se reproduise, vous devez exécuter des sauvegardes de journaux ou de définir le mode de récupération simple.
- Mon problème était en PAUSE RÉPLICATION de configuration -- il semble sql qui ne rétrécit pas tlogs si elle pense qu'elle en aurez besoin pour la réplication. Ce ne sera probablement pas être très nombreuses personnes du problème, mais il pourrait aider un peu.
Vous devez vous connecter pour publier un commentaire.
En outre les étapes que vous avez déjà prises, vous devez définir le mode de récupération simple avant, vous pouvez réduire le journal.
CE n'EST PAS UNE PRATIQUE RECOMMANDÉE pour les systèmes de production..., Vous allez perdre votre capacité à récupérer à un point dans le temps à partir de sauvegardes précédentes/fichiers journaux.
Voir l'exemple B sur cette DBCC SHRINKFILE (Transact-SQL) page msdn pour un exemple et une explication.
Ok, c'est une solution pour réduire la taille physique du fichier de transaction, mais sans en changeant le mode de récupération simple.
À l'intérieur de votre base de données, recherchez le file_id du fichier journal à l'aide de la requête suivante.
Dans mon exemple, le fichier journal est file_id 2. Maintenant, nous voulons localiser les journaux virtuels en cours d'utilisation, et de le faire avec la commande suivante.
Ici, vous pouvez voir si tous les journaux virtuels sont en cours d'utilisation par voir si l'état est de 2 (en cours d'utilisation), ou 0 (libre). Lors de la réduction de fichiers, vide journaux virtuels sont physiquement supprimées à partir de la fin du fichier jusqu'à ce qu'il frappe le premier état. C'est pourquoi la réduction d'un fichier journal des transactions parfois réduit une partie de la route, mais ne supprime pas tous libres journaux virtuels.
Si vous remarquez un statut 2 qui se produisent après 0, c'est le blocage de la réduction de pleinement de réduire le fichier. Pour contourner ce faire une autre sauvegarde du journal des transactions, et immédiatement l'exécution de ces commandes, l'approvisionnement du file_id trouvé ci-dessus, et la taille que vous souhaitez que votre fichier journal doit être réduite.
Ce sera ensuite afficher le fichier journal virtuel de répartition, et j'espère que vous remarquerez qu'il est été un peu réduite. Parce que les fichiers journaux virtuels ne sont pas toujours attribués dans l'ordre, vous pouvez avoir une sauvegarde du journal des transactions d'un couple de fois et exécuter cette dernière requête à nouveau; mais je peux normalement le rétrécir au sein d'une sauvegarde ou deux.
- Je utiliser ce script sur un serveur sql server 2008 R2.
Essayer cette
Paul Randal a un exccellent la discussion de ce problème sur son blog: http://www.sqlskills.com/blogs/paul/post/backup-log-with-no_log-use-abuse-and-undocumented-trace-flags-to-stop-it.aspx
Pour les fichiers journaux, le Moteur de Base de données utilise target_size pour calculer la taille de la cible pour l'ensemble du journal; par conséquent, target_size est la quantité d'espace libre dans le journal, après l'opération de réduction. La taille de la cible pour l'ensemble du journal est ensuite traduit à la taille de la cible pour chaque fichier journal. DBCC SHRINKFILE tente de réduire chaque fichier journal physique à la taille de la cible immédiatement.
Toutefois, si une partie de la logique du journal réside dans les journaux virtuels au-delà de la taille de la cible, le Moteur de Base de données libère autant d'espace que possible, puis émet un message d'information.
Le message décrit quelles actions sont nécessaires pour déplacer la logique journal de journaux virtuels à la fin du fichier. Lorsque les actions sont effectuées, DBCC SHRINKFILE peut être utilisé pour libérer le reste de l'espace.
Parce qu'un fichier journal ne peut être réduit à une limite de fichier journal virtuel, de la réduction d'un fichier journal à une taille plus petite que la taille d'un fichier journal virtuel peut ne pas être possible, même si elle n'est pas utilisée. La taille du fichier journal virtuel est choisi dynamiquement par le Moteur de Base de données lorsque les fichiers journaux sont créés ou étendus.
Si le rétrécissement de l'opération s'exécute sans erreur, mais le fichier ne semble pas avoir changé de taille, de vérifier que le fichier a suffisamment d'espace libre pour supprimer en effectuant l'une des opérations suivantes:
Exécuter la requête suivante.
Exécuter le DBCC SQLPERF commande à retourner à l'espace utilisé dans le journal des transactions.
Si l'espace disponible est insuffisant, l'opération de réduction ne peut pas réduire la taille de fichier plus loin.
Généralement c'est le fichier journal qui semble impossible à réduire. C'est généralement le résultat d'un fichier journal qui n'a pas été tronqué.
Vous pouvez tronquer le journal par la définition de la base de données modèle de récupération SIMPLE, ou par de sauvegarder le journal et puis en exécutant le DBCC SHRINKFILE opération à nouveau.
Exemple :
De réduire un fichier journal spécifié la taille de la cible
L'exemple suivant réduit la taille du fichier journal dans la base de données AdventureWorks à 1 MO. Pour permettre la commande DBCC SHRINKFILE de réduire le fichier, le fichier est tronqué par la définition de la base de données de modèle de récupération SIMPLE.
UTILISATION AdventureWorks2012;
ALLER
-- Tronquer le journal par la modification de la base de données de modèle de récupération SIMPLE.
MODIFIER la BASE de données AdventureWorks2012
SET DE RÉCUPÉRATION SIMPLE;
ALLER
-- Réduire le tronquée fichier journal à 1 MO.
DBCC SHRINKFILE (AdventureWorks2012_Log, 1);
ALLER
-- Reset de la base de données modèle de récupération.
MODIFIER la BASE de données AdventureWorks2012
SET DE RÉCUPÉRATION COMPLÈTE;
ALLER
Lorsque vous utilisez DBCC SHRINKFILE(Fichier, taille) il ne tronque à partir de la fin du fichier journal en arrière aussi loin qu'il peut aller. Quand il atteint les plus hauts journal virtuel encore en usage, il ne peut pas rétrécir davantage. Ceci est décrit dans la documentation en Ligne SQL Server à:
http://technet.microsoft.com/en-us/library/ms189493.aspx
Donc, une fois que le haut de gamme du journal est clair, il peut être rétréci vers le bas à la taille. Encore une fois, cela dépendra de la façon dont beaucoup de le journal est encore en usage. Le journal peut être effacé par les sauvegardes, mais les sauvegardes ne sera pas effacer les transactions incomplètes, de sorte que le journal peut rester dans un haut de gamme VLF même après de multiples sauvegardes.
À l'égard de l'augmentation et de la diminution de fichiers journaux virtuels, quelle est le fichier journal créé à l'origine et qu'est-ce que le réglage pour le fichier journal de la croissance? Si elle se développe par une petite quantité qu'il permettra de créer plus de fichiers journaux virtuels que quiconque le désire.
Un modèle commun pour la réduction d'un fichier journal est point de contrôle, de SAUVEGARDE, SHRINKFILE, point de contrôle, de SAUVEGARDE, SHRINKFILE, etc jusqu'à ce que vous obtenez des résultats. Il existe de nombreuses raisons pour que le journal ne peut pas être rétractable, y compris une très grande restauration.
Le passage de la Simple à la Pleine a un Problème:
Il y a des règles et des exceptions ici. Nous allons parler de la longue transactions en cours d'exécution en profondeur ci-dessous.
Mais une mise en garde à garder à l'esprit pour le Mode de Récupération Complet est ceci: Si vous venez de passer en mode de Récupération Complète, mais ne jamais prendre une Sauvegarde Complète initiale, SQL Server ne pas honorer votre demande à être dans le modèle de Récupération Complète. Votre journal des transactions continuera à fonctionner comme il l'a dans Simpleuntil vous passez en mode de Récupération Complète ET de prendre votre première Sauvegarde Complète.
Modèle de Récupération complète sans les sauvegardes du journal est mauvais:
Donc, c'est la raison la plus courante pour incontrôlée de la croissance des journaux? Réponse: en Étant en mode de Récupération Complète sans avoir un journal des sauvegardes.
Cela arrive tout le temps aux gens.
Pourquoi cette erreur commune?
Pourquoi fait-il tout le temps? Parce que chaque nouvelle base de données obtient son premier paramètre du mode de récupération en regardant le modèle de base de données.
Du modèle initial modèle de récupération paramètre est toujours le Modèle de Récupération Complète - jusqu'à ce que et à moins que quelqu'un changements. On pourrait dire que le "mode de Récupération par défaut du Modèle" est Plein. Beaucoup de gens ne sont pas conscients de cela et ont leurs bases de données fonctionnant en mode de Récupération Complète sans les sauvegardes du journal, et, par conséquent, un fichier journal des transactions beaucoup plus grande que nécessaire. C'est pourquoi il est important de changer les valeurs par défaut quand ils ne travaillent pas pour votre organisation et de ses besoins)
J'ai essayé de plusieurs façons, mais cela fonctionne.
Exemple de code est disponible dans DBCC SHRINKFILE
Grâce à @user2630576 et @Ed.S.
la suite travaillé un régal: