레드게이트 허브

오라클 데이터베이스를 사용하는 많은 사람들에게 시스템 변경 번호(시스템 변경 번호)는 매우 흥미로운 주제이지만 흥미로운 주제임에도 불구하고 혼란 스럽습니다. 이 기사에서 우리는 그것이 무엇인지,어디에 사용되는지,어떻게 작동 하는지를 배울 것입니다.

이것은 모든 세부 사항에 대한 완전한 커버리지가 아니며 할 수 없다는 것을 언급 할 가치가 있습니다. 그 말과 함께,시작하자.

월말과 월급 날이라고 가정합니다. 당신은 급여 그룹에 있으며,적절한 권한으로,모든 직원의 현재 급여 계산을 끌어 쿼리를 발행했다. 숫자가 화면을 가로 질러 흐르는,모든 것이 좋은 것입니다.

출력을 보고 있는 동안 동료가 새 급여 실행을 시작하고 해당 배치 작업이 현재 계산 요약을 지운다고 가정합니다. 출력이 갑자기 나오는 새 행에 대해’0’을 표시하면 상황이 확실히 혼란 스러울 것입니다.

실제로,이 시나리오에서는 출력이 쿼리를 발행 한 순간에 존재하는 방식 인’데이터베이스 상태'(각 행의 내용)를 반영 할 것으로 예상 할 수 있습니다.

오라클 데이터베이스의 보장 중 하나는”사용자 데이터의 더티 읽기가 없다”는 것입니다. 필요한 경우 쿼리가 발행된 즉시 각 행을 안정 상태로 다시 빌드합니다.

오라클은 시스템 변경 번호로 알려진 자체”타이머”를 통해 매우 정확하게 수행합니다.

:

  • 번호 자체
  • 번호 생성기
  • 번호가 저장되는 장소

그럼 시작하자!

이러한 정의는 잘 문서화되어 있지만,여기에 반복 가치가있다:

트랜잭션

오라클 온라인 문서의 개념 가이드에서:

“트랜잭션은 하나 이상의 쿼리 문을 포함하는 논리적 원자성 작업 단위입니다. 즉,데이터베이스에 적용되거나 모두 롤백되어 데이터베이스에서 실행 취소됩니다. 오라클 데이터베이스는 모든 트랜잭션에 고유 한 식별자를 할당합니다.

보다 간단하게:트랜잭션을 시작할 때 일련의 변경을 시작합니다. 이들은 총체적으로 완료되거나 전혀 완료되지 않아야 합니다. 트랜잭션이 데이터베이스에서 발생할 때 변경된 영역을 읽는 사용자는 결과를 변경할 수 있는 부작용의 영향을 받지 않아야 합니다.

모든 데이터베이스에서 트랜잭션이 올바르게 작동하려면 데이터베이스가 4 개의 산성 규칙을 따라야 합니다. 이들은:

  • 원 자성;
  • 일관성;
  • 격리;
  • 내구성.

이 모든 것이 어디에 들어 맞습니까? 그리고 그 질문의 대답은 오라클 만 사용하여 데이터 일관성을 유지한다는 것입니다. 이 시간의 어느 시점,한 사용자가 뭔가를 변경하고,그 반대의 경우도 마찬가지 때 다른 사람에게 표시되는 결과에 차이가 없음을 보장하기 위해 수행됩니다.

요약하자면,오라클에서는”독자는 작가를 기다리지 않고 작가는 독자를 필요로하지 않는다”는 원칙을 완전하고 진정으로 따른다. 이를 위해서는 현재 어떤 종류의 변화를 겪고 있는 데이터가 그러한 변화를 일으키는 사람을 제외한 누구에게도 제공되어서는 안 된다는 것이 가장 중요합니다. 트랜잭션의 경우 이는 데이터의 무결성을 유지하기 위해 필요합니다. 이 무결성을 방해 할 수있는 세 가지 일이 발생할 수 있습니다–더티 읽기,퍼지 읽기 및 팬텀 읽기. 이러한 트랜잭션에 무결성 문제가 발생하지 않도록 다양한 격리 수준을 사용할 수 있습니다. 이들은:

  • 커밋되지 않은 읽기
  • 커밋되지 않은 읽기
  • 반복 가능한 읽기
  • 직렬화 가능

트랜잭션 격리 수준

이로부터 오라클은 커밋된 읽기를 기본 격리 수준으로 제공하여 사용자가 아직 커밋되지 않은 다른 사용자가 변경한 내용을 볼 가능성이 없음을 확인합니다. “더티”로 표시된 데이터를 읽지 않아야하며,이 모든 것을 가능하게하기에 충분히 강력한 메커니즘이 있어야합니다.

이를 가능케 하기 위해,슈나이더 일렉트로닉스는 매우 중요한 역할을 한다.

소개

시스템 커밋 번호는 오라클의 시간 표현으로 이해될 수 있다. 오라클은 일관성을 제어하고 복구를 수행하며 다시 실행에서 변경 벡터를 정렬하기 위해 다음을 사용합니다.

메모리 및 디스크에 있는 여러 위치에서 찾을 수 있습니다. 데이터베이스 시스템이 데이터베이스의 다양한 상태를 식별하는 데 다른 위치가 사용됩니다. 예를 들어 일부 위치에서는 트랜잭션의 완료 상태 및 트랜잭션이 활성 상태인지 커밋되었는지 여부를 나타내는 데 사용됩니다.

일반적인 믿음과는 달리,커밋 시에만 생성되지는 않지만 이름 자체가 암시합니다. 데이터베이스 내에 항상 존재하며,그 순간에 일어나는 작업의 시간 부분을 나타냅니다. 커밋으로 생성되지 않는다고 말하는 것은 완전히 정확하지 않습니다.

그것은 다소 날짜 및 시간 달력과 시계 조합;에서 파생 된 시계 변경 신속 하 고 완전 한 24 시간 주기를 통해 간 경우에 오버플로–달력–변경. 그러나 시계를 변경하는 이벤트는’진자’이며 규칙적인 반면,시계를 변경하는 이벤트는 하나의 특정 내부 함수에 대한 호출입니다.

달력/시계 타임스탬프와 유사하게,값은 각각 다른 용도로 다양한 다른 장소에 기록될 수 있다.

공항 시계와 유사한 실제 사례 중 하나는 공항 시계입니다. 두 사람이 동시에 공항을 입력하고 시계 시간을 기록 할 수 있습니다. 그 순간은 우리에게 두 사람 모두에게 똑같은’진입’을 준다. 한 사람은 체크인하기 전에 수하물 카트를 가져 오는 반면 다른 사람은 체크인 카운터로 직접 이동합니다. 좌석이 배정되면 시간이 약간 다르기 때문에 각 사람이 다른’체크인’을받을 수 있습니다. ‘승선’은 각각 승선 한 때를 나타 내기 위해 할당 될 수 있지만 둘 다 동일한’이륙’을 얻습니다.

달력과 시계의 조합과 마찬가지로 정상 작동 시에는 증가할 수 있습니다. 숫자가 순차적(누락 된 숫자)이 될 것이라는 보장은 없습니다.

이 정보는 오라클 데이터베이스에서 어디에 사용됩니까? 음,거의 모든 곳에서. 우리가 우리의 모든 활동과 시간을 연관시키는 것처럼,우리는 또한 데이터베이스 기능의 모든 부분과 연관되어 있습니다. 예를 들어 테이블에서 데이터를 선택하려고 하면 데이터의 일관성이 있는지 여부를 확인하는 데 사용됩니다. 데이터 블록의 트랜잭션 헤더에서도 찾을 수 있습니다. 이 트랜잭션은 트랜잭션이 시작된 시간과 커밋된 시간을 나타냅니다. 마찬가지로 수행된 각 변경에 대해 다시 실행 로그의 항목이 유지되고 이러한 각 항목에 대해 트랜잭션 발생 시간을 나타내는 데 사용됩니다.

읽기 일관성은 세션에 대한 일관된 데이터 읽기 요청을 완료할 수 있도록 더티 버퍼에 실행 취소를 적용하는 기간을 결정합니다. 그리고 잘 알려진 바와 같이 모든 커밋 작업에 따라 증가합니다.

6 바이트(48 비트)숫자입니다. 이 48 비트 중 16 비트(2 바이트)숫자이고 32 비트(4 바이트)숫자입니다. 두 가지 기본&랩 모두 데이터베이스 증가를 제어하고 데이터베이스가 부족하지 않도록 하는 데 사용됩니다. 40 억 값에 도달하고 0 이 되면 랩이 1 씩 증가합니다.이 번호는 8 바이트 번호입니다.

그렇다면 우리는 현재의 값을 어떻게 볼 수 있습니까? 가장 쉬운 방법은 뷰 데이터베이스를 쿼리하는 것입니다. 봐:

1
2
3
4
5

이 문제를 해결하려면 다음을 수행하십시오.
———–
1123790

우리가 볼 수 있듯이,이 숫자는 숫자로 표시됩니다. 이것은 좋은 때문에 복구,플래시백,등을 수행 하는 우리의 문에서 우리를 위해 쉽게 스 니 커 즈를 사용 하 여. 원하는 경우 16 진수 값으로 변환 할 수 있습니다:

1
2
3
4
5

SQL>선택 to_char(‘1123790′,’xxxxxxxx’)scn_hex 듀얼;
SCN_HEX
———
1125ce

의 예는 다음과 같이 출력에서 동일한 보기 몇 번 액세스:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

데이터베이스 데이터베이스;
———–
1178883
데이터> /
뉴스레터
———–
1178885
데이터> /
뉴스레터
———–
1178886

흥미롭게도,이 증가 독소의 값은 독소의 중요 한 측면을 보여줍니다. 우리는 각각의 실행과 함께,그 수가 증가한다는 것을 알 수 있습니다. 이 문제를 해결하려면 다음 단계를 따르세요.이 두 값을 모두 볼 수 있는 가장 쉬운 방법은 사용자가 소유한 내부 테이블입니다. 다음은 동일한 출력(11204)입니다.

1
2
3
4
5
6

이 문제를 해결하려면 다음을 수행하십시오.;
———- ———- ———-
0 998222 998222
0 998406 998406

이 표에는 생성된 신피질환의 항목이 포함되어 있습니다. 데이터를 약 5 분 단위로 저장하고 5 일 분량의 데이터를 보유합니다. 즉,테이블에 약 1440 개의 레코드가 포함되어 있습니다. 저장소 증가가 정확히 5 분이 아니기 때문에 정확한 레코드 수는 약간 다릅니다.

1
2
3
4
5

이 문제를 해결하려면 다음을 수행하십시오.(*)
———-
1494

오라클 이전 버전에서는 시간 매핑이+/-5 분이었지만 10 그램 이후부터는+/-3 초로 변경되었습니다. 이 내부 테이블에 저장이기 때문에,오라클은 직접이 테이블의 정보에 대한 액세스를 허용하지 않습니다. 액세스하려면 아피스가 제공됩니다. 이 패키지에는 주 프로그램 바이너리와 미리 컴파일된 대수 및 자동 로드 모듈이 전부 들어있습니다.이 번호는 이 테이블에서 시퀀스 번호에 액세스하는 데 사용할 수 있습니다. 이 예는 아래에 나와 있습니다(쿼리에 대한 톰 카이트에게 감사):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

이 문제를 해결하는 데 도움이되는 몇 가지 방법이 있습니다.이 문제를 해결하는 데 도움이되는 몇 가지 방법이 있습니다. 이 옵션을 선택하십시오.이 문제를 해결하는 데 도움이되는 몇 가지 방법이 있습니다.<= 100
)
그러나,이 경우,나는 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게 그(것)들에게> /
최대(최소)최대(최소)최대(최소)최대(최소)최대(최소)최대(최소)최대)
————————————————————————— ———- ———-
06-월-16 05.22.04.000000000 오후 1245323 1245323
06-월-16 05.22.07.000000000 오후 1245324 1245324
06-월-16 05.22.10.000000000 오후 1245325 1245325
06-월-16 05.22.13.000000000 오후 1245326 1245326
06-월-16 05.22.16.000000000 오후 1245327 1245327
06-월-16 05.22.19.000000000 오후 1245328 1245328
06-월-16 05.22.22.000000000 오후 1245329 1245329
06-월-16 05.22.25.000000000 오후 1245330 1245330
06-월-16 05.22.28.000000000 오후 1245331 1245331
06-월-16 05.22.31.000000000 오후 1245332 1245332
06-월-16 05.22.34.000000000 오후 1245333 1245333
06-월-16 05.22.37.000000000 오후 1245334 1245334
06-월-16 05.22.40.000000000 오후 1245335 1245335
06-월-16 05.22.43.000000000 오후 1245336 1245336
06-월-16 05.22.46.000000000 오후 1245337 1245337
06-월-16 05.22.49.000000000 오후 1245338 1245338
06-월-16 05.22.52.000000000 오후 1245339 1245339

10 그램 이전 버전의 타임 스탬프와 함께 매핑 할 수 있습니까?

이 표는 왜 증가율이 증가하는지 보여주지 않는다는 것을 기억하는 것이 중요합니다. 약간의 서식을 사용하면 생성 된 숫자의 아이디어를 가질 수 있지만 성장의 원천은 이 표에서 분명하지 않습니다.

이 문제를 확인하는 또 다른 방법은 뷰에서입니다. 이 두 열을 통해 일정 기간 동안 데이터베이스에서 생성 된 데이터의 양을 볼 수 있습니다. 이 스레드의 지정된 시퀀스 번호에서 보관된 로그 파일에 나타나는 가장 낮은 값입니다. 다음 로그 파일에 나타나는 가장 낮은 로그 파일입니다.

1
2
3
4
5
6
7
8
9
10
11
12

이 예제에서는 다음과 같은 작업을 수행 할 수 있습니다.;
스레드#첫 번째 _변경#다음 _변경#
———- ————- ————
1 925702 958823
1 958823 959634
1 959634 972579
1 972579 993714
1 993714 1020785
1 1020785 1023738
1 1023738 1023873
1 1023873 1023995

이 테이블 뷰에서는 증가된 데이터 생성 원인을 찾을 수 없습니다. 이 뷰는 단일 인스턴스뿐만 아니라 환경에서도 사용할 수 있습니다.

시퀀스를 사용하여 증가합니까?

현재로서는 그 숫자가 계속 증가하고 있다는 것이 분명할 것이다. 흥미롭게도,비록 그것이 숫자 임에도 불구하고,오라클은 그것을 높이기 위해 어떤 시퀀스도 사용하지 않고 대신 내부 기능을 사용합니다. 예를 들어,내부적으로 사용되는 함수는 다음과 같습니다. 이 함수는 새로운 호출을 요청하고 이 함수에 대한 호출이 증가될 때마다 호출됩니다. 이 함수와 마찬가지로,이 함수는 현재 함수와 그것에 사용되는 호출을 얻는 데 사용됩니다. 이러한 함수 호출을 볼 수 있습니다. 이러한 통계에 대한 설명은 12.1 참조 가이드에서 찾을 수 있습니다.

이 호출이 어떻게 연결되는지 살펴 보겠습니다. 우리는 여기서 두 개의 세션을 사용하고 있습니다.

1
2
3
4
5
6
7
8
9
10

세션 -1
SQL>l
1*선택 current_SCN V$데이터베이스
SQL> /
CURRENT_SCN
———–
698815
SQL>

이를 위해 다음과 같이,이들에 대한 값 V$sysstat:

1
2
3
4
5
6
7
8
9
10
11
12
13

SQL>l
1select name,value V$sysstat
2*는 이름처럼’%화를%’
SQL> /
이름 값
—————————————————————- ———-
전화 kcmgcs427
호출 kcmgrs0
호출 kcmgas7272

스냅샷을 가져오기 위한 호출은 다음과 같습니다.>

세션 1 에서 현재 액세스 권한을 볼 수 있는 쿼리를 실행해 보겠습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

SQL> l
1* select current_SCN from V$database
SQL> /
CURRENT_SCN
———–
698815
SQL> /
CURRENT_SCN
———–
698889
SQL>

And 다음은 두 번째 세션 2 의 결과입니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

데이터> /
이름 값
—————————————————————- ———-
스냅샷을 가져오려면 스냅샷을 가져오려면 스냅샷을 가져오려면 호출하기 전에 스냅샷을 가져오려면 호출하기 전에 스냅샷을 가져오려면 호출하기 전에 스냅샷을 가져오려면 호출하기 전에 스냅샷을 가져오려면 호출하기 전에 호출하기 전에 스냅샷을 가져오려면 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에 호출하기 전에: 159790
> /
이름 값
—————————————————————- ———-
스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출:스냅샷을 가져오기 위한 호출>

7272 에서 7278 로 증가했습니다. 오라클은 숫자를 늘리기 위해 시퀀스를 사용하지 않으므로 항상 같은 순서로 숫자가 늘어날 것이라는 보장은 없습니다.

결론

이 문서에서는,우리는 그것을 보는 방법과 그것에 대한 요구 사항이 무엇인지 살펴 보았다. 다음 글에서는 어떤 종류의 신진대사신경질환이 이용가능한지,그리고 데이터베이스에서 어떻게 사용되는지를 살펴보겠습니다. 계속 지켜봐 주시기 바랍니다!

Write a Comment

이메일 주소는 공개되지 않습니다.