Tengo una secuencia que genera números de seguimiento para objetos en mi sistema. Había estado funcionando bien durante bastante tiempo.
La semana pasada notamos que estaba empezando a reutilizar valores.
Lo que parece suceder es que en diferentes momentos de la noche, retrocederá a un valor que tenía el día anterior. Luego continuará generando valores desde ese punto.
Entonces, por ejemplo, podría obtener algo como esto:
10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...
No parece haber ningún patrón cuando ocurre, la duración entre el primer uso y el segundo uso (tan solo 10 minutos o varias horas) o cuántos se revierten (tan solo 1 y hasta varios cientos).
Pensé en ejecutar un seguimiento (y aún puede), pero no creo que el objeto de secuencia se esté modificando directamente. La razón por la que creo que esto es porque la fecha de modificación tiene varios días de antigüedad y señala un momento en el que aumentamos manualmente el valor para tratar de eliminar duplicados. (Y el problema ha ocurrido varias veces desde entonces).
¿Alguien tiene una idea de lo que podría causar una reversión de secuencia y reutilizar valores cada noche?
ACTUALIZACIÓN: Para responder algunas preguntas en los comentarios:
@@Version
:Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 de octubre de 2012 13:38:57
Crear secuencia de comandos:
CREATE SEQUENCE [schemaName].[SequenceName] AS [bigint] START WITH 410014104 INCREMENT BY 1 MINVALUE 410000000 MAXVALUE 419999999 CYCLE CACHE GO
No tengo una restricción única (pero planeo poner una). Sin embargo, eso solo me ayudará a saber cuándo he reutilizado un valor. No es lo que causó el restablecimiento de los valores. Puse un trabajo que obtendría un nuevo valor cada 5 minutos y lo guardaría. Los saltos de tiempo y valor no siguen un patrón.
- He revisado los registros de eventos para ver si hay un error. Lo único que está sucediendo es esto: http://support.microsoft.com/kb/2793634 Estamos aplicando la solución hoy. No creo que estén relacionados, pero podría estarlo.
fuente
@@VERSION
? ¿También ha cambiado algo sobre el medio ambiente? Hay un elemento de conexión que informa algo similar. El OP allí reconoce que estaba asociado11.0.3000.0
Respuestas:
Primero, si no desea duplicados en esta columna, dígalo explícitamente .
(O puede querer que esa sea la clave principal, o cambiar el índice agrupado, o lo que sea ...)
En cualquier caso, generar un error cuando genera un duplicado es mucho mejor que simplemente insertar a ciegas un duplicado con el que tendrá que lidiar más tarde.
Luego, considere que una SECUENCIA es solo un generador de números, y por defecto tiene un caché de 50 valores. Dependiendo de cómo estén configuradas sus transacciones y qué otros eventos críticos suceden en un servidor, es posible que SQL Server pueda "olvidar" que generó ciertos valores para usted. Lo siento, pero no sé exactamente qué criterios influyen en la reproducción de este error. La forma de evitar esto (hasta que se solucione / explique el error ) es cambiar la secuencia a usar
NO CYCLE
yNO CACHE
, por ejemplo:Tenga en cuenta que
NO CACHE
puede afectar el rendimiento y la concurrencia, pero ayudará a eliminar las brechas, los bloques perdidos y, quién sabe, quizás también su problema.También es posible que desee verificar que está en el Service Pack y CU más recientes. En este punto, recomiendo SP1 y CU10 con 3437 ; SP2 está fuera pero todavía hay un problema crítico con las reconstrucciones en línea que pueden afectarlo .
fuente
NO CYCLE
fue suficiente. (Al menos no sucedió anoche). ¡Gracias por la ayuda!