[이렇게 사용하세요!] MySQL 8.0, 개발자를 위한 신규 기능 살펴보기! #1 InnoDB

NAVER Cloud
NAVER Cloud
Published in
6 min readDec 6, 2019

안녕하세요 네이버 클라우드 플랫폼입니다.

12월 5일, 네이버 클라우드 플랫폼이 ‘Cloud DB for MySQL 2.0 업데이트’를 통해 MySQL 8.0 지원을 시작하였습니다.

많은 개발자분들이 높은 관심을 보이고 있는 MySQL 8.0과 관련해 ‘MySQL 8.0 New Feature for Developer’을 주제로 총 5부작에 걸쳐 개발자분들과 함께 공유하면 좋을 만한 핵심 기능을 중심으로 이야기하고자 합니다.

MySQL 8.0’s Timeline

MySQL 8.0의 개발은 2016년 9월부터 시작이 되었고, 2018년 4월 최초의 GA 버전인 8.0.11을 릴리즈한 이후로 현재까지 1년 이상 꾸준히 안정화의 단계를 거쳐왔습니다.

오라클 공식 문서에 발표된 MySQL 8.0의 새로운 기능 및 크고 작은 변경들은 250여 가지가 넘는 것으로 소개되고 있습니다. MySQL 8.0과 관련해 앞으로 다룰 다섯 가지의 콘텐츠는 다음과 같습니다.

1. InnoDB

2. SQL DDL

3. SQL DML

4. Indexes

5. JSON

오늘은 먼저 InnoDB와 관련해 추가/변경된 내용을 살펴보도록 하겠습니다.

InnoDB

1. Changes to Auto_Increment persistence

InnoDB 테이블에 AUTO_INCREMENT 속성의 필드를 추가하면, InnoDB 테이블 정보 저장 공간에 AUTO_INCREMENT 카운터를 보관합니다.

MySQL 8.0 이전 버전까지 이 카운터는 디스크가 아닌 메모리 상에만 보관되었기 때문에 MySQL 서버가 재시작되면 이 카운터를 초기화해야 했습니다.

따라서 MySQL 서버가 재시작된 이후 첫 번째 insert 구문이 실행되는 시점에 InnoDB는 위와 같은 구문을 먼저 실행해 얻은 결과에 1 증가시킨 값으로 카운터를 메모리에 로드했습니다.

(auto_increment_increment이 설정된 경우 해당 값만큼 증가)

이러한 Auto_Increment의 초기화 방식은 MySQL 8.0에서 변경되었는데요, 자동 증가 값이 변경될 때마다 redo log에 매번 기록하고, 각 체크포인트를 관리하는 스토리지 엔진의 시스템 테이블에 해당 내용을 저장하게 되었습니다.

따라서 정상적인 종료 후 서버를 다시 시작하면 Data Dictionary 시스템 테이블에 저장된 가장 큰 자동 증가 값을 사용해 메모리의 Auto_Increment 카운터를 초기화합니다.

다음의 간단한 예를 통해 확인해 보겠습니다.

Auto_Increment 속성을 가진 id 컬럼을 포함한 테이블을 생성한 뒤 2개의 row를 insert 한 결과입니다.

이 예제 테이블에 트랜잭션을 명시적으로 선언하고, 3번째 row를 Insert 하면 위와 같은 결과를 확인할 수 있습니다.

이때 MySQL 서버를 리스타트 한 뒤 다시 테이블 데이터를 확인해 보면,

위에서 수행한 트랜잭션이 롤백 되어 id = 3인 데이터가 사라진 것을 확인할 수 있게 됩니다.

다시 같은 내용으로 데이터를 insert 하겠습니다.

MySQL 8.0에서는 Data Dictionary의 시스템 테이블에 저장된(MySQL 서버 리스타트 후에도 유지되는) 가장 큰 자동 증가 값을 사용해 메모리의 Auto_Increment 카운터를 초기화하므로 롤백 된 id = 3 이후 값인 4가 할당되었습니다.

MySQL 5.7 및 이전 버전에서 롤백 직후 서버를 다시 시작하면 롤백 된 트랜잭션에 할당된 자동 증가 값을 재사용하지만, MySQL 8.0에서는 현재 최대 자동 증가 값이 유지되므로 이전에 할당된 값을 재사용할 수 없게 됩니다.

두 번째로, 잠금 처리를 지원하도록 설계된 두 가지 새로운 기능을 사용해

‘MySQL 8.0이 Hot rows를 처리하는 방법’​을 살펴보겠습니다.

2. NOWAIT and SKIP LOCKED

MySQL 5.7 버전까지는 잠금이 요청된 행에 대해 응용 프로그램이 액세스를 시도하는 경우, 제한된 시간 동안 대기하다가 이를 초과하면 timeout이 발생해 트랜잭션을 재시도 해야 했습니다.

MySQL 8.0에서는 이 두 가지 새로운 기능(NOWAIT, SKIP LOCKED)을 통해 정교한 잠금 처리 시나리오를 구현하면 timeout을 보다 효과적으로 처리할 수 있습니다.

먼저 NOWAIT을 사용하면, 응용프로그램이 잠금 해제 또는 timeout을 기다리지 않도록 합니다. 세션에서 innodb_lock_wait_timeout = 1을 설정해도 비슷한 효과가 있으며, 행 잠금을 기다리지 않고 쿼리가 실패해 오류가 발생하도록 하는 설정입니다.

SKIP LOCKED는 행 잠금을 기다리지 않고 where 절을 기반으로 나머지 행을 처리하도록 요청해 잠긴 행을 결과 집합에서 제거하도록 하는 설정입니다.

따라서 오류를 발생시키지 않고 결과를 얻을 수는 있지만 결과 집합의 일관성이 항상 보장되지는 않는 방식입니다.

글을 마무리하며…

지금까지 개발자들이 주목하는 MySQL 8.0의 새로운 기능 중 InnoDB와 관련해 1.Auto_Increment 초기화 방식의 변화와 2. 새로운 기능 NOWAIT와 SKIP LOCKED에 대해 알아보았습니다.

네이버 클라우드 플랫폼은 새로운 MySQL 8.0 버전을 올해 10월 30일에 금융기관용 클라우드에 출시하였고, 12월 5일에는 민간 Cloud DB for MySQL 2.0 업데이트를 통해 출시하였습니다. 관련 정보는 네이버 클라우드 플랫폼 공식 홈페이지를 통해 확인하실 수 있습니다.

앞으로 5부작에 걸쳐 MySQL 신규 버전과 관련해 개발자분들과 함께 공유하면 좋을 만한 핵심 기능들이 포스팅될 예정이니, 많은 관심 부탁드립니다. 더욱 유익한 콘텐츠로 찾아뵙겠습니다. 감사합니다.

--

--

NAVER Cloud
NAVER Cloud

We provide cloud-based information technology services for industry leaders from startups to enterprises.