J'ai une séquence qui génère des numéros de suivi pour les objets de mon système. Cela fonctionnait bien depuis un certain temps.
La semaine dernière, nous avons remarqué qu'il commençait à réutiliser des valeurs.
Ce qui semble se produire, c'est qu'à différents moments de la soirée, il reviendra à une valeur qu'il avait la veille. Il continuera ensuite à générer des valeurs à partir de ce point.
Ainsi, par exemple, je pourrais obtenir quelque chose comme ceci:
10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...
Il ne semble pas y avoir de modèle dans le cas où cela se produit, la durée entre la première utilisation et la deuxième utilisation (aussi peu que 10 minutes ou plusieurs heures) ou combien sont annulées (aussi peu que 1 et plusieurs centaines).
J'ai pensé à exécuter une trace (et je peux toujours le faire), mais je ne pense pas que l'objet séquence soit directement modifié. La raison pour laquelle je pense que c'est que la date de modification est vieille de plusieurs jours et indique une heure où nous avons augmenté manuellement la valeur pour essayer d'éliminer les doublons. (Et le problème s'est produit plusieurs fois depuis lors.)
Quelqu'un a-t-il une idée de ce qui pourrait provoquer une restauration de séquence et réutiliser des valeurs chaque nuit?
MISE À JOUR: Pour répondre à quelques questions dans les commentaires:
@@Version
:Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 octobre 2012 13:38:57
Créer un script:
CREATE SEQUENCE [schemaName].[SequenceName] AS [bigint] START WITH 410014104 INCREMENT BY 1 MINVALUE 410000000 MAXVALUE 419999999 CYCLE CACHE GO
Je n'ai pas de contrainte unique (mais je prévois d'en mettre une). Cependant, cela ne m'aidera qu'à savoir quand j'ai réutilisé une valeur. Pas ce qui a causé la réinitialisation des valeurs. J'ai mis un travail qui obtiendrait une nouvelle valeur toutes les 5 minutes et l'enregistrerait. Les sauts de temps et de valeur ne suivent pas un modèle.
- J'ai vérifié les journaux d'événements pour voir s'il y a une erreur. La seule chose qui se passe est la suivante: http://support.microsoft.com/kb/2793634 Nous appliquons le correctif aujourd'hui. Je ne pense pas que ces éléments soient liés, mais cela pourrait l'être.
la source
@@VERSION
? Est-ce que quelque chose a également changé dans l'environnement? Il y a un élément de connexion de déclaration similaire. L'OP estime qu'il y était associé11.0.3000.0
Réponses:
Tout d'abord, si vous ne voulez pas de doublons dans cette colonne, indiquez-le explicitement .
(Ou vous voudrez peut-être en faire la clé primaire, ou changer l'index cluster, ou qu'avez-vous ...)
Dans tous les cas, il est préférable de déclencher une erreur lorsque vous générez un doublon que d'insérer aveuglément un doublon que vous devrez traiter plus tard.
Ensuite, considérez qu'une SEQUENCE n'est qu'un générateur de nombres, et par défaut, elle a un cache de 50 valeurs. Selon la façon dont vos transactions sont configurées et quels autres événements critiques se produisent sur un serveur, il est possible que SQL Server "oublie" qu'il a généré certaines valeurs pour vous. Désolé, mais je ne sais pas exactement quels critères jouent dans la reproduction de ce bogue. La façon de contourner cela (jusqu'à ce que le bogue soit résolu / expliqué ) est de changer la séquence à utiliser
NO CYCLE
etNO CACHE
, par exemple:Notez que cela
NO CACHE
peut affecter les performances et la simultanéité, mais aidera à éliminer les lacunes, les blocs perdus et, qui sait, peut-être aussi votre problème.Vous pouvez également vouloir vérifier que vous utilisez le Service Pack et l'UC les plus récents. À ce stade, je recommande SP1 et CU10 avec 3437 ; SP2 est sorti mais il y a toujours un problème critique avec les reconstructions en ligne qui peuvent vous affecter .
la source
NO CYCLE
était suffisant. (Au moins, cela ne s'est pas produit hier soir.) Merci pour l'aide!