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 를 지정할 수 있어 유용할 수 있음