시퀀스가 재사용 중입니다


11

시스템의 객체에 대한 추적 번호를 생성하는 시퀀스가 ​​있습니다. 꽤 오랫동안 작동했습니다.

지난 주에 우리는 값을 재사용하기 시작했습니다.

일어날 것으로 보이는 것은 저녁의 다른 지점에서 전날의 값으로 롤백한다는 것입니다. 그런 다음 해당 지점에서 값을 계속 생성합니다.

예를 들어 다음과 같은 것을 얻을 수 있습니다.

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

첫 사용과 두 번째 사용 사이의 기간 (10 분 또는 몇 시간) 또는 롤백 된 수 (1과 수백) 사이에 패턴이없는 것 같습니다.

나는 추적을 실행하는 것에 대해 생각했지만 여전히 시퀀스 객체가 직접 수정되고 있다고 생각하지 않습니다. 내가 생각하는 이유는 수정 날짜가 며칠이었고 중복을 시도하고 제거하기 위해 수동으로 값을 올린 시간을 가리 키기 때문입니다. (그리고 그 이후로 문제가 여러 번 발생했습니다.)

누구든지 매일 밤 시퀀스 롤백 및 재사용 값을 유발할 수있는 아이디어가 있습니까?

업데이트 : 의견에 몇 가지 질문에 대답하려면 :

  • @@Version:

    Microsoft SQL Server 2012 (SP1)-11.0.3000.0 (X64) 2012 년 10 월 19 일 13:38:57

  • 스크립트 작성 :

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
    
  • 고유 제한 조건이 없습니다 (그러나이를 사용할 계획입니다). 그러나 그것은 내가 가치를 재사용했을 때 나에게만 도움이 될 것입니다. 값이 재설정 된 원인이 아닙니다. 나는 5 분마다 새로운 가치를 얻을 수있는 직업을 세웠다. 시간과 값 점프는 패턴을 따르지 않습니다.

  • 이벤트 로그를 확인하여 오류가 있는지 확인했습니다. 다음은이가 일어나고 있다고 생각 http://support.microsoft.com/kb/2793634 우리는 오늘 수정 사항을 적용하고 있습니다. 나는 이것들이 관련이 없다고 생각하지만 그럴 수 있습니다.

1
이 열에 PK 또는 고유 제한 조건이없는 이유는 무엇입니까? 이를 통해이 재사용은 잡히게되며, 애플리케이션 코드가 모든 오류를 삼키지 않는 한 어디에서 왔는지 추측 할 필요가 없습니다.
Aaron Bertrand


시퀀스의 정의를 보여줄 수 있습니까? 또한 오류 로그를 확인하여 밤새 중요한 이벤트 (예 : 장애 조치, 서비스 다시 시작, 메모리 문제 등)가 발생했는지 확인할 수 있습니까?
Aaron Bertrand

2
무엇입니까 @@VERSION? 또한 환경에 대해 변경된 것이 있습니까? 비슷한 것을보고 하는 연결 항목 이 있습니다 . 거기에 OP가 관련되어 있음11.0.3000.0
Martin Smith

2
CYCLE은 본질적으로 SQL Server에 값을 재사용해도 괜찮다는 것을 알려줍니다. 나는 당신 이이 문제를 겪고 있는지 전혀 모른다. 왜 그런지 알 수 없다. 나는 여전히 최선의 방법은 중복을 방지하고 재사용을 방지하기 위해 캐싱을 끄는 제약 조건을 갖는 것입니다.
Aaron Bertrand

답변:


11

먼저,이 열에서 중복을 원하지 않으면 명시 적으로 명시하십시오 .

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

(또는 기본 키를 만들거나 클러스터형 인덱스를 변경하거나 무엇을 원할 수도 있습니다.)

어쨌든 복제본을 생성 할 때 오류를 발생시키는 것은 나중에 처리해야 할 복제본을 맹목적으로 삽입하는 것보다 훨씬 낫습니다.

다음으로 SEQUENCE는 숫자 생성기이며 기본적으로 50 개의 캐시 값을가집니다. 트랜잭션 설정 방법 및 서버에서 발생하는 기타 중요한 이벤트에 따라 SQL Server가 특정 값을 생성 한 것을 "잊어 버릴"수 있습니다. 죄송하지만이 버그를 재현하는 데 어떤 기준이 적용되는지 정확히 알 수 없습니다. (때까지이 문제를 해결 얻을 수있는 방법 버그가 해결 / 설명가 ) 사용 순서를 변경하는 것입니다 NO CYCLE그리고 NO CACHE, 예를 들면 :

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

참고 NO CACHE도 어쩌면, 문제를 알고 성능과 동시성에 영향을 미칠 수 있지만, 격차를 제거하는 데 도움이됩니다, 손실 블록.

최신 서비스 팩과 CU를 사용하고 있는지 확인할 수도 있습니다. 이 시점에서 나는 3437을 가진 SP1CU10을 추천 한다; SP2는 출시되었지만 온라인 재 구축과 관련하여 여전히 귀하에게 영향을 줄 수있는 중요한 문제가 있습니다 .


글쎄, 나는 그것을 백업 할 수 없습니다. 따라서 NO CACHE가 문제를 해결하면 내가하는 일입니다.
Vaccano

나는 이것을 일으키는 거래가있을 수 있다고 생각했습니다. 그러나 MSDN의 시퀀스 페이지에 "시퀀스 번호는 현재 트랜잭션 범위 밖에서 생성됩니다. 시퀀스 번호를 사용하는 트랜잭션이 커밋되거나 롤백 될 때 사용됩니다." 그래서 나는 거래 이론을 버렸다. 다른 일이 일어나고 있다는 데 동의합니다.
Vaccano

그것을 설정하는 것만 NO CYCLE으로 충분하다는 것이 밝혀졌습니다 . (적어도 어제 일어나지 않았습니다.) 도움을 주셔서 감사합니다!
Vaccano

1
FIX : SQL Server 2012 또는 SQL Server 2014가 메모리 부족 상태 일 때 시퀀스 개체가 중복 시퀀스 값 을 생성 함 Microsoft SQL Server 2012 또는 SQL Server 2014에서 CACHE 옵션이 활성화 된 시퀀스 개체를 생성한다고 가정합니다. 인스턴스가 메모리 부족 상태 인 경우 및 다수의 동시 접속이 동일한 시퀀스 객체로부터 시퀀스 값을 요청하면, 중복 시퀀스 값이 생성 될 수있다. 또한 중복 시퀀스 값이 테이블에 삽입되면 고유 또는 기본 키 (PK) 위반 오류가 발생합니다.
Andomar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.