J'ai une base de données, [My DB], qui contient les informations suivantes:
SQL Server 2008
Taille du MDF: 30 Go
Taille du fichier LDF: 67 Go
Je voulais réduire le fichier journal autant que possible et j'ai donc commencé ma quête pour savoir comment faire cela. Mise en garde: je ne suis pas un administrateur de base de données (ni même je m'approche d'un administrateur de base de données) et j'ai progressé de manière continue dans cette quête.
Premièrement, je viens d’entrer dans SSMS, Propriétés de la base de données, Fichiers et édité la valeur Taille initiale (Mo) à 10. Cela a réduit le fichier journal à 62 Go (pas exactement les 10 Mo que j’ai entrés). J'ai donc joint SQL Profiler, vu que DBCC SHRINKFILE était 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 la sortie était:
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.
J'ai ensuite fait des recherches à ce sujet et trouvé ceci:
http://support.Microsoft.com/kb/907511
Ce qui indique que je dois sauvegarder le fichier journal avant le fichier shrinkfile afin que les fichiers journaux virtuels soient publiés et que le fichier shrinkfile puisse faire son travail - je ne sais pas ce que cela signifie ... Je suis juste en train de paraphraser ici :)
J'ai donc pensé que j'essaierais de sauvegarder le fichier journal, puis de créer un fichier DBCC SHRINKFILE (et que j'ai changé la taille du nouveau fichier journal en 12800 car il s'agissait de la taille MinimumSize identifiée dans le résultat de la commande DBCC SHRINKFILE précédente).
BACKUP LOG [My DB] TO DISK = 'D:\SQLBackup\20110824-MyDB-Log.bak'
GO
DBCC SHRINKFILE (N'My DB_Log' , 12800)
GO
Le résultat était le même que celui du premier tour. Je ne peux obtenir que le fichier journal jusqu'à 62 Go.
Je ne suis pas sûr de ce que je fais mal et de ce que je devrais essayer ensuite.
En plus des étapes déjà entreprises, vous devrez définir le mode de récupération sur simple avant de pouvoir réduire le journal.
THIS IS CE N'EST PAS UNE PRATIQUE RECOMMANDÉE pour les systèmes de production ... Vous perdrez votre capacité à récupérer jusqu'à un point dans temps des sauvegardes précédentes/fichiers journaux.
Voir l'exemple B à ce sujet DBCC SHRINKFILE (Transact-SQL) page msdn pour un exemple, ainsi que des explications.
Ok, voici une solution pour réduire la taille physique du fichier de transaction, mais sans pour autant changer le mode de récupération en simple.
Dans votre base de données, localisez le fichier_id du fichier journal à l'aide de la requête suivante.
SELECT * FROM sys.database_files;
Dans mon exemple, le fichier journal est file_id 2. Maintenant, nous voulons localiser les journaux virtuels utilisés et le faire avec la commande suivante.
DBCC LOGINFO;
Vous pouvez voir ici si des journaux virtuels sont utilisés en vérifiant si le statut est 2 (en cours d'utilisation) ou 0 (gratuit). Lors de la réduction de fichiers, les journaux virtuels vides sont physiquement supprimés à partir de la fin du fichier jusqu'à ce qu'il atteigne le premier statut utilisé. C'est pourquoi la réduction d'un fichier journal de transactions le réduit parfois partiellement mais ne supprime pas tous les journaux virtuels libres.
Si vous remarquez qu'un statut 2 se produit après les 0, cela empêche la réduction de la taille du fichier. Pour contourner ce problème, effectuez une autre sauvegarde du journal des transactions et exécutez immédiatement ces commandes, en fournissant le fichier_id trouvé ci-dessus et la taille souhaitée pour votre fichier journal.
-- DBCC SHRINKFILE (file_id, LogSize_MB)
DBCC SHRINKFILE (2, 100);
DBCC LOGINFO;
Cela montrera alors l'allocation de fichier journal virtuel, et j'espère que vous remarquerez qu'elle a été quelque peu réduite. Les fichiers journaux virtuels n'étant pas toujours alloués dans l'ordre, vous devrez peut-être sauvegarder le journal des transactions plusieurs fois et exécuter à nouveau cette dernière requête; mais je peux normalement le réduire dans une sauvegarde ou deux.
J'utilise ce script sur SQL Server 2008 R2.
USE [db_name]
ALTER DATABASE [db_name] SET RECOVERY SIMPLE WITH NO_WAIT
DBCC SHRINKFILE([log_file_name]/log_file_number, wanted_size)
ALTER DATABASE [db_name] SET RECOVERY FULL WITH NO_WAIT
Essaye ça
ALTER DATABASE XXXX SET RECOVERY SIMPLE
use XXXX
declare @log_File_Name varchar(200)
select @log_File_Name = name from sysfiles where filename like '%LDF'
declare @i int = FILE_IDEX ( @log_File_Name)
dbcc shrinkfile ( @i , 50)
Paul Randal a une excellente discussion sur 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
Réduire un fichier journal
Pour les fichiers journaux, le moteur de base de données utilise target_size pour calculer la taille cible pour l'ensemble du journal. target_size correspond donc à la quantité d'espace libre dans le journal après l'opération de réduction. La taille cible de l'ensemble du journal est ensuite traduite en taille cible pour chaque fichier journal. DBCC SHRINKFILE essaie de réduire immédiatement chaque fichier journal physique à sa taille cible.
Toutefois, si une partie du journal logique réside dans les journaux virtuels au-delà de la taille cible, le moteur de base de données libère autant d'espace que possible et envoie ensuite un message d'information.
Le message décrit les actions requises pour déplacer le journal logique des journaux virtuels à la fin du fichier. Une fois les actions effectuées, DBCC SHRINKFILE peut être utilisé pour libérer l’espace restant.
Étant donné qu'un fichier journal ne peut être réduit qu'à une limite de fichier journal virtuel, il peut s'avérer impossible de réduire la taille d'un fichier journal à une taille inférieure à celle d'un fichier journal virtuel, même si ce n'est pas le cas. en cours d'utilisation . La taille du fichier journal virtuel est choisie dynamiquement par le moteur de base de données lors de la création ou de l'extension des fichiers journaux.
- Dépannage: le fichier ne se réduit pas
Si l'opération de réduction s'exécute sans erreur, mais que la taille du fichier ne semble pas avoir changé, vérifiez que le fichier dispose de suffisamment d'espace libre pour être supprimé, en effectuant l'une des opérations suivantes:
Exécutez la requête suivante.
SELECT nom, taille/128.0 - CAST (FILEPROPERTY (nom, 'SpaceUsed') AS int) /128.0 AS AvailableSpaceInMB FROM sys.database_files;
Exécutez la commande DBCC SQLPERF pour renvoyer 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 davantage la taille du fichier.
En règle générale, il semble que le fichier journal ne soit pas réduit. Cela est généralement le résultat d'un fichier journal qui n'a pas été tronqué.
Vous pouvez tronquer le journal en définissant le modèle de récupération de la base de données sur SIMPLE , ou en en sauvegardant le journal , puis en exécutant à nouveau l'opération de DBCC SHRINKFILE .
Exemple:
Réduire un fichier journal à une taille cible spécifiée
L'exemple suivant réduit le fichier journal de la base de données AdventureWorks à 1 Mo. Pour permettre à la commande DBCC SHRINKFILE de réduire le fichier, le fichier est tout d'abord tronqué en définissant le modèle de récupération de base de données sur SIMPLE.
Transact-SQL
USE AdventureWorks2012;
ALLER
- Tronquez le journal en modifiant le modèle de récupération de base de données sur SIMPLE.
ALTER DATABASE AdventureWorks2012
SET RECOVERY SIMPLE;
ALLER
- Réduisez le fichier journal tronqué à 1 Mo.
DBCC SHRINKFILE (AdventureWorks2012_Log, 1);
ALLER
- Réinitialisez le modèle de récupération de base de données.
ALTER DATABASE AdventureWorks2012
SET PULL RECOVERY;
ALLER
Lorsque vous utilisez DBCC SHRINKFILE (taille du fichier journal), il est tronqué à partir de la fin du fichier journal dans la mesure du possible. Lorsqu'il atteint le journal virtuel le plus élevé encore utilisé, il ne peut plus être réduit. Ceci est décrit dans la documentation en ligne de SQL Server à l'adresse:
http://technet.Microsoft.com/en-us/library/ms189493.aspx
Ainsi, une fois que le haut du journal est clair, sa taille peut être réduite. Encore une fois, cela dépendra de la quantité de journaux encore utilisée. Le journal peut être effacé par des sauvegardes, mais les sauvegardes n'effaceront pas les transactions incomplètes. Le journal peut donc rester dans un environnement haut de gamme VLF même après plusieurs sauvegardes.
En ce qui concerne l'augmentation et la diminution du nombre de fichiers VLF, quelle était la taille du fichier journal créé à l'origine et quel est le paramètre de croissance du fichier journal? Si elle ne pousse que très peu, cela créera plus de VLF que quiconque ne le souhaite.
Passage de Simple à Complet a un problème:
Il y a des règles et des exceptions ici. Nous parlerons des transactions longues en profondeur ci-dessous.
Voici toutefois un inconvénient à garder à l’esprit pour le mode de récupération complète: si vous passez simplement en mode de récupération complète, mais ne prenez jamais une sauvegarde complète initiale, SQL Server n’acceptera pas votre demande d’être dans le modèle de récupération complète. Votre journal des transactions continuera à fonctionner comme dans Simplement, jusqu’à ce que vous passiez au modèle de récupération complète ET que vous effectuiez votre première sauvegarde complète.
Le modèle de récupération complète sans sauvegardes de journal est incorrect:
C’est donc la raison la plus courante de la croissance incontrôlée des grumes? Réponse: être en mode de récupération complète sans aucune sauvegarde de journal.
Cela arrive tout le temps aux gens.
Pourquoi est-ce une erreur si courante?
Pourquoi ça arrive tout le temps? Parce que chaque nouvelle base de données obtient son paramètre de modèle de récupération initial en consultant la base de données model.
Le paramètre de modèle de récupération initial du modèle est toujours Modèle de récupération complète - jusqu'à et sauf si quelqu'un le modifie. Vous pouvez donc dire que le "modèle de récupération par défaut" est Full. Beaucoup de personnes ne le savent pas et leurs bases de données s'exécutent dans Full Recovery Model sans sauvegarde de journal, et par conséquent un fichier journal de transaction beaucoup plus volumineux que nécessaire. C'est pourquoi il est important de modifier les valeurs par défaut lorsqu'elles ne fonctionnent pas pour votre organisation et ses besoins.
J'ai essayé de nombreuses manières mais cela fonctionne.
Le code exemple est disponible dans DBCC SHRINKFILE
USE DBName;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE DBName
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (DBName_log, 1); --File name SELECT * FROM sys.database_files; query to get the file name
GO
-- Reset the database recovery model.
ALTER DATABASE DBName
SET RECOVERY FULL;
GO