문득 글을 쓰면서 내가 DB를 여러 기능을 가진 마법의 블랙박스처럼 대하고 있다는 생각을 했다. 사실 여러 상용화된 DBMS는 전부 프로그램인데... 소스코드를 찾아봐야겠다는 생각을 했다. 다행히 요즘은 GPT와 함께라면 뭔들 쉽게 도전해볼 수 있는 시대였다.
oracle, mysql, mariadb, postgresql과 같은 dbms 중에서 오픈소스 dbms가 있을까? 나는 이 프로그램의 소스 코드를 보고 싶어.
GPT 피셜 Oracle을 제외한 대부분의 데이터베이스는 오픈소스이며 깃허브 레포 등을 통해서 코드를 볼 수 있었다. 다만 오픈소스여도 라이센스에 따라 범위가 제한되어 있었다.
가령 MySQL은 GNU GPL 라이센스 하에 배포된다고 하는데, 이는 사적인 이익을 추구하지 않는 한(non-proprietary) 사용자가 해당 소프트웨어의 코드를 복제나 변경하여 사용하는 것이 자유로운 라이센스다.
요즘에는 회사에서 Oracle을 사용한다고는 하지만, 그 전에는 MySQL을 대부분 사용해 왔기에 MySQL의 공식 레포로 들어가 보았다. 대부분의 소스 코드는 C++로 작성되어 있어서 구체적인 이해는 어려울 것 같았으나, 어차피 GPT도 있으니 대략적인 구조나 자주 쓰는 명령어들이 어떻게 실행되는지는 이해해볼 수 있겠다.
mysql의 여러 오퍼레이션이 어떻게 동작하는지를 소스코드를 보면서 이해하고 싶어. 소스코드의 어떤 부분을 보면 될까?
소스 코드의 기본 구조는 다음과 같다고 한다.
- sql/: MySQL 서버의 주요 기능을 구현했다. SQL Parser, Optimizer, 실행 엔진 로직이 들어있다.
- storage/: 실행 엔진이 구현되어 있다. ex. InnoDB나 MyISAM 코드가 포함되어 있다.
- libmysql/: MySQL 클라이언트 라이브러리 코드라고 한다.
- cmd-line-utils/: MySQL 명령어와 관련된 코드라고 한다.
오늘은 이 중에서도 SQL Parser에 대해 알아볼 것이니 sql/ 디렉토리의 코드를 보면 되겠다. 헤더 파일과 로직 파일로 구분되어 있었다. GPT에게 물어보니 sql/sql_parse.cc 파일에 핵심 로직이 있다고 했다. 그래서 그걸 보려고 했었다.
라인의 개수를 확인하기 전까지는 말이다. 7000개의 라인을 그대로 읽기는 불가능했다. 여기서의 핵심 메소드만 찾아봤다. GPT 피셜, 'parse_sql' 함수에 핵심 로직이 있다고 한다.
공식문서의 설명을 보니 해당 함수는 SQL문을 AST(abstract syntax tree)로 변환해주는 함수이다. AST란 문법적인 구조를 트리 형태로 나타나기 위해 사용하는 자료구조라고 한다.
✅ 궁금한 점
- 실행 엔진의 정의는 무엇인가?
- InnoDB나 MyISAM은 실행엔진의 한 종류인가? 맞다면 둘은 어떻게 다른가?
- libmysql/에는 MySQL 클라이언트 라이브러리 코드가 있다고 하는데, 서버면 서버인 것이지 클라이언트는 또 무엇인가?
✅ 궁금한 점 셀프 답변
실행 엔진(execution engine)은 옵티마이저(optimizer)로부터 쿼리 실행 계획을 받은 다음, 스토리지 엔진과 통신하여 데이터를 읽거나 쓰는 등의 실제로 계획을 수행하는 핵심 컴포넌트라고 한다. 여기서 '스토리지 엔진'과 '실행 엔진'이 다르다는 것을 알았다.
스토리지 엔진(storage engine)은 실행 엔진의 지시에 따라 데이터를 디스크에 저장하고 관리하는 역할을 하는 하위 모듈이다. MySQL은 플러그인 방식의 스토리지 엔진 구조를 사용한다고 한다. 따라서 플러그인을 쉽게 교체하는 것처럼 하나의 MySQL DB를 사용할 때에도 InnoDB, MyISAM 등 다양한 스토리지 엔진을 사용할 수 있다고 한다.
스토리지 엔진은 데이터를 디스크(저장 장치)에 저장하는 작업뿐만 아니라 인덱스(Index), 트랜잭션(Transaction), 동시성 제어를 위한 잠금(Locking) 관리 등을 담당한다고 한다. 그리고 데이터의 무결성을 관리하고, 장애가 났을 경우 세이브포인트를 사용하여 데이터를 복구한다고 한다.
대표적인 스토리지 엔진은 InnoDB와 MyISAM이 있다. GPT는 메모리도 기술하였지만 메모리의 경우 장기적인 데이터 저장보다는 일시적인 캐시를 저장하는 용도로 많이 쓰이는 것 같다. 그리고 몰랐던 사실인데 MyISAM의 경우 트랜잭션을 지원하지 않는다고 한다...! 나는 이전에 DB의 ACID 중 Isolation에 대한 설명이 트랜잭션 단위라고 이해하고 있었는데, MyISAM에 트랜잭션이라는 개념 자체가 사용되지 않는다면 MyISAM의 Isolation level은 어떻게 되는지도 궁금하다.
그리고 데이터의 무결성을 관리하기 위해서 쓰기 작업 시 잠금을 사용한다는 것 까지는 알았는데, 이것도 InnoDB와 MyISAM에서의 방식이 달랐다. InnoDB에서는 테이블 잠금(한 트랜잭션이 어떤 테이블에 쓰기 작업을 하고 있는 경우 테이블 전체에 대해서 다른 트랜잭션의 쓰기 작업을 제한)과 행 잠금(한 트랜잭션이 어떤 테이블에 쓰기 작업을 하고 있는 경우 해당 행에 대해서만 다른 트랜잭션의 쓰기 작업을 제한) 모두를 지원하는 반면, MyISAM은 테이블 잠금만 지원한다고 한다.
'server-side > database' 카테고리의 다른 글
DB - ACID, Isolation level, Query parsing & optimization (0) | 2025.01.26 |
---|