source

ORA_ROWSCN - 오래된/복원된 블록에 실제 SCN이 할당되어 있지 않습니까?

manysource 2023. 8. 28. 21:14

ORA_ROWSCN - 오래된/복원된 블록에 실제 SCN이 할당되어 있지 않습니까?

선택한 세부 정보를 다른 데이터 소스로 복제하기 위해 최근에 수정된 행을 찾기 위해 ORA_ROWSCN 유사 열을 사용합니다.우리는 이 열의 "대략적" 특성을 알고 있습니다. 블록 내의 한 행만 변경된 경우 블록 내의 전체 행 배치가 SCN으로 표시되며, 상대적으로 작은 잘못된 긍정 배치는 문제가 되지 않습니다.

그러나 "부동" ORA_ROWSCN 값을 가진 행이 많이 관찰됩니다.이러한 수백만 개의 행은 확실히 전혀 변경되지 않고 있지만 Oracle을 사용하여 새로운 콘솔 세션을 시작할 때마다 행 블록에 최신 SCN이 새로 추가됩니다.다음은 몇 분 내에 세 개의 개별 콘솔 세션을 보여줍니다.

세션 #1 - SCN 27501512 아래의 400만 행:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501512

세션 #2 - SCN 27501522 아래 400만 행:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501522

세션 #3 - SCN 27501528 아래의 400만 행:

SQL> SELECT count(*), ORA_ROWSCN FROM our_table GROUP BY ORA_ROWSCN ORDER BY ORA_ROWSCN;

  COUNT(*) ORA_ROWSCN
---------- ----------
    12   27323587
    12   27415360
    20   27431509
   4057846   27501528

이것은 테스트 데이터베이스이며 행을 수정하는 다른 프로세스가 없습니다.우리의 이론은 4백만 개의 블록에 있는 행에는 어떤 이유에서인지 전용 "SCN"이 없다는 것입니다. 이러한 행은 Oracle Data Pump 툴을 사용하여 이 데이터베이스로 전송되었기 때문입니다. 이를 포함하는 블록에는 SCN이 제대로 할당되어 있지 않을 수 있습니다.그러면 Oracle은 사용 가능한 다른 값이 없기 때문에 현재 SCN 값에 해당하는 이러한 행에 대해 가능한 최고 SCN을 제공할 수밖에 없습니다.이러한 행을 의미 없이 업데이트하면 400만 개의 "부동" SCN 블록 밖으로 이동하여 고정된 SCN 번호를 얻습니다.나머지 행은 계속 이동합니다.

누군가가 A. 이것이 실제로 우리가 보고 있는 것이라고 확인해 줄 수 있습니까? B. 아마도 이것이 Oracle Pump 유틸리티의 알려진 효과이고 C. 만약 우리가 이 행들을 새로운 업데이트로 표시하기만 하면 그 행들이 "부동" SCN에서 영구적으로 이동하여 우리의 문제를 해결할 것입니다.

주의:

  1. SCN은 정확하지 않고 블록 단위입니다.

  2. 우리는 "대체 기술 X를 사용하는 게 어때요?"라는 대답에는 관심이 없습니다. 우리는 다른 기술을 알고 있으며 결정을 내리면 사용할 것입니다. 우리는 이 정확한 행동을 이해하려고 노력하고 있습니다.

여러분이 보고 있는 것은 다른 사람들이 직면한 진짜 문제입니다.이 문제는 데이터 펌프에서만 발생하는 것이 아닙니다.업데이트는 문제에 도움이 되지만 항상 작동한다고 믿을 수는 없습니다.

ORA_ROWSCN이 부정확하고 일관성이 없습니다.10g 설명서에는 부정확성만 언급되어 있습니다.11G 문서는 얼마나 부적절한지를 분명히 합니다.ORA_ROWSCN당신이 하려는 것을 위한 것입니다.

블록이 두 번 쿼리되면 쿼리 간에 행이 업데이트되지 않은 경우에도 ORA_ROWSCN 값이 쿼리 간에 변경될 수 있습니다.

원인이 무엇인지 잘 모르겠습니다.ORA_ROWSCN세션 간에 변경해야 하지만, 데이터 펌프에만 관련된 것은 아니라고 생각합니다.제가 약 5년 전에 이 문제를 처음 접했을 때는 패턴을 찾지 못했고, 제 기억이 맞다면 데이터 펌프도 사용하지 않았습니다.

는 Oracle SQL Developer를 하는 Oracle SQL Developer와 이 ORA_ROWSCN최적의 잠금을 위해. 벌레는 엄청나게 성가셨습니다.사용자는 변경을 수행할 수 있으며 변경을 커밋할 때 다른 사용자가 이미 행을 변경했다는 메시지를 잘못 받았습니다.당신이 지금 하고 있는 것처럼, 행에 어떤 유형의 변경 사항을 적용하면 문제가 해결된다는 것을 알게 되었습니다.그것이 얼마나 효과가 있었는지 기억할 수 없지만, 100% 효과가 있을 것이라고 가정해서는 안 됩니다.

제가 알기로는 ORA_SCN이 어떻게 설정되고 무엇이 반환되는지 정확히 설명할 수 있는 사람은 아무도 없습니다.정확하거나 반복 가능한 결과가 필요할 때는 사용하지 마십시오.

언급URL : https://stackoverflow.com/questions/23543318/ora-rowscn-old-restored-blocks-dont-have-a-real-scn-assigned