Oracle- 트랜잭션, 롤백 세그먼트 및 undo_retention 매개 변수는 어떻게 작동합니까?

StackOverflow https://stackoverflow.com/questions/190693

  •  07-07-2019
  •  | 
  •  

문제

저는 DBA가 아니며 Oracle의 거래 관리 프로세스를 이해하는 데 어려움을 겪고 있습니다.

인터넷에서 신뢰할 수있는 페이지를 읽음으로써 이해했던 것에서 AskTom 참고 - 그러나 댓글을 귀찮게하지 마십시오), 거래가 헌신되면 새로운 데이터는 다음과 같습니다. ~ 아니다 아직 실제 데이터 블록 에보 고되었지만 롤백 세그먼트에 로그인 한 상태입니다. 누군가가 데이터를 선택하거나 undo_retention 초가 통과 된 경우 (이 두 이벤트 중 어느 쪽이 먼저 발생하는지) 새로운 데이터는 데이터 블록에 기록됩니다.

그러나 우리 회사의 누군가가 알면서 최근에 나에게 반대를 말했습니다. 그에 따르면, 거래가 진행될 때 새로운 데이터 ~이다 데이터 블록에 즉시 작성되고 롤백 세그먼트/실행 취소 테이블 스페이스는 기존 데이터를 undo_retention 초 동안 유지합니다. 이 기존 데이터는이 시간 동안 거래 전에 SCN에서 시작된 쿼리로 액세스 할 수 있습니다.

그렇다면 오라클 내에서 실제로 어떤 일이 일어나고, 회신을 백업 할 수있는 참조를 제공 할 수 있습니까?

우리는 Oracle 9.2.0.8을 사용하고 있습니다.

미리 감사드립니다.

도움이 되었습니까?

해결책

여기서 덮을 것이 많습니다! 변경 사항이 데이터 블록에 기록된다는 점을 제외하고는 회사의 사람이 본질적으로 옳습니다. 메모리에서 그들이 만들어지면서, 커밋 전에도; 그리고 그들은 당신이 커밋 할 때 (아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도, 아마도 디스크에 전적으로 독립적으로 디스크에 기록되어있다) 디스크에 기록되어있다.

1) Undo_retention은 변경 사항이 메모리 또는 디스크에 데이터 블록에 기록 될 때 아무 관련이 없습니다. undo_retention은 변경을 저지른 후 변경을 취소하는 데 필요한 데이터가 지속되는 시간을 제어합니다. 목적은 커밋 전에 시작된 다른 쿼리 또는 직렬화 가능한 트랜잭션이 여전히 해당 데이터를 원할 수 있다는 것입니다. 참조: http://download.oracle.com/docs/cd/b19306_01/server.102/b14231/undo.htm#sthref1477

2) 업데이트를 수행하면 메모리의 데이터 블록이 수정됩니다. 그것들은 디스크에 기록 될 수도 있고 아닐 수도 있습니다 (당신이 커밋하기 전에도 믿습니다). 이것은 배경 프로세스에 의해 수행됩니다. 또한 Redo 정보는 Redo Log 버퍼에 기록됩니다. 실행 취소는 실행 취소 세그먼트에 생성 및 저장됩니다.

3) 커밋시, Oracle은 Redo 정보가 디스크에 기록되어 있는지 확인하고 UNDO 데이터를 커밋 된대로 표시합니다. 그러나 변경된 데이터 블록을 메모리에 디스크에 쓰지 않으며, 다시 돌아가서 각 블록을 커밋 된대로 표시하지 않습니다. 이것은 가능한 한 빨리 커밋을 만드는 것입니다. 참조: http://download.oracle.com/docs/cd/b19306_01/server.102/b14220/transact.htm#sthref628

4) 메모리의 데이터 블록은 백그라운드 프로세스에 의해 디스크에 기록되거나 다음에 사용되는 경우 (선택 또는 기타 작업에 의해) 사용되는 경우 커밋 된 것으로 표시됩니다. 그것이 바로 AskTom 메모가 논의하는 것입니다. 이것은 데이터 변경이 블록에 기록되어 있는지 여부에 관한 것이 아닙니다. 블록 자체에 커밋 된 것으로 표시되어 있는지에 관한 것입니다.

다른 팁

내 이해는 (기본적으로) 나중에 이 링크 세부 사항이 있습니다.

데이터 블록을 작성할 필요가 없으며 버퍼에 업데이트되며 디스크에 기록되거나 없을 수도 있습니다. 커밋이 진행되기 전에 Redo는 디스크에 기록되어야합니다.

나는 또한 두 번째 버전에 기반을 둔 투표합니다
이것 링크 (이것은 Oracle 10.2이지만 여전히 9.2에도 적용된다고 생각합니다).

"거래가 커밋 된 후에는 롤백 또는 트랜잭션 복구 목적으로 더 이상 실행 취소 데이터가 필요하지 않습니다. 그러나 일관된 읽기 목적으로 장기 실행 쿼리에는 이전 데이터 블록의 이전 이미지를 생성하기위한이 기존 실행 취소 정보가 필요할 수 있습니다."

그리고

"자동 실행 취소 관리가 활성화되면 항상 현재 실행 취소 보존 기간이 있으며, 이는 Oracle 데이터베이스가 초과성 정보를 덮어 쓰기 전에 오래된 실행 취소 정보를 유지하려고 시도하는 최소 시간입니다."

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top