InnoDB 알아보기 (On-Disk Structures - Tablespace)

2024. 2. 2. 21:48Database

Tablespace

InnoDB에는 다음과 같이 5가지 종류의 Tablesplace가 존재한다.

  • System Tablespace
  • File-Per-Table Tablespace
  • General Tablespace
  • Undo Tablespace
  • Temporary Tablespace

 

 

 

 

 

 

✔️ Pages, Extents, Segments, 그리고 Tablespaces

 

테이블스페이스는 데이터를 저장하는 데 사용되는 가장 큰 논리적 단위이며,

Tablespace -> Segment -> Extent -> Page -> Row 의 형태로 구성된다.

 

page들은 extents로 그룹화되며, extents의 크기는 page의 크기에 따라 결정된다.

  • page size가 4KB, 8KB, 16KB인 경우: 1MB (4KB 페이지 256개, 8KB 페이지 128개, 16KB 페이지 64개)
  • page size가 32KB 인 경우: 2MB
  • page size가 64KB 인 경우: 4MB

 

테이블스페이스에 속한 파일들을 segments라 부른다.

(테이블스페이스를 디렉터리로 생각한다면, segments는 디렉토리 내의 파일들이다.)

(이들은 rollback segment의 segment와는 다르다.)

 

InnoDB의 인덱스에는 두 개의 segment가 할당된다.

하나는 B-Tree의 비리프 노드(nonleaf node)용이고, 다른 하나는 리프 노드용이다.

리프 노드에 실제 테이블 데이터가 포함된다.

 

 

 

 

 

 

 

✔️ System Tablespace

System Tablespace는 체인지 버퍼(chnage buufer)의 저장 공간이다.

 

만약 테이블이 general 혹은 file-per table tablespace가 아닌 이곳에서 생성되는 경우 테이블과 인덱스 데이터도 저장할 수 있다.

8.0 버전 이전에는 InnoDB data dictionary, double write buffer도 이곳에 포함되었다.

double write buffer는 8.0 버전 이후 별도의 공간에 저장된다.
테이블의 구조 정보, 스토어드 프로그램 등의 정보를 data dictionary(데이터 딕셔너리) 또는 메타데이터라고 한다.
8.0 버전부터는 InnoDB의 data dictionary를 mysql 데이터베이스에 저장한다.
data dictionary table은 MySQL 데이터 디렉터리에 있는 mysql.ibd라는 단일 InnoDB 테이블스페이스(file-per-table tablespace)에 생성됩니다.(참고)

 

시스템 테이블스페이스는 하나 이상의 Data 파일을 가질 수 있으며, 기본적으로 ibdata1 이라는 이름의 파일을 가진다.

이는 MySQL data 디렉토리에 생성된다.

시스템 테이블스페이스의 데이터 파일의 크기와 수는 Innodb_data_file_path로 설정 가능하다.

 

system tablespace는 shared tablespace이다.
즉 여러 테이블의 데이터를 저장할 수 있다.

 

 

 

 

 

 

✔️ File-Per-Table Tablespace

단일 InnoDB 테이블의 데이터와 인덱스에 대한 정보를 개별적인 파일로 관리한다.
일반적으로 우리가 생성하는 테이블들을은 모두 이곳에 생성된다.

데이터 파일은 tablename.ibd 형식으로 생성된다.

 

innodb_file_per_table 설정을 통해 활성화 / 비활성화 할 수 있으며, 

비활성화한 경우 테이블이 system tablespace에 생성된다.

 

장단점에 대한 설명이 궁금하면 공식 문서를 참고하자.

 

 

 

 

 

 

✔️ General Tablespace

CREATE TABLESPACE 구문을 통해 생성되는 InnoDB의 테이블스페이스이며,

system tablespace와 마찬가지로 shared tablespace이다.

이곳에 테이블을 생성하기 위해서는 다음 구문을 사용해야 한다.

CREATE TABLE ... TABLESPACE ...

 

데이터 파일은 tablespace_name.ibd 형식으로 생성된다.

 

 

 

 

✔️ Undo Tablespace

클러스터드 인덱스에 대한 언두 로그(Undo Log)를 저장하는 공간이다.

5.6 버전 이전에는 언두 로그는 system tablespace(ibdata.ibd)에 저장되었다.

 

언두 테이블스페이스는 내부적으로 여러 개의 롤백 세그먼트로 구성되어 있으며,

롤백 세그먼트는 1개 이상의 언두 슬롯(Undo Slot)을 가진다.

 

하나의 롤백 세그먼트가 가지는 언두 슬롯의 개수는 page_size / 16byte 와 같다.

예를 들어 page_size가 기본값인 16KB인 경우, 1024개의 언두 슬롯을 가진다.

 

롤백 세그먼트는 undo tablespace 혹은 global temporary tablespace 안에 존재한다.

롤백 세그먼트는 일반 테이블에 대한 트랜잭션의 경우 undo tablespace에,
임시 테이블에 대한 트랜잭션의 경우 Global temporary tablespace에 할당된다.

 

 

MySQL이 실행될 때 기본적으로 2개의 언두 테이블스페이스가 생성되며,

innodb_undo_directory 에 설정된 위치에 생성된다.

(설정하지 않으면 mysql data 디렉토리에 생성)

 

생성되는 2 개의 언두 테이블스페이스에 대한 파일 이름은 undo_001, undo_002이다.

 

8.0.14 버전 이후, 다음 구문을 통해 런타임에 추가로 언두 테이블스페이스를 생성할 수 있다.

CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';

 

 

 

 

 

 

✔️ Temporary Tablespace

Temporary Tablespace는 Session Temporary Tablespace와 Global Temporary Tablespace로 나뉜다.

 

 

 

☁️ Session Temporary Tablespace

세션 테이블스페이스는 사용자가 생성한 임시 테이블과, 옵티마이저가 내부적으로 생성하는 임시 테이블의 내용을 저장한다.

Session Temporary Tablespace는 디스크에 임시 테이블을 생성할 필요가 있는 경우,

Temporary Tablespace Pool 에서 세션(커넥션)에 할당한다.

 

세션에는 최대 2개의 tablespace가 할당되며,

사용자가 만든 임시 테이블용과 옵티마이저가 만든 임시 테이블용이다.

 

해당 공간은 세션이 종료되면 truncate되어 Temporary Tablespace Pool로 반환된다.

 

Temporary Tablespace Pool은 서버 시작 시 10개의 temporary tablespace를 생성하며, 필요에 따라 자동으로 추가된다.

(서버 종료 시 Pool 은 제거되고, 시작 시 다시 생성된다.)

 

파일 이름은 temp_1.bit, temp_2.bit.. 형식이다.

 

 

 

☁️ Global Temporary Tablespace

사용자가 생성한 임시 테이블의 변경사항에 대한 롤백 세그먼트를 저장한다.

 

Global Temporary Tablespace의 Data 파일의 상대 경로, 이름, 크기 및 속성 등은 innodb_temp_data_file_path 를 통해 설정할 수 있으며,

설정하지 않는 경우 innodb_data_home_dir에 설정된 디렉토리에 ibtmp1 이라는 하나의 Data 파일로 생성한다.

크기는 자동 확장되며, 초기 크기는 약 12MB 정도이다.

(서버 종료 시 제거되고, 시작 시 다시 생성된다.)

 

 

 

 

 

 

참고