SQL Server : Interdire les opérations de Troncation du journal de transaction (TRUNCATE_ONLY, NO_LOG)
Une des plus mauvais comportements vus sur des serveurs de base de données et sans doute la troncation du journal de transaction. Certes son rôle est très mal connu, et souvent la question revient sur le pourquoi de la taille du fichier LDF (le journal de transaction).
J'avais fait un précédent post sur le sujet :
http://blogs.codes-sources.com/christian/archive/2007/02/12/sql-server-faq-sql-pourquoi-mon-fichier-de-log-ldf-est-il-aussi-gros-comment-diminuer-sa-taille.aspx
L'idée c'est que le journal de transaction enregistre toutes les modifications effectuées sur la base de données (une sorte de journal des requêtes en écriture). L'avantage étant de pouvoir rejouer le journal et de pouvoir restaurer la base de données dans un état stable à n'importe quel moment. Votre patron appelle et vous dit « Je perdu une données à 9h51 »… Votre dernière sauvegarde complète date de hier… Mais le journal est là et vous permet grâce à une restauration (RESTORE LOG … WITH STOPAT='dateetheure') de restaurer la base de données à 9h50, opération impossible sans le journal !
Le fait de tronquer le journal est une mauvaise chose dans pas mal de situation, car cela interdit ce type de restauration… En fait réaliser le TRUNCATE revient à utiliser le mode de récupération SIMPLE de la base de données, et ainsi indiqué au moteur : « ne gère pas le journal, fait des auto-truncate ». L'opération de troncation manuelle se réalise à l'aide de :
BACKUP LOG MaBase WITH NO_LOG
BACKUP LOG MaBase WITH TRUNCATE_ONLY
Dans le cas om vous avez souhaité gérer le journal de transaction, on s'attend à ce que vous fassiez des sauvegardes fréquentes de ce dernier. Mais comment interdire la Troncation du journal ? En fait il existe un traceflag qui permet d'interdire ces opérations sur le serveur. Celui-ci est activable soit au niveau des paramètres de démarrage du service, soit par la commande DBCC TRACEON.
DBCC TRACEON(3231, -1)
Dès lors si vous exécutez ce type de commande :
BACKUP LOG MaBase WITH TRUNCATE_ONLY
Et si la base de données MaBase n'existe pas, aucunes erreurs (ce qui n'est pas le cas normalement). En fait la commande est strictement ignorée et non exécutée par le moteur.
A noter que ces commandes disparaîtront de la version 2008 de SQL Server, voir le lien plus haut pour une commande similaire.
Bonnes sauvegardes…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :