• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    미해결

Redo Log Buffer 궁금합니다.

21.05.10 18:20 작성 조회수 430

0

안녕하세요 backend개발자 이지만 DB에대해서

깊게 알고싶어서 질문드립니다.

Redo Log Buffer에서  DML을 모아서 처리한다고 하셨는데요 .

데이터가 변경되기전에 다른곳에서 데이터를 조회하게된다면 redo log buffer 에서 아직 처리되지 않은 튜플은 어떻게 처리가 될까요?

Commit 되기 전의 데이터를 보게될 까요...  ? 그렇다면 그런경우 해당 데이터의 정합성에 문제가 있을 수 있는건가요? 

답변 6

·

답변을 작성해보세요.

1

칭찬 감사합니다. ^^

말씀하신바와 비슷하게 처리됩니다. 조금 부연 설명 드리자면,

특정 세션이 DML을 수행하면(아직 commit하지 않고) 해당 block은 buffer cache에서 값이 변함과 동시에 이전 값을 가진 block은 Undo(rollback) Segment로 이동하게 됩니다. 해당 block은 두가지 버전의 block을 가지게 됩니다. 변경이 된 block(buffer cache 내), 그리고 Undo segment에 있는 block.

만약 다른 세션이 해당 block을 읽으려고 접근하는데, block header에서 아직 commit 이 되지 않음을 인지하면 해당 block을 undo segment에서 찾은 뒤에 이를 buffer cache에 올리게 되고, 다른 모든 세션은 이렇게 undo에서 올라간 buffer cache를 access 하게 됩니다.

이게 오라클의  MVCC(Multi version Concurrency control)의 대략적인 메커니즘 입니다. 

감사합니다.

1

안녕하십니까,

데이터가 변경되기전에 다른곳에서 데이터를 조회하게된다면 redo log buffer 에서 아직 처리되지 않은 튜플은 어떻게 처리가 될까요?

=> commit 되기 전에 데이터를 보게 됩니다. 데이터 정합성의 기준은 commit을 했느냐 입니다. 데이터를 아무리 변경해도 commit하지 않으면 해당 데이터는 변경을 수행한 session에서만 보이게 되며, 다른 session은 해당 데이터를 보는게 아니라 변경 되기 전 데이터를 보게 됩니다.  commit 되지 않으면 아무리 변경해도 DB에 반영하지 않습니다(물론 redo log buffer가 꽉차서 redo log file로 내려 올수는 있지만 데이터 파일로는 반영되지 않습니다)

redo log buffer에서 DML을 모아서 처리하지만, commit을 하는 순간 즉각 redo log file로 내려 보내는 방식으로 데이터 정합성을 유지합니다.

만약 data0을 data1->data2->data3으로 변경한다고 가정할 때

update data1

update data2

update data3

를 하면 여전히 redo log buffer에 데이터가 있습니다. 이후에 commit을 하게 되면 redo log file로 내려가고 데이터의 정합성을 보장할 수 있습니다.  하지만 commit을 하지 않으면 update를 수행한 세션을 제외한 다른 세션은 여전히 data0를 보게 됩니다. 

보통은 

update data1

하고 바로 commit 하는 경우가 많기 때문에 redo log buffer가 잘 활용되지 않을 수 있다고 생각될 수 있지만, 동시 접속이 상당히 많은 경우 개별 동시 접속이 update 를 수행하고 commit하기까지, 오라클 서버 기준으로는 동시 접속이 많으면 많을 수록 어느정도 메모리에 데이터를 모을 수 있기 때문에 redo log buffer의 활용도를 높일 수 있습니다.

또한 일반적인 로직의 경우 가령, 고객 정보를 update한다고 하면,  아래와 같이 고객 테이블과 주소 테이블을 모두 update 한 뒤에 commit 할 수도 있으므로 redo log buffer의 활용도를 높일 수 있습니다.

update 고객 테이블 where id =?

update 주소 테이블 where id = ?

commit

감사합니다.

0

배영철님의 프로필

배영철

질문자

2021.05.12

와 진짜 감사합니다. 

너무행복합니다 !!! 

선생님 덕분에 더 좋은 개발자로

한발짝 다가가네요!!!  감사합니다!

ㅜㅜ

0

배영철님의 프로필

배영철

질문자

2021.05.11

아.,.  제가 DB구조는 처음 공부하다보니

질문이 이상했네요

Redo log file은 말 그대로 복구를 위한 부분이기

때문에  Buffer cache에 쓰면 이후에 Redo log buffer 에 들어가고  commit시 DB file 에 쓰는건 Buffer cache에 있는부분을 모아서 누군가가 DB file에 쓰게 되고 

동시에 Redo log buffer 에서 Redo log file 에 옮겨지게되고 추후 로직은 설명해주신대로 흘러가겠네요 

너무감시합니다 강의가 너무좋습니다.

0

배영철님의 프로필

배영철

질문자

2021.05.11

아!! 그리고제가 블로그를 운영하고 있는데요

그곳에 공부한걸 정리하고 있는중인데요

선생님 강의에대해서 정리하고 출처를 남긴다면

혹시 괜찮을까요? 

네, copy & paste 수준만 아니면 괜찮습니다. 블로그도 잘되셨으면 합니다.

배영철님의 프로필

배영철

질문자

2021.06.05

아!! 이해한 내용을 바탕으로 작성하고 있습니다 ^^!! ㅎㅎ 이것저것 같이 하느라 해당 수업에 대한 포스팅은 많이 못했네요 ㅠ ㅎㅎㅎ 감사합니다!!

0

배영철님의 프로필

배영철

질문자

2021.05.11

와...  이렇게 정성스럽게 답해주실거라고 생각못했는데요 정말 너무감사합니다.

말씀해주신 Redo Log file에대한 선생님 강의를 보고있습니다.

여기서 또 궁금한 점이 생겼는데요

Commit을 해서 Redo log file 에 쓰여지게 된다면  그 시점에 아직 DB file에는 write하지 않았을 텐데 다른 세션에서 해당 데이터를 조회 할 때 

 DB파일을 탐색하는게 아니고 Redo log file먼저 탐색하고 가기 때문에 commit된 정보를 다른 세션에서도 볼 수 있는건가요?

정말 감사드립니다. ㅜㅜ