본문 바로가기

MySQL, MariaDB

MariaDB에서 테이블스페이스란?

Oracle DBA로 익숙해져 있어서 그런지, MariaDB에서의 Tablespace가 명확히 와닿지 않는다.

오라클은 흔히 알다시피 논리적 개념으로 1개의 테이블스페이스에 1개 이상의 데이터파일들이 매핑될 수 있다.

 

분명 오라클처럼 Tablespace는 존재하는 것 같은데 MariaDB의 테이블스페이스는 어떻게 다를까?

 

우리가 트랜잭션을 제대로 관리하기 위해 쓰는 기본 데이터베이스 엔진은 InnoDB이므로 InnoDB에서의 테이블스페이스에 대해 정리해보고자 한다.

 

InnoDB 스토리지 엔진을 사용하는 테이블은 "테이블스페이스"라는 데이터파일 디스크에 기록된다.

각 테이블스페이스는 하나 이상의 InnoDB, 테이블과 관련된 인덱스 데이터를 포함할 수가 있다.

 

InnoDB에서는 아래와 같이 크게 3가지로 테이블스페이스를 분류 할 수 있다.

 

- InnoDB SYSTEM 테이블스페이스

- InnoDB file-per-table 테이블스페이스

- InnoDB Temporary 테이블스페이스

 

InnoDB의 아키텍쳐 측면에서 보면 아래 그림과 같다.

mysql 5.7에서의 innodb architecture


* InnoDB SYSTEM 테이블스페이스 : 

내용

  1. 크기 변경
    1. 크기 늘리기
    2. 크기 감소
  2. InnoDB SYSTEM 테이블스페이스 내의 시스템 테이블

InnoDB가 시스템과 관련된 정보를 특정 테이블이 아닌 전체로 저장해야하는 경우, 기록하는 특정 파일이 바로 시스템 테이블스페이스이다. 기본적으로 ibdata1파일이며 데이터 디렉토리에 위치한 파일이다.

(datadir 또는 innodb_data_home_dir 시스템 변수로 정의 됨 ) 

InnoDB는 시스템 테이블스페이스를 사용하여 데이터 딕셔너리, 버퍼의 변경분, undo log를 저장한다.

innodb_data_file_path 시스템 변수를 설정하여 시스템 테이블스페이스 파일 이름, 크기 및 기타 옵션을 정의할 수 있다. 이 시스템 변수는 커맨드라인 인수로 mysqld에서 지정 하거나 옵션 파일 의 서버 그룹에서 지정할 수 있다 . 예를 들면 다음과 같다.

[mariadb]

...

innodb_data_file_path = ibdata1 : 50M : autoextend

이 시스템 변수의 기본값은 ibdata1 file이자, 최소 크기 12M, autoextend 속성이 활성화된 상태이다.

크기 변경

InnoDB는 기본적으로 ibdata1 시스템 테이블스페이스의 파일에 12M을 할당한다. 보통은 충분하지만 충분하지 않을수도 있다. MariaDB를 사용하다 보면 시스템 테이블 공간에 대한 할당이 너무 작거나 디스크에 비해 너무 커질 수도 있다. 

다행히 나중에 크기를 조정할 수 있다.

크기 늘리기

innodb_data_file_path시스템 변수를 설정하여 각 파일의 크기를 정의 할 수 있다. 

더 큰 시스템 테이블스페이스가 필요한 경우 autoextend옵션을 마지막 값에 추가하면 된다.

[mariadb]

...

innodb_data_file_path = ibdata1 : 12M; ibdata2 : 50M : autoextend

이 구성에서 시스템 테이블스페이스가 지정한 크기보다 초과하여 할당하게 되면 InnoDB는 파일 크기를 늘린다. 

autoextend옵션은 innodb_autoextend_increment 시스템 변수를 설정할 수 있다.

크기 감소

InnoDB 시스템 테이블스페이스의 크기를 줄이는 과정은 크기를 늘리는 것보다 조금 더 복잡하다. 

MariaDB를 사용하면 테이블스페이스 파일 자체에서 데이터를 제거할 수 없다. 

대신 테이블스페이스 파일 자체를 삭제 한 다음, 백업에서 데이터베이스를 복원해야 한다.

 

백업 유틸리티 mysqldump는 데이터베이스를 재생성하는 데 필요한 SQL문이 포함된 백업 파일을 생성한다. 

결과적으로, 최소 데이터로 데이터베이스를 복원한다.

 

mysqldump를 사용해서 (mysql 데이터베이스의 시스템 테이블을 포함하여 모든 InnoDB 데이터베이스 테이블) 백업합니다.

information_schema를 사용하면 사용중인 것을 찾을 수 있습니다.

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_SCHEMA = 'mysql' AND ENGINE = 'InnoDB' ;

 

InnoDB 만 사용하는 경우 모든 데이터베이스와 테이블을 쉽게 백업 할 수 있습니다.

$ mysqldump -u root -p --all-databases > full-backup.sql

 

그런 다음 MariaDB 서버를 중지하고 InnoDB 테이블 스페이스 파일을 제거합니다. 

데이터 디렉토리 또는 InnoDB의 데이터를 홈 디렉토리에서 모든 ibdata와 ib_log 파일들을 삭제하십시요.

(확장자가 .ibd, .frm과 같은 모든 파일들)

 

이 작업이 완료되면 서버를 다시 시작하고 덤프 파일을 가져옵니다.

$ mysql -u root -p < full-backup.sql

 

InnoDB 시스템 테이블스페이스 내의 System table들

InnoDB는 InnoDB 시스템 테이블스페이스 내에 시스템 테이블을 생성합니다 :

  • SYS_DATAFILES
  • SYS_FOREIGN
  • SYS_FOREIGN_COLS
  • SYS_TABLESPACES
  • SYS_VIRTUAL
  • SYS_ZIP_DICT
  • SYS_ZIP_DICT_COLS

위 테이블은 쿼리할 수 없습니다. 하지만 information_schema 데이터베이스의 INNODB_SYS_TABLES과 같은 테이블에서 확인할 수 있습니다.

 


* InnoDB file-per-table 테이블스페이스 : 

내용

  1. file-per-table의 위치
  2. transportable tablespace copy
    1. 파티션되지 않은 테이블에 대해 이동 가능한 테이블 스페이스 복사
      1. 파티션되지 않은 테이블에 대해 이동 가능한 테이블 스페이스 내보내기
      2. 파티션되지 않은 테이블에 대해 이동 가능한 테이블 스페이스 가져 오기
    2. 파티션 된 테이블의 전송 가능한 테이블 스페이스 복사
      1. 파티션 된 테이블에 대한 이동 가능한 테이블 스페이스 내보내기
      2. 파티션 된 테이블의 전송 가능한 테이블 스페이스 가져 오기
        1. 각 파티션
    3. 전송 가능한 테이블 스페이스 복사와 관련하여 알려진 문제점
      1. 임시 열에 대한 다른 저장소 형식
      2. 다른 ROW_FORMAT 값
      3. 외래 키 제약
  3. 테이블 스페이스 암호화
  4. 그 외...

 

InnoDB 스토리지 엔진을 사용하여 테이블을 생성하면 해당 테이블에 기록된 데이터는 파일시스템의 tablespace라는 데이터 파일에 저장됩니다. tablespace file에는 데이터와 인덱스가 모두 포함됩니다.

innodb_file_per_table=ON 설정을 하면, InnoDB는 InnoDB의 테이블 당 한개의 tablespace file을 사용합니다. 

이 때 tablespace file의 확장자는  .ibd입니다. 

innodb_file_per_table=OFF 설정을 하면, InnoDB는 InnoDB의 시스템 테이블스페이스를 모든 테이블에 저장합니다.

MySQL 5.7 이상의 InnoDB 버전은 CREATE TABLESPACE 명령어와 general tablespace라는 유형의 테이블스페이스를 지원합니다. 

하지만 MariaDB 서버의 InnoDB 버전은 CREATE TABLESPACE 명령어와 general tablespace 유형의 테이블스페이스를 지원하지 않습니다.

 

 

File-Per-Table 테이블스페이스 위치

기본적으로 InnoDB의 File-Per-Table 테이블스페이스는 datadir 시스템 변수에 의해 정의되는 시스템의 데이터 디렉토리에 위치하게 됩니다. InnoDB 데이터를 다른 스토리지 엔진의 데이터와 별도로 저장하려면 innodb_data_home_dir시스템 변수를 설정하여 이를 변경하십시오.

전용 경로에 저장해야 하는 특정 테이블 스페이스가 있는 경우 테이블 생성시에 DATA DIRECTORY 옵션을 사용하여 위치를 설정할 수 있습니다.

 

예를 들어

CREATE TABLE test.t1

( id INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(50)

) ENGINE=InnoDB

DATA DIRECTORY = "/data/contact";

데이터 디렉토리를 작성하면 MariaDB는 해당 디렉토리 내에 File-Per-Table 테이블스페이스가 생성합니다. 

유닉스 계열 운영체제에서 ls 명령을 사용하여 파일을 볼 수 있습니다.

 

# ls -al /data/contact/test

drwxrwx--- 2 mysql mysql 4096 Dec 8 18:46 .

drwxr-xr-x 3 mysql mysql 4096 Dec 8 18:46 ..

-rw-rw---- 1 mysql mysql 98304 Dec 8 20:41 t1.ibd

MariaDB 서버 프로세스 (보통 mysql)를 실행하는 시스템 사용자는 주어진 경로에 대해 쓰기 권한이 있어야 합니다.