Nous avons plusieurs machines sur lesquelles nous avons pré alloué la taille du journal des transactions à 50 Go. La taille de la table que j'essaye de réorganiser est de 55 à 60 Go mais va augmenter continuellement. La principale raison pour laquelle je souhaite réorganiser est de récupérer de l'espace et tout avantage de performance à cause de cela est un bonus supplémentaire.
Le niveau de fragmentation du tableau est de 30 à 35%. Sur certaines de ces machines, j'obtiens l'erreur "journal des transactions plein" et la réorganisation échoue. La taille du journal des transactions atteint jusqu'à 48 Go. Quelle est la bonne façon de contrer cela? Nous n'avons pas activé l'incrémentation automatique et je suis réticent à le faire.
Je peux augmenter la taille du journal à une valeur plus élevée, mais comme la taille de la table augmente à l'avenir, la valeur peut ne pas être suffisante. De plus, cela va à l'encontre de l'objectif de la réorganisation pour récupérer de l'espace si je veux augmenter la taille du journal de manière égale. Avez-vous des idées sur la façon de lutter efficacement contre cela? L'utilisation du mode groupé n'est pas une option car la perte de données n'est pas acceptable.
la source
REORGANIZE (comme dans ALTER INDEX ... REORGANIZE) est une opération très rapide (enfin, surtout ...), qui nécessite une petite quantité de journal, peut être interrompue à tout moment et reprise plus tard, et fonctionne en interne dans les transactions par petits lots :
Êtes-vous sûr de ne pas parler de reconstruction ? Un index REBUILD est lent, coûteux, consomme une quantité énorme de journaux (s'il n'est pas hors ligne et ne peut pas être journalisé de manière minimale , la reconstruction en ligne ne peut pas être journalisée de manière minimale), est une transaction géante unique et ne peut pas être interrompue sans perdre tout le travail.
Il me semble que vous faites une reconstruction, ce qui est une opération vraiment exceptionnelle que vous ne devriez pas faire à moins d'avoir une raison extrêmement bien pensée. Pour quel type de récupération d'espace souhaitez-vous? Quelque chose qui
DBCC CLEANTABLE
ne gèrera pas? Avez-vous vérifié la structure physique de la table, a-t-elle dérivé de la structure logique (voir les colonnes de table SQL Server sous le capot pour plus de détails)?Si vous devez vraiment reconstruire la table, je crains que vous n'ayez pas d'autre choix que de mordre la balle et d'allouer le journal nécessaire. Ne le laissez pas croître automatiquement, cela ne fera que ralentir le processus. Prépare-le à 2,5 fois la taille de la table.
Si la table est partitionnée, vous pouvez reconstruire hors ligne (et réorganiser) une partition à la fois. La reconstruction en ligne ne peut être effectuée qu'au niveau de la table entière.
la source
J'ai déjà eu ce problème.
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.
Créez une alerte WMI d'agent («Réorganiser la soupape de décharge») sur une condition de performance.
Créer un emploi («Réorganiser le chèque»)
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.
la source
C'est ce que je faisais d'habitude (j'ai aussi quelques tables de 80 + Go de large chacune) pour la réorganisation d'index (car la réorganisation d'index peut être arrêtée à tout moment sans perdre le travail de réorganisation précédent).
Dans mon cadre de maintenance d'index, je classe les index en deux groupes, l'un pour la reconstruction d'index et l'autre pour la réorganisation d'index. Pour la reconstruction d'index, j'utiliserai une approche quelque peu différente car je ne veux pas arrêter une session de reconstruction d'index (ce qui entraînera une restauration et perdra tout le travail précédent). Pendant la reconstruction de l'index, si ma session de surveillance remarque un scénario d'utilisation d'espace libre du fichier tlog, la session de surveillance pré-augmentera automatiquement le fichier tlog, et dans le pire des cas (c'est-à-dire que le disque est plein), ma session de surveillance créera un autre fichier journal ( mais plus tard, je le déposerai) sur un autre lecteur (le lecteur de sauvegarde)
la source
J'ai eu le même problème que l'auteur de la question, et en regardant ses commentaires, je peux dire que j'avais la même configuration. Pendant que j'essayais de faire un
REORGANIZE
, le journal devient plein, quelle que soit sa taille, voire plusieurs fois la taille de la table entière.Le problème est dû à la réplication transactionnelle . Apparemment, le journal ne peut pas être sauvegardé tant que l'
REORGANIZE
opération n'est pas terminée. J'ai lu quelque part que c'était un problème connu de Microsoft, mais je ne sais pas où.Une fois que j'ai désactivé la réplication transactionnelle, les sauvegardes de journaux ont à nouveau fonctionné normalement et les sauvegardes de journaux toutes les 30 secondes lors de la réorganisation ont bien fonctionné pour moi.
la source
Je suppose que vous exécutez quelque chose dans le sens de:
ALTER INDEX SUR LA RÉORGANISATION
Malheureusement, il n'y a aucun moyen d'exécuter une organisation partielle (la façon dont vous pouvez réduire partiellement un fichier journal par exemple). Les façons dont je peux penser autour de ces problèmes sont:
1) définissez la base de données en mode de récupération simple pendant que vous exécutez la réorganisation, mais vous avez dit que ce n'était pas acceptable
2) partitionner l'index - si vous pouvez penser à un moyen de partitionner l'index pour obtenir des partitions de taille approximativement égale, vous pourrez alors réorganiser (ou reconstruire avec l'option en ligne) chaque partition indépendamment et limiter ainsi la croissance du fichier journal
Je suis sûr que vous faites cela, mais si vous ne l'êtes pas, vous voudrez peut-être lancer une sauvegarde du fichier journal avant et après avoir effectué des optimisations d'index, ce qui lui permettra de récupérer l'espace utilisé.
la source