• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    해결됨

redo log buffer -> online redo log file 문의

22.12.14 11:20 작성 조회수 245

0

안녕하세요.

[강의: Online Redo Log File 이해] 관련하여 문의 드립니다.

 

설명에 commit외에 redo log buffer가 1/3 이상 차는 등 commit이 없더라도 online redo log file이나 archive log file로 입력이 되는 경우가 있다고 하는데요.

이 경우, 이후에 유저가 rollback을 하거나 commit을 하면 해당 내용이 redo log buffer에 없을테니, online redo log file이나 archive log file(archive까지 가는 일은 없겠지만...)에서 commit이나 rollback이 안된 내용이 있는지 내부적으로 확인을 하는 로직이 있는건가요?

 

만약에 로직이 있다면, commit이나 rollback 전에 다시 redo buffer에 올려두고 commit 작업을 하는지, 아니면 각 파일에서 바로 마치 direct i/o처럼 disk에 commit내용을 입력을 하는지 궁금합니다.

답변 1

답변을 작성해보세요.

0

안녕하십니까,

"commit이나 rollback이 안된 내용이 있는지 내부적으로 확인을 하는 로직이 있는건가요?" 내용을 제가 정확히 이해했는지는 모르지만,,,

redo log buffer와 online redo log file은 사용자 transaction이 접근할 수 있는 영역이 아닙니다. 이는 오라클 백그라운드 프로세스가 관장하는 영역입니다.

강의에서는 제가 undo segment에 대해서 설명드리진 않았지만, 사용자의 DML transaction 수행 시에는 DML 적용된 신규 데이터가 Buffer Cache에 적용되고, DML 적용 전 과거 데이터는 Undo Segment로 보내지게 됩니다.

예를 들어 table A에 PK 1 ~ 1000까지 천개의 레코드를 특정 컬럼값을 '가나다'에서 'ABC'로 변경한다고 하겠습니다(즉 천개의 레코드가 UPDATE됩니다).

Update시 commit을 하지 않았다고 하더라도 오라클의 background process는 redo log buffer에 데이터를 보냅니다. 또한 redo log buffer에 특정 영역만큼 데이터가 차게 되면 commit이 되지 않아도 redo log file로 일단 내립니다.

그리고 사용자 transaction은 'ABC'로 변경된 천개의 데이터를 buffer cache로 로딩함과 동시에 변경전 데이터인 '가나다'도 Undo Segment로 보내게 됩니다.

해당 사용자 transaction이 아닌 다른 사용자 transaction이 해당 테이블 A의 PK 1의 데이터를 참조하려고 하면 해당 데이터는 아직 Commit 되지 않았으므로 Undo segment에서 데이터를 가져오게 되고 다른 사용자 transaction은 예전 데이터인 '가나다'로 데이터를 참조하게 됩니다.

하지만 해당 사용자 transaction은 변경된 데이터를 buffer cache에서 참조하므로 'ABC'로 된 데이터를 참조합니다.

데이터를 참조하면(가령 pk 1인 데이터)사용자 transaction은 commit 되지 않은 데이터를 Query transaction에서 참조하게 된다면(가령 pk 1 데이터)를 undo segment에서 해당 데이터를 참조합니다.

이제 해당 사용자 transaction을 commit하게 되면 해당 테이블 A를 조회할 때 다른 사용자 transaction은 더 이상 undo segment를 참조하지 않고 Buffer cache를 참조하게 됩니다.

만약 rollback을 하게 되면, undo segment에 있던 과거 데이터를 buffer cache로 옮겨 버리게 되고 모든 사용자 transaction이 해당 buffer cache를 참조하게 됩니다.

원하시는 답변이 아니면 다시 글 부탁드립니다.

감사합니다.