Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

MySQL / MariaDB MVCC 본문

MySQL/아키텍처 및 내부 구조

MySQL / MariaDB MVCC

`O` 2021. 3. 3. 01:39
728x90
반응형

해당 페이지에서는 MySQL / MariaDB MVCC 에 대한 Mechanism 을 다룬다.

(출처1 : http://www.datanet.co.kr/news/articleView.html?idxno=116534)

(출처2 : https://www.programmersought.com/article/96795556515/)

(출처3 : https://m.blog.naver.com/PostView.nhn?blogId=seuis398&logNo=70117922756&proxyReferer=https:%2F%2Fwww.google.com%2F)

(참고도서 : Oracle, PostgreSQL, MySQL Core Architecture)

 

 

 

먼저 MVCC 의 개념 및 공통적인 특징은 아래와 같다.


MVCC 는 Multi Version Concurrency Control 의 약자로써 수정 및 읽기에 대한 동시 대상의 DB 데이터가 있을 시 상호간의 충돌을 막고, 세션별로 해당 데이터를 쓰거나 조회하는 시점의 데이터의 정합성을 보장하는 메커니즘을 뜻한다. (각 세션별로 사용하는 시점의 데이터를 스냅샷 이미지라고 한다.)


첫 개념은 E.F Codd 박사가 1970년 RDBMS 논문에서 MVCC 개념 확립을 위한 기초 개념 정리에서 시작되었다.


그 후, 1981년 Philip A. Bernstein 과 Nathan Goodman 이 MVCC 의 개념을 확립하여 실제 RDBMS 에 적용 될 수 있도록 MVCC 용어 및 기능을 정립했다.


1986년, Bob Miner 가 Oracle Ver 6 에서 Rollback Segment 개념 도입 및 적용을 하여 MVCC 메커니즘을 발전 시켰다.


1999년, Mikheev Vadim B. 가 PostgreSQL 에도 MVCC 개념을 도입했다.

 

 


MVCC 는 크게 두가지 작동구조가 있다.


다중 세대 아키텍처 (MGA: Multi Generation Architecture)


데이터 row (DB 이론 용어로는 튜플이라고 표현한다.) 변경시 이에 대한 동일 페이지 (데이터 블록) 내에서 변경내역에 따른 신규 튜플 추가 및 버전 기입을 통하여 (new, old)
각 시점별 데이터 변경이력을 저장하는 방식 (PostgreSQL, MS-SQL 이 사용)

PostgreSQL / PPAS MVCC 는 옆의 링크로 참조 : PostgreSQL / PPAS MVCC

 

롤벡 세그먼트 사용

롤백세그먼트 (ORACLE 은 9i 부터는 언두세그먼트라 지칭) 라는 old 시점의 변경 데이터 내역을 보관하는 공간에 일괄적으로 변경내역을 보관하면서
각 데이터별 시점 정합성을 유지해 나가는 방법 (Oracle, MySQL 이 사용)

 

 

 

각 RDBMS 는 MVCC 의 작동 구조를 구현하기 위해서 트랜잭션ID (XID) 및 데이터가 기록되는 시점 정보 개념을 사용한다. [ ex) ORACLE 의 SCN : System Change Number ]
XID 는 DB내에서 데이터 변경을 유발하는 트랜잭션들에 부여 되는 고유 ID 이고 SCN 은 각 데이터들에 대해서 변경 발생 시, 이에 대해서 발생시점 등의 정보가 값으로 변환 되어 부여되는 개념이다.

MySQL / MariaDB (INNODB 스토리지 기준) 는 아래의 MVCC 특징을 가진다.


ORACLE 은 XID 와 SCN 정보를 분리 하여 관리하고 MVCC 메커니즘 구현시에는 이 두개의 개념을 조합하여 사용한다.


MySQL / MariaDB 는 ORACLE 과 같이 롤백세그먼트를 사용한다는 공통점이 있으나, ORACLE 과는 달리 XID, SCN 을 TRX_ID 라는 각 데이터에 부여된 버전 정보를 기록하는 공간에 일괄로 보관한다.


롤백세그먼트에서는 TRX_NO 라는 공간이 있는데 위의 TRX_ID 와 비교를 통하여 각 데이터 버전에 따른 공간 회수 가능 여부를 결정 한다.


INNODB 스토리지 기준으로 간략화 된 각 row 단위별 데이터 구조는 아래와 같다. (간략화 구조)

 

여기서 MVCC 의 버전을 탐색하게 해주는 부분은 DB_ROLL_PT 다 (롤백 포인터로 지칭)


아래의 화면 예시를 들어서 MVCC 는 아래의 과정으로 관리 된다.
(출처: https://m.blog.naver.com/PostView.nhn?blogId=seuis398&logNo=70117922756&proxyReferer=https:%2F%2Fwww.google.com%2F)

위의 예시에서 변경될 대상의 데이터는 pk 가 20 인 데이터다.


먼저 XID 를 330으로 부여받은 트랜잭션이 해당 데이터의 age 를 10으로 update 후 commit 을 수행했다.


그 후, XID 를 350으로 부여받은 트랜잭션이 age 를 8로 update 후, commit 을 수행하지 않았다.


가장 최근에 변경된 데이터는 (latest version record) commit 여부 상관없이 현재 데이터가 기록되는 tablespace 및 db block 에 기록되며 그 이전 버전의 데이터들은 순차적으로 undo tablespace 에 저장된다.


각 isolation 버전에 따라 각각의 트랜잭션들은 commit, uncommit, 해당 트랜잭션 version 이 기록된 snapshot 을 읽는다. 이 때, 다른 버전의 데이터를 읽어들여야 하는 상황이 생길 시, 각 row 에 배정된 rollback pointer 를 통하여 순차적으로 읽어들여야 할 row 를 읽는다.

 

반응형
Comments