MariaDB에도 타 dbms와 같이 undo 가 존재하며 개념 또한 같습니다.
이번 글에서는 undo에 대한 개념 및 설명 보단 MariaDB, mysql 에서 undo tablespace 지정하는 방법을 소개하겠습니다.
-1. Undo 관련 설정
MariaDB [(none)]> show variables like '%undo%'; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | innodb_max_undo_log_size | 1073741824 | | innodb_undo_directory | ./ | | innodb_undo_log_truncate | OFF | | innodb_undo_logs | 128 | | innodb_undo_tablespaces | 0 | +--------------------------+------------+
innodb_max_undo_log_size - undo tablespace의 최대 크기 default 1024MB
innodb_undo_directory - undo tablespace 의 위치를 지정하는 것으로 위와 같이 지정하지 않을 경우 my.cnf에 설정되어있는 data 영역에 위치하게 됨
dynamic 하게 지정되지 않으므로 my.cnf에 설정해야함
innodb_undo_log_truncate - innodb_max_undo_log_size 값을 초과하는 undo 데이터들은 truncate 됨
해당 설정을 사용하려면 innodb_undo_tablespaces가 2 이상이어야 하며 2 이상일 때 하나가 사용중이지 않거나 하나를 offline 시키고 truncate 해야함
innodb_undo_logs - mysql 8.0 이후부터는
innodb_rollback_segments
로 변경됨. undo transaction들을 support하는 역할
innodb_undo_tablespaces - undo tablespace 개수를 지정하는 환경설정으로 mysql 8.0 이하에서는 default가 0이나 그 이상 버전에서는 2로 설정됨
innodb_undo_tablespaces =0 으로 설정되어 있다고 undo tablespace 를 사용하지 않는다는 의미가 아니라 0 일 땐 system tablespace, 즉 ibdata 파일 위에 올라와 있어 ibdata의 rollback segments들을 사용하게 됨
1이상일 때는 system tablespace(ibdata) 위에 올리지 않고 별도로 사용하겠다는 의미
-2. innodb_undo_tablespaces 사용 테스트
MariaDB [(none)]> set global innodb_undo_tablespaces=1; ERROR 1238 (HY000): Variable 'innodb_undo_tablespaces' is a read only variable
-> dynamic 변경이 안되어 my.cnf 에 설정 후 재기동
my.cnf innodb_undo_tablespaces=1 innodb_undo_directory=/data001/testuser/
2018-08-20 11:42:53 140036911327104 [ERROR] InnoDB: Expected to open 1 undo tablespaces but was able to find only 0 undo tablespaces. Set the innodb_undo_tablespaces parameter to the correct value and retry. Suggested value is 0
=> Maria DB 문서를 찾아보니 아래와 같은 충격적인 문구 발견
my.cnf 에 innodb_undo 관련 설정 후 재설치 진행
[TESTSERVER:masvc01]/data001/testuser] pwd /data001/masvc01 [TESTSERVER:masvc01]/data001/testuser] ls TEST_10.2.4 TEST_10.2.4_old undo001
=> system tablespace (ibdata) 가 아닌 undo 파일이 별도로 생성된것 확인
-3. 결론
MariaDB에서 undo tablespace 를 system tablespace가 아닌 별도로 생성하려면
innodb가 구성되기 전, 즉 설치 전에 미리 관련 설정을 해야함.
귀찮고 번거로울 수 있으나 undo 관련 성능이 중요한 시스템에서는 위 설정들을 통해 서버의 SSD 디스크에 undo tablespace 를 지정할 수 있어 유용할 수 있음