안녕하세요.
A , B DB가 각각 있습니다.
현재 동기화 A에서 B DB 로 동기화 복제 솔루션에 의해서 이뤄지고 있고,
매일 9시에 시퀀스 초기화 스크립트를 통해 A DB에서 이루어지고 (정상) B DB로 동기화 되어가는 중에 ORA-04009 : MAXVAULE cannot be made to be less than the current value (posting from SPLEX, queue P_QU1, to B)
라는 에러가 발생합니다.
원인은 동기화시 시퀀스를 Cache로 생성하면 A DB의 start값이 1일경우 B DB의 초기값이 Cache +1 로 동기화됨 (Cache:100이면 A DB 시퀀스: 1, B DB 시퀀스 : 101)
해당 시퀀스는 MINVALUE 0 MAXVALUE 99999999999 INCREMENT BY 1 START WITH 1 CACHE 1000 NOORDER CYCLE; 입니다..
A DB는 운영DB라 운영에는 차질이 없으나 B DB에서 에러가 나는 상황을 개선하고자 여러 방안들이 나오고 있습니다.
1) 초기화방법 개선(0으로 초기화)
2) 초기화를 하지 않고 시퀀스를 cycle로 관리
등등...
제안이 나온건데 2번방안이 이해도 가지 않고, 더 좋은 방안이 있다면 마구마구 댓글부탁드립니다!!!
정확하게 상황이 이해가 잘 안 가서 한번 더 질문 드립니다.
1. 사용하시는 둘이 shareplex 인가요 oracle golden gate 인가요?
2. 소스 db(A) 에서 시퀀스 초기화(?) 는 DDL 로 수행하시는거죠?
3. 현재 DDL 복제가 설정 된 상황인가요?
4. 타겟 DB 에도 동일한 이름의 시퀀스가 있어서 A DB 의 시퀀스가 B DB 에 DDL 복제를 통해 2번의 DDL 이 적용 받는 상황인거죠?
5. A DB 에서 시퀀스를 사용해 데이터를 넣는 테이블은(테이블의 데이터는) B DB 에 복제 대상인가요?
5. 그렇다면 B DB 의 시퀀스의 용도는 무엇인가요?
A, B 가 서로 다른 DB 아닌가요?
서로 각각의 시퀀스를 가지는 것 아닌가요?
ORDER 로 바꾼다고 B DB 가 A 의 시퀀스를 바라보지는 않겠지요?
동기화 하고자 하는 두개 DB 에 대한 얘기가 아닌
B DB 안에 있는 두개의 RAC 노드에 대한 얘기를 하고 계신 듯 하네요.
RAC 환경에서 시퀀스를 사용함에 있어서
1. 부하를 주고 싶지 않다.(CACHE, NOORDER)
2. 시퀀스를 건너뛰게 하고 싶지 않다.(NOCACHE, ORDER)
이 두가지 를 동시에 만족할 수는 없습니다.
둘 중에 어느것이 더 중요한지를 따져서 선택해야 겠지요.
정확하게 상황이 이해가 잘 안 가서 한번 더 질문 드립니다.
1. 사용하시는 둘이 shareplex 인가요 oracle golden gate 인가요?
-> oracle golden gate 입니다.
2. 소스 db(A) 에서 시퀀스 초기화(?) 는 DDL 로 수행하시는거죠?
-> 네 맞습니다.
3. 현재 DDL 복제가 설정 된 상황인가요?
-> 네 맞습니다.
4. 타겟 DB 에도 동일한 이름의 시퀀스가 있어서 A DB 의 시퀀스가 B DB 에 DDL 복제를 통해 2번의 DDL 이 적용 받는 상황인거죠?
-> 네 맞습니다.
5. A DB 에서 시퀀스를 사용해 데이터를 넣는 테이블은(테이블의 데이터는) B DB 에 복제 대상인가요?
-> 네 맞습니다.
5. 그렇다면 B DB 의 시퀀스의 용도는 무엇인가요?
-> A DB에서 수행된 INSERT문이 A DB에 있는 시퀀스를 참고한 INSERT문으로 A DB 에 있는 테이블에 INSERT 됫으며
복제화는 SQL 문장 자체로 이루어는 방식이기 때문에 B DB에서도 시퀀스를 이용한 INSERT 문에서 사용하게 됩니다