Comment videz-vous le journal de transactions de SQL Server ?
Réduire la taille d’un fichier journal devrait vraiment être réservé aux scénarios où il a connu une croissance inattendue que vous ne prévoyez pas de voir se reproduire. Si le fichier journal va croître à la même taille à nouveau, il n’est pas très utile de le réduire temporairement. Maintenant, selon les objectifs de récupération de votre base de données, voici les actions que vous devriez entreprendre.
Premièrement, effectuez une sauvegarde complète
Ne faites jamais de modifications à votre base de données sans vous assurer que vous pouvez la restaurer en cas de problème.
Si vous vous souciez de la récupération à un instant précis
(Et par récupération à un instant précis, je veux dire que vous souhaitez pouvoir restaurer à autre chose qu’une sauvegarde complète ou différentielle.)
Vraisemblablement, votre base de données est en mode de récupération FULL. Si ce n’est pas le cas, assurez-vous qu’elle l’est :
ALTER DATABASE testdb SET RECOVERY FULL;
-- and take another full backup here
-- so log backups are possible
Même si vous effectuez des sauvegardes complètes régulières, le fichier journal va croître et croître jusqu’à ce que vous effectuiez une sauvegarde du journal - c’est pour votre protection, pas pour grignoter inutilement votre espace disque. Vous devriez effectuer ces sauvegardes de journal assez fréquemment, selon vos objectifs de récupération. Par exemple, si vous avez une règle métier qui stipule que vous ne pouvez vous permettre de perdre pas plus de 15 minutes de données en cas de catastrophe, vous devriez avoir un travail qui sauvegarde le journal toutes les 15 minutes. Voici un script qui générera des noms de fichiers horodatés basés sur l’heure actuelle (mais vous pouvez aussi le faire avec des plans de maintenance, etc., ne choisissez simplement aucune des options de réduction dans les plans de maintenance, elles sont terribles).
DECLARE @path nvarchar(4000) = CONCAT(
N'\\backup_share\log\testdb_',
CONVERT(char(8), GETDATE(), 112), N'_',
REPLACE(CONVERT(char(8), GETDATE(), 108),':',''),
N'.trn');
BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;
WAITFOR DELAY '00:00:01';
GO 2 -- run twice to ensure file wrap-around
Notez que \\backup_share\ devrait être sur une machine différente qui représente un périphérique de stockage sous-jacent différent.
(Réponse tronquée)