La sequenza viene riutilizzata


11

Ho una sequenza che genera numeri di tracciamento per oggetti nel mio sistema. Funzionava bene da un po 'di tempo.

La scorsa settimana abbiamo notato che stava iniziando a riutilizzare i valori.

Ciò che sembra accadere è che in diversi punti della sera, tornerà a un valore che aveva il giorno precedente. Continuerà quindi a generare valori da quel punto.

Quindi per esempio potrei ottenere qualcosa del genere:

10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...

Non sembra esserci alcun modello nel momento in cui accade, durata tra il primo utilizzo e il secondo utilizzo (fino a 10 minuti o diverse ore) o il numero di rollback (da 1 a un massimo di diverse centinaia).

Ho pensato di eseguire una traccia (e ancora può), ma non credo che l'oggetto sequenza venga modificato direttamente. Il motivo per cui credo sia che la data di modifica risale a diversi giorni fa e indica un momento in cui abbiamo aumentato manualmente il valore per cercare di eliminare i duplicati. (E il problema si è verificato più volte da allora.)

Qualcuno ha un'idea di cosa potrebbe causare un rollback della sequenza e riutilizzare i valori ogni notte?

AGGIORNAMENTO: per rispondere ad alcune domande nei commenti:

  • @@Version:

    Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 ottobre 2012 13:38:57

  • Crea script:

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
  • Non ho un vincolo unico (ma ho intenzione di metterne uno). Tuttavia, ciò mi aiuterà a sapere solo quando ho riutilizzato un valore. Non è ciò che ha causato il ripristino dei valori. Ho inserito un lavoro che otterrebbe un nuovo valore ogni 5 minuti e lo salverò. I tempi e i salti di valore non seguono uno schema.

  • Ho controllato i registri eventi per vedere se c'è un errore. L'unica cosa che sta accadendo è questa: http://support.microsoft.com/kb/2793634 Oggi applichiamo la correzione. Non penso che siano correlati, ma potrebbe essere.

1
Perché non c'è un vincolo PK o Unique su questa colonna? Con questo in atto, questo riutilizzo verrà catturato e non devi provare a indovinare da dove proviene, a meno che il tuo codice dell'applicazione non inghiotti tutti gli errori ...
Aaron Bertrand


Puoi mostrare la definizione della tua sequenza? Inoltre, è possibile controllare il registro degli errori per vedere se si sono verificati eventi significativi durante la notte (ad esempio failover, riavvio del servizio, problemi di memoria, ecc.)?
Aaron Bertrand

2
Che cosa è @@VERSION? Inoltre è cambiato qualcosa sull'ambiente? C'è un elemento di connessione che riporta qualcosa di simile. L'OP ritiene che fosse associato11.0.3000.0
Martin Smith il

2
Bene, CYCLE dice essenzialmente a SQL Server che stai bene con il riutilizzo dei valori. Non ho assolutamente idea perché hai questo problema, e non so che troverete il motivo per cui (quanto tempo dedichi indagare il motivo per cui si ha una gomma a terra, prima di basta sostituirlo?). Penso ancora che la tua scommessa migliore sia quella di avere un vincolo lì per impedire i duplicati e per disattivare la cache nella speranza di impedire il riutilizzo.
Aaron Bertrand

Risposte:


11

In primo luogo, se non si desidera che i duplicati in questa colonna, stato che in modo esplicito .

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

(O potresti voler rendere quella chiave primaria, o cambiare l'indice cluster, o cosa hai ...)

In ogni caso, sollevare un errore quando si genera un duplicato è molto meglio che semplicemente inserire ciecamente un duplicato che dovrai solo affrontare in seguito.

Successivamente, considera che una SEQUENZA è solo un generatore di numeri e per impostazione predefinita ha una cache di 50 valori. A seconda di come sono impostate le transazioni e di quali altri eventi critici si verificano su un server, è possibile che SQL Server possa "dimenticare" che ha generato determinati valori per te. Ci dispiace ma non so esattamente quali siano i criteri nella riproduzione di questo errore. Il modo per aggirare questo problema (fino a quando il bug non viene risolto / spiegato ) è cambiare la sequenza da usare NO CYCLEe NO CACHE, ad esempio:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

Nota che NO CACHEpuò influire sulle prestazioni e sulla concorrenza, ma aiuterà ad eliminare lacune, blocchi persi e, chissà, forse anche il tuo problema.

Potresti anche voler verificare di essere il Service Pack e la CU più recenti. A questo punto raccomando SP1 e CU10 con 3437 ; SP2 è uscito, ma c'è ancora un problema critico con le ricostruzioni online che potrebbero interessarti .


Bene, non posso avere il backup. Quindi se NO CACHE lo risolverà, allora è quello che farò.
Vaccano,

Ho pensato che potrebbero esserci delle transazioni che causano questo. Ma la pagina Sequence su MSDN dice "I numeri di sequenza vengono generati al di fuori dell'ambito della transazione corrente. Vengono consumati se la transazione che utilizza il numero di sequenza viene impegnata o ripristinata". Quindi ho scartato la mia teoria delle transazioni. Sono d'accordo che ci deve essere qualcos'altro in corso.
Vaccano,

Si scopre che basta impostarlo con NO CYCLE. (Almeno non è successo la scorsa notte.) Grazie per l'aiuto!
Vaccano,

1
FIX: L'oggetto sequenza genera valori di sequenza duplicati quando SQL Server 2012 o SQL Server 2014 è sotto pressione della memoria Si supponga di creare un oggetto sequenza con l'opzione CACHE abilitata in Microsoft SQL Server 2012 o SQL Server 2014. Quando l'istanza è sotto pressione della memoria e più connessioni simultanee richiedono valori di sequenza dallo stesso oggetto sequenza, è possibile generare valori di sequenza duplicati. Inoltre, si verifica un errore di violazione della chiave unica o primaria (PK) quando il valore della sequenza duplicata viene inserito in una tabella.
Andomar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.