La séquence réutilise


11

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.

1
Pourquoi n'y a-t-il pas de contrainte PK ou Unique sur cette colonne? Une fois cela en place, cette réutilisation sera bloquée, et vous n'aurez pas à essayer de deviner d'où elle vient, à moins que votre code d'application avale simplement toutes les erreurs ...
Aaron Bertrand


Pouvez-vous montrer la définition de votre séquence? Pouvez-vous également consulter le journal des erreurs pour voir si des événements importants se sont produits pendant la nuit (par exemple, basculement, redémarrage du service, problèmes de mémoire, etc.)?
Aaron Bertrand

2
Qu'est-ce que c'est @@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
Martin Smith

2
Eh bien, CYCLE dit essentiellement à SQL Server que vous êtes d'accord avec la réutilisation des valeurs. Je ne sais absolument pas pourquoi vous rencontrez ce problème, et je ne sais pas si vous découvrirez pourquoi (combien de temps passez-vous à rechercher pourquoi vous avez un pneu crevé, avant de le remplacer?). Je pense toujours que votre meilleur pari est d'avoir une contrainte pour empêcher les doublons et de désactiver la mise en cache dans l'espoir d'empêcher la réutilisation.
Aaron Bertrand

Réponses:


11

Tout d'abord, si vous ne voulez pas de doublons dans cette colonne, indiquez-le explicitement .

ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);

(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 CYCLEet NO CACHE, par exemple:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

Notez que cela NO CACHEpeut 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 .


Eh bien, je ne peux pas le sauvegarder. Donc, si AUCUN CACHE ne le réparera, c'est ce que je ferai.
Vaccano

Je pensais que des transactions pouvaient en être la cause. Mais la page de séquence sur MSDN indique que "les numéros de séquence sont générés en dehors de la portée de la transaction en cours. Ils sont consommés que la transaction utilisant le numéro de séquence soit validée ou annulée." J'ai donc rejeté ma théorie des transactions. Je suis d'accord qu'il doit y avoir autre chose.
Vaccano

Il s'avère que simplement le régler avec NO CYCLEétait suffisant. (Au moins, cela ne s'est pas produit hier soir.) Merci pour l'aide!
Vaccano

1
CORRECTIF: l'objet de séquence génère des valeurs de séquence en double lorsque SQL Server 2012 ou SQL Server 2014 est sous pression de mémoire Supposons que vous créez un objet de séquence dont l'option CACHE est activée dans Microsoft SQL Server 2012 ou SQL Server 2014. Lorsque l'instance est sous pression de mémoire et plusieurs connexions simultanées demandent des valeurs de séquence à partir du même objet de séquence, des valeurs de séquence en double peuvent être générées. En outre, une erreur de violation de clé unique ou primaire (PK) se produit lorsque la valeur de séquence en double est insérée dans une table.
Andomar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.