J'ai déjà eu ce problème.
- Vous avez une grande base de données et un petit lecteur de journaux. Vous souhaitez vous réorganiser (pour diverses raisons).
- Lorsque vous essayez cela sur une grande table fragmentée, le journal se remplit jusqu'à ce que le lecteur de journal soit plein, puis la commande s'interrompt.
- S'il est en mode simple, d'autres transactions peuvent échouer jusqu'à ce que le journal soit effacé au prochain point de contrôle, et s'il est en mode complet, d'autres transactions peuvent échouer jusqu'à la prochaine sauvegarde du journal. Coupure!
- Si vous êtes en mode complet, vous augmentez la fréquence de sauvegarde de vos journaux, mais cela n'aide pas à éviter le problème car la réorganisation est effectuée dans une transaction implicite, le journal n'est pas effacé jusqu'à ce que cette transaction se termine ou soit abandonnée ou arrêtée.
- Et vous voulez vraiment que la réorganisation se termine.
C'est un peu contre-intuitif car vous savez que si vous abandonnez la réorganisation, elle peut continuer là où elle s'était arrêtée, c'est juste qu'un abandon valide la transaction plutôt que d'annuler.
Voici ce que vous faites. C'est un peu long mais simple.
- Prépare votre fichier journal à une taille relativement grande, mais pas au maximum. Fondamentalement, vous voulez laisser suffisamment d'espace pour effectuer un travail utile, plus pour certaines petites croissances si elles se produisent, afin que les opérations normales ne s'arrêtent pas.
- Créez un travail pour exécuter la réorganisation de votre index («Réorganiser»).
Créez une alerte WMI d'agent («Réorganiser la soupape de décharge») sur une condition de performance.
- Objet: SQLServer: bases de données
- Compteur: journal de pourcentage utilisé
- Instance: (votre grand nom de base de données)
- Alerte si le compteur dépasse: 80
- Réponse: exécuter le travail («Réorganiser le contrôle»)
Créer un emploi («Réorganiser le chèque»)
- Dans la tâche, vérifiez msdb.dbo.sysjobactivity pour voir si la tâche «Réorganiser» est en cours d'exécution. Et si c'est le cas ...
- Arrêtez le travail et interrogez jusqu'à ce qu'il s'arrête. Cela peut prendre quelques secondes.
- (Si vous êtes en mode complet) Déclenchez votre travail de sauvegarde du journal et confirmez quand il se termine.
- Vérifiez à nouveau les sys.dm_os_performance_counters que votre compteur d'espace libre de journal a réduit en dessous de votre seuil.
- Démarrez le travail de «réorganisation».
Testez tout cela quelque part, même un bac à sable de développement, pour vous assurer qu'il fonctionne correctement avant de le coller sur votre serveur de production.
Ce que vous verrez, c'est que le travail de «réorganisation» commence et commence à remplir le journal. Lorsque le journal atteint un pourcentage plein, il déclenche l'alerte WMI (dans les 30 secondes environ) qui exécute votre autre travail qui voit que le travail «Réorganiser» est en cours d'exécution et donc probablement en faute. Il arrête ensuite «Réorganiser», effectue une sauvegarde, confirme que l'espace libre du journal est de retour à une valeur raisonnable, puis redémarre votre travail «Réorganiser» qui reprendra là où il s'était arrêté.
Donc, comme vous le pouvez, la raison pour laquelle vous avez prédéfini votre journal à un chiffre raisonnable dans ce scénario est de réduire le nombre de croissance / déclencheur / travail / arrêt / redémarrage, afin qu'il puisse être plus efficace et également conserver suffisamment d'espace pour le croissances occasionnelles qui ne sont pas prises à temps.
C'est une sorte de scénario étrange. Je suis presque sûr que j'aurais reculé devant cela il y a quelques années et, évidemment, il y a ici des problèmes fondamentaux sous-jacents. Mais si vous traitez des centaines de serveurs, quelques cas comme celui-ci surgiront qui ne peuvent être traités d'aucune manière, pour quelque raison que ce soit, sauf par MacGyvering, une solution temporaire qui fait le travail.
Tant qu'il est sûr, logique, testé et bien documenté, il ne devrait y avoir aucun problème.