인사이트

인사이트

새로운 관점으로 깊이 있는 통찰을 제시합니다.

오픈소스 SW

클라우드 데이터베이스의 선두 MariaDB, 10.6 무엇이 바뀌었나?

2021.12.17임호현
다운로드

들어가며

MariaDB는 전세계에서 많이 사용하는 오픈소스 RDBMS 중 하나이다. 2010년 1월, 5.1버전을 시작으로 꾸준한 업그레이드를 거쳐 2021년 12월 현재 안정화 버전으로 10.6이, Alpha(미리보기) 버전으로 10.7이 배포되고 있다. 개발은 MariaDB 재단이 맡고 있으며 약 1년 주기로 신규 버전을 발표한다. 제품 개발은 Alpha → Beta → RC(Release Candidate, 릴리즈 후보) 단계를 거쳐 정식 버전이 출시된다. 버전별로 EoL(End of Life)이 정해져 있으며 모든 릴리스가 최소 5년 동안 유지되도록 보장한다. EoL 이후에는 버그나 보안 패치가 제공되지 않는다.

 

표1 마라아DB의 버전별 EoL입니다. 10.6 버전은 2021년 7월 6일에 릴리즈되었고 EoL은 2026년 7월 6일입니다. 현재 릴리즈는 10.6.5입니다. 10.5 버전은 2020년 6월 24일에 릴리즈되었고 EoL은 2025년 6월 24일입니다. 현재 릴리즈는 10.5.13입니다. 10.4 버전은 2019년 6월 18일에 릴리즈되었고 EoL은 2024년 6월 18일입니다. 현재 릴리즈는 10.4.22입니다. 10.3 버전은 2018년 5월 25일에 릴리즈되었고 EoL은 2023년 5월 25일입니다. 현재 릴리즈는 10.3.32입니다. 10.2 버전은 2017년 5월 23일에 릴리즈되었고 EoL은 2022년 5월 23일입니다. 현재 릴리즈는 10.2.41입니다. 10.1 버전은 2015년 10월 17일에 릴리즈되었고 EoL은 2020년 10월 17일입니다. 현재 릴리즈는 10.1.48입니다. 10.0 버전은 2014년 3월 31일에 릴리즈되었고 EoL은 2019년 3월 31일입니다. 현재 릴리즈는 10.0.38입니다.

 

MariaDB 10.6 버전은 비정상 종료시 안전한 Atomic DDL, OARCLE 호환성에 중점을 둔 구문과 데이터 처리에 사용하는 SQL 구문 그리고 데이터베이스 사용에 도움이 되는 Sys Schema까지 활용도가 높은 기능이 대거 추가되었다. 본 아티클에서는 10.6 버전의 주요한 개선 및 추가·삭제 사항을 살펴보고자 한다.

 

 

개선 및 변경 사항

1. Atomic DDL

DDL(Data Definition Language) 작업 중 서버가 비정상 종료될 경우 이전 버전에서는 작업에 대한 안전 보장이 없었다. 10.6 버전부터는 CREATE TABLE, ALTER TABLE, RENAME TABLE, DROP TABLE, DROP DATABASE 및 관련 DDL 문은 비정상 종료에 안전하도록 개선되었다. MariaDB의 Atomic DDL은 비정상 종료하면 DDL문이 완전히 실행되거나 전혀 수행되지 않는다. 이는 비정상 종료가 발생하여 서버를 다시 시작하더라도 모든 테이블이 일관되고 바이너리 로그가 서버의 상태와 일치함을 뜻한다.

또한 Atomic DDL은 데이터베이스 계층에서 구현되어 MariaDB의 다양한 스토리지 엔진과 함께 작동 가능하다. 추후에는 S3 storage engine, partitioning engine도 지원할 예정이다.

 

2. INNODB

row_format=COMPRESSED 형식의 테이블은 기본적으로 읽기 전용으로만 사용이 가능하다. 향후 쓰기 지원을 제거하고 더 이상 사용하지 않을 예정이다. 하지만 변수 innodb_read_only_compressed=OFF를 사용하면 쓰기가 가능하다.

InnoDB 임시 테이블 스페이스의 쓰기는 피해야 한다. 페이지가 버퍼 풀(Buffer pool)에서 제거되고 재사용 되지 않는 한 쓰기는 사용하지 않아야 성능에 좋다.

InnoDB Bulk Insert시 속도를 최적화한다. 트랜잭션이 커밋(Commit) 또는 롤백(Rollback) 상태이거나 INSERT 작업에 영향을 주는 롤백일 때 유지될 exclusive table lock으로 빈 테이블 또는 파티션에 대한 삽입을 커버하여 Insert시 빠른 속도로 처리가 가능하다.

 

3. 사용하지 못하는 변수

갈레라 클러스터(Galera Cluster) 관련 변수중 다음 변수는 사용하지 않고 wsrep_mode로 대체하여 사용한다.

wsrep_replicate_myisam은 wsrep_model 값 중 REPLICATE_MYSAM 선택하여 사용 가능하며, wsrep_strict_ddl은 STRICT_REPLICATION 선택하여 사용 가능합니다.

 

4. 문자셋(Character Sets) 변경

문자셋이 utf8에서 utf8m3으로 변경되었다. 3바이트 문자 집합의 기본 이름이 utf8에서 utf8m3으로 바뀐다. 모든 SHOW 및 INFORMATION_SCHEMA 출력은 utf8이 아닌 utf8mb3로 표시된다.

charater_set_client, charater_set_connection, charater_set_results, charater_set_system의 문자셋이 utf8에서 utf8mb3으로 변경되었습니다.

 

5. 시스템 변수 기본값 변경

메모리의 버퍼 풀과 OS캐시에 중복 저장되는 더블 버퍼링을 막아 메모리를 효율적으로 사용할 수 있는 O_DIRECT를 기본값으로 채택하였다.

innodb_flush_method는 O_DIRECT를 기본값으로 채택

 

 

추가 사항

1. 추가된 변수

1) binlog_expire_logs_seconds는 0이 아닌 경우 바이너리 로그를 값(초) 후에 로그 파일을 제거합니다. expire_logs_days는 하나를 변경하면 다른 하나가 자동으로 변경되는 별칭의 형태입니다. 2) innodb_deadlock_report는 ON일 경우 deadlock상태를 보고하는 방법이며 Off는 deadlock 상세정보를 보고하지 않습니다. Basic은 트랜잭션 및 대기 잠금을 보고하며 Full은 기본값으로 트랜잭션, 대기 잠금 및 차단 잠금을 보고합니다. 3) innodb_read_only_compressed는 ON일 경우 ROW_FORMAT=COMPRESSED 테이블은 읽기 전용이며 OFF시에는 쓰기를 허용합니다. 4) wsrep_mode는 wsrep 기능을 사용합니다. (INLOG_ROW_FORMAT_ONLY, DISALLOW_LOCAL_GTID, REQUIRED_PRIMARY_KEY, REPLICATE_ARIA, REPLICATE_MYISAM and STRICT_REPLICATION) 5) Innodb_buffer_pool_pages_lru_freed는 플러시하지 않고 버퍼 풀 LRU 축출 스캔에 의해 해제된 페이지 수를 모니터링합니다.

 

2. 예약어 추가

예약어에 OFFSET이 추가되었고 인용부호(쌍따옴표)가 없으면 식별자로 사용할 수 없다. 10.6버전부터는 INFORMATION_SCHEMA.KEYWORDS를 통해 예약어를 확인할 수 있다.

 

3. SQL 구문

10.6 버전부터 제공하는 SQL 구문은 다음과 같다.

1) Select…Skip Locked 구문은 lock이 걸린 행은 결과에서 제외된다. InnoDB 테이블에서만 구현이 가능합니다. SELECT [FOR UPDATE|LOCK IN SHARED MODE] SKIP LOCKED 2) Select…Offset Fetch 구문은 Offset절을 사용하면 지정된 Offset 뒤에 오는 결과 집합만 조회가 가능합니다. Fetch절은 반환할 행의 수를 지정합니다. OFFSET start { ROW | ROWS } FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } 3) INDEX IGNORED는 표시되고 유지되지만 옵티마이저에서 사용되지 않는 인덱스로 Mysql 8의 invisible indexes와 유사한 기능입니다. 해당 인덱스는 인덱스 제거 여부를 고려할 때 Ignore 처리하여 DB 영향 및 문제가 발생하는 것을 확인할 수 있어 인덱스를 안전하게 삭제할 수 있습니다. 인덱스 Ignore 여부는 information_schema.statistics Table과 Show INDEX에서 확인하면 됩니다. IGNORE INDEX [{FOR {JOIN|ORDER BY|GROUP BY}] ([index_list]) 4) JSON_TABLE 구문을 사용할 수 있다. JSON Path 표현식을 기반으로 JSON 데이터를 추출하고 이를 관계형 테이블로 반환하는데 사용하는 구문으로 Select문의 from절 및 다중 테이블 Updata·Delete문에서 테이블을 참조하여 사용합니다.


4. ORACLE 호환

ORACLE 호환을 위해 다음과 같은 함수 및 기능이 추가되었다.

1) ADD_MONTHS(): 날짜에 월을 빼거나 더하는 함수입니다. ADD_MONTHS(date, interval N months)  2) TO_CHAR(): DATE, DATETIME, TIME or TIMESTAMP 데이터 타입을 문자열로 변환합니다. TO_CHAR(expr, format) 3) SYS_GUID(): 문자가 없는 16바이트 GUID 반환합니다. 4) ROWNUM: 허용되는 현재 행 수를 반환합니다. 사용할 수 있는 구문은 SELECT, INSERT, UPDATE, DELETE, LOAD DATA INFILE 에서만 사용이 가능합니다. ROWNUM() 5) sql_mode=oracle 일때 FROM절(as절 없음)에 익명의 서브쿼리가 허용됩니다. MariaDB Version 10.5.12 MariaDB [test]> SELECT * FROM (SELECT 1 FROM DUAL), (SELECT 2 FROM DUAL); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' (SELECT 2 FROM DUAL)' at line 1 MariaDB Version 10.6.5 MariaDB [test]> SET global sql_mode = 'oracle'; Query OK, 0 rows affected (0.000 sec) MariaDB [test]> SELECT * FROM (SELECT 1 FROM DUAL), (SELECT 2 FROM DUAL); +---+---+ | 1 | 2 | +---+---+ | 1 | 2 | +---+---+

 

5. Sys Schema

데이터베이스 관리자에게 도움이 되는 view·Function·procedures의 모음이다. 테이블에는 구성을 Insert 또는 Update 하는 사용자를 유지관리하는 두 개의 트리거가 있다. (sys_config_insert_set_user 및 sys_config_update_set_user) performance_schema=ON 일때 사용이 가능하며 구조는 다음과 같다.

MariaDB [sys]> desc sys_config; +----------+--------------+------+-----+---------------------+-------------------------------+ | Field    | Type         | Null | Key | Default             | Extra                         | +----------+--------------+------+-----+---------------------+-------------------------------+ | variable | varchar(128) | NO   | PRI | NULL                |                               | | value    | varchar(128) | YES  |     | NULL                |                               | | set_time | timestamp    | NO   |     | current_timestamp() | on update current_timestamp() | | set_by   | varchar(128) | YES  |     | NULL                |                               | +----------+--------------+------+-----+---------------------+-------------------------------+ 4 rows in set (0.001 sec)

 

 

삭제 사항

1. 제거된 변수

Innodb 관련 변수가 제거되었다. 예를 들면 innodb_thread_concurrency 변수는 예전에 컴퓨팅 리소스가 제한적일 때 유용하게 사용하였지만 현재 이 값을 무제한(0)보다 작게 설정하는 것이 의미가 없으며 쿼리가 InnoDB 외부에서 기다려야 하기 때문에 실제로 상황을 더 악화시킬 수 있어 해당 변수를 제거하였다.

Innodb 관련 변수가 제거 Option innodb_adaptive_max_sleep_delay, innodb_background_scrub_data_check_interval,innodb_background_scrub_data_check_compressed,innodb_background_scrub_data_interval,innodb_background_scrub_data_check_uncompressed, innodb_buffer_pool_instances, innodb_checksum_algorithm, innodb_commit_concurrency, innodb_concurrency_ticketsinnodb_file_format, innodb_large_prefix_innodb_log_checksums, innodb_log_compressed_pages, innodb_log_files_in_group, innodb_page_cleaners_innodb_sync_array_size, innodb_thread_concurrency, innodb_thread_slee-_delay,innodb_undo_logs

 

2. INNODB

Information_schema.INNODB_SYS_TABLESPACE 파일시스템에 직접 반영하고 관리되었던 Information_schema.innodb_sys_datafiles은 제거되었다.

MariaDB [test]> SELECT * FROM information_schema.INNODB_SYS_TABLESPACES \G; *************************** 1. Row ***************************          SPACE: 0           NAME: innodb_system           FLAG: 21     ROW_FORMAT: NULL      PAGE_SIZE: 16384       FILENAME: ./ibdata1  FS_BLOCK_SIZE: 4096      FILE_SIZE: 12582912 ALLOCATED_SIZE: 12582912

이전 MariaDB 5.5 호환 innodb checksum은 더 이상 지원되지 않으며 crc32만 지원한다. innodb_checksum_algorithm에서 *innodb 및 *none 옵션을 제거하였다. Innochecksum에서 –strict-check/-C 및 –write/-w 옵션을 제거하였다.

 

3. 스토리지 엔진

토쿠DB(TokuDB) 엔진과 카산드라(Cassandra) 엔진이 제거되었다. 토쿠DB 엔진은 10.6에서 제거 되었고 장기 마이그레이션 경로로 10.2.5부터 제공된 MyRocks 엔진을 추천한다. 카산드라 엔진은 사용이 적고 개발이 중단되어 제거되었다.

 

 

마치며

MariaDB는 단기간에 괄목한 만한 성장세를 보이면서 대표적인 오픈소스 DB로 손꼽히고 있다.

10.6버전은 이전 버전보다 최적화, 호환성, 안정성, 편리성을 고려한 개선 사항이 추가되었으며 불필요한 변수를 삭제하였다. 다만 10.6 버전으로 업그레이드할 경우 제거되거나 사용되지 않는 변수를 my.cnf에서 확인해야 하며 변수를 추가할 때는 사전에 충분한 검토가 필요하다는 점을 유념해야 한다.

본 아티클이 버전 업그레이드를 고민하는 DB 관리자에게 도움이 되기를 바란다.

 

# References

- https://mariadb.com/kb/en/upgrading-from-mariadb-105-to-mariadb-106/
- https://mariadb.com/kb/en/changes-improvements-in-mariadb-106/
- https://mariadb.com/kb/en/mariadb-1060-release-notes/
- https://jira.mariadb.org/browse/MDEV-23497
- https://ko.wikipedia.org/wiki/MariaDB
- https://endoflife.date/mariadb
- https://www.slideshare.net/MyDBOPS/what-isnewinmaria-db106

임호현 프로

임호현 프로

에스코어㈜ 소프트웨어사업부 오픈소스SW그룹

오픈소스 DB 기술 서비스를 담당하고 있습니다.