Dans SQL Server 2008 R2, en quoi ces deux restaurations sont-elles différentes:
Exécutez une
ALTER
instruction, pendant quelques minutes, puis appuyez sur «Annuler l'exécution». La restauration complète prend quelques minutes.Exécutez la même
ALTER
instruction, mais assurez-vous que leLDF
fichier n'est pas assez volumineux pour qu'il se termine correctement. Une fois que laLDF
limite est atteinte et qu'aucune «croissance automatique» n'est autorisée, l'exécution de la requête s'arrête immédiatement (ou une restauration se produit) avec ce message d'erreur:
The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full.
To find out why space in the log cannot be reused, see the
log_reuse_wait_desc column in sys.databases
En quoi ces deux sont-ils différents sur les points suivants?
Pourquoi le deuxième «rollback» est-il instantané? Je ne suis pas tout à fait sûr si cela pourrait être appelé un retour en arrière. Je suppose que le journal des transactions est écrit au fur et à mesure que l'exécution progresse et une fois qu'il se rend compte qu'il n'y a pas assez d'espace pour terminer complètement la tâche, il s'arrête juste avec un message de «fin», sans validation.
Que se passe-t-il lorsque le premier rollback prend autant de temps (un rollback à un seul thread)?
2.1. SQL Server revient-il en arrière et annule-t-il les entrées effectuées dans leLDF
fichier?
2.2. LaLDF
taille du fichier diminue à la fin de la restauration (à partir deDBCC SQLPERF(LOGSPACE)
)Une question supplémentaire: pendant le deuxième scénario, SQL Server commence à consommer
LDF
fichier assez rapidement. Dans mon cas, il est passé de 18% d'utilisation à 90% d'utilisation dans les premières minutes (<4 minutes). Mais une fois qu'il a atteint 99%, il y est resté pendant 8 minutes supplémentaires, tout en faisant fluctuer l'utilisation entre 99,1% et 99,8%. Il augmente (99,8%) et diminue (99,2%) et augmente à nouveau (99,7%) et diminue (99,5%) quelques fois avant que l'erreur ne soit levée. Que se passe-t-il dans les coulisses?
Tous les liens MSDN qui pourraient aider à expliquer cela davantage sont appréciés.
À la suggestion d'Ali Razeghi, j'ajoute perfmon: Disk Bytes/sec
Réponses:
Comme indiqué ci-dessus, après avoir effectué plus de tests, je suis arrivé à des conclusions calculées. Je les ai tous résumés en un article de blog ici , mais je vais copier du contenu sur cet article pour la postérité.
Conjecture (basée sur certains tests)
Pour l'instant, je n'ai pas d'explication claire quant à la raison de cette situation. Mais voici mes estimations basées sur les artefacts recueillis lors des tests.
La restauration se produit dans les deux scénarios. L'un est un retour en arrière explicite (l'utilisateur clique sur le bouton Annuler), l'autre est implicite (le serveur SQL prend cette décision en interne).
Dans les deux scénarios, le trafic allant vers le fichier journal est cohérent. Voir les images ci-dessous:
Scénario 1:
Scénario 2:
Un artefact qui a renforcé cette ligne de pensée est la capture de la trace SQL dans les deux scénarios.
Comportement inexpliqué:
Toutes les idées pour mieux expliquer ce comportement sont les bienvenues.
la source
J'ai essayé l'expérience suivante et obtenu des résultats similaires. Dans les deux cas, fn_dblog () montre que la restauration se produit et semble se produire plus rapidement dans le scénario 2 que dans le scénario 1.
Au fait, j'ai placé le MDF et le LDF sur le même disque externe (USB 2.0).
Ma conclusion initiale est qu'il n'y a pas de différence dans le fonctionnement de la restauration dans ce cas, et probablement toute différence de vitesse apparente est liée au sous-système d'E / S. Ce n'est que mon hypothèse de travail pour le moment.
Scénario 1:
Scénario 2:
Résultats du moniteur de performances:
Scénario 1:
Scénario 2:
Code:
la source