-
MySQL Tablespace 알아보기Database 2023. 5. 12. 18:18728x90반응형
- 목차
함께 보면 좋을 글
https://westlife0615.tistory.com/16
소개.
이번 글에서는 Tablespace 에 대해서 알아보려고 합니다.
Tablespace 은 MySQL 의 On-Disk 영역의 구성요소입니다.
MySQL 의 데이터들은 Tablespace 에 저장이 됩니다.
MySQL 의 데이터는 Write Query 에 의해서 생성되는 데이터들을 뜻합니다.
Insert Query 에 의해서 Table 의 Row 들이 생성되고, 관련한 Index 가 추가됩니다.
이러한 Table 의 Row, Index 데이터가 Tablespace 에 저장되죠.
Tablespace 는 파일시스템 관점에서 보았을 때에 파일입니다.
ibdata 라는 파일명 또는 .ibd 확장자를 가집니다.
< Tablespace 찾기 >
ls -al | grep .ibd -rw-r----- 1 mysql mysql 3120562176 Oct 20 13:00 test_table.ibd -rw-r----- 1 mysql mysql 131072 Oct 21 09:19 test_user_table.ibd ls -al | grep ibdata -rw-r----- 1 mysql mysql 12582912 Oct 22 02:34 ibdata1
과거의 MySQL 에서는 모든 테이블스페이스가 ibdata 라는 파일명을 가지는 System Tablespace 에 저장되었습니다.
이는 하나의 Tablespace 에 모든 테이블의 데이터들이 저장되는 구조였습니다.
즉 100 개의 Table 이 있다고 했을 때, 해당하는 모든 data 와 index 들이 하나의 Tablespace 에 저장되었습니다.
하지만 최근의 MySQL 은 File-per-Table Tablespace 라고 해서 테이블별로 Tablespace 를 가지는 구조가 되었습니다.
이어지는 글에서 데이터베이스의 실질적인 데이터를 저장하고 있는 Tablespace 가 어떻게 활용되는지에 대해 살펴보도록 하겠습니다.
Page.
https://westlife0615.tistory.com/16
먼저 Page 에 대해서 알아보겠습니다.
Page 는 데이터들의 논리적인 단위입니다.
여러개의 데이터들을 묶어서 하나의 Page 라고 부릅니다.
예를 들어, N 개의 Row 들이 하나의 Page 가 됩니다.
그리고 M 개의 Index 정보 그리고 L 개의 Undo Log 데이터들도 하나의 Page 가 됩니다.
Page 는 기본적으로 16KB 의 크기 제한이 있는데요,
어떤 테이블의 하나의 Row 가 1KB 라고 가정한다면 하나의 Page 에 16개의 Row들이 구성될 수 있습니다.
만약 하나의 Row 의 사이즈가 4KB 라고 한다면 하나의 Page 에 4개의 Row 들이 구성되겠죠.
이러한 방식으로 Page 가 나뉘며,Tablespace 는 데이터들을 Page 단위로 관리하게 됩니다.
Page 는 MySQL 내부에서 기본적인 데이터의 단위입니다.
Tablespace 에서 하나의 데이터를 메모리로 로드할 때에서 해당 데이터가 속한 Page 를 메모리로 로드합니다.
메모리에서 Tablespace 로 데이터를 기록하는 시점에도 Page 단위로 저장되죠.
Tablespace 또한 Row of Table 과 Index 데이터를 Page 단위로 관리합니다.
Tablespace 종류.
Tablespace 의 종류는 아래와 같습니다.
- System Tablespace
- File-per-Table Tablespace
- Undo Tablespace
- Temporary Tablespace
등이 존재합니다.
Row of Table 과 Index 데이터처럼 실질적인 데이터를 저장하는 영역은 두가지입니다.
System Tablespace 와 File-per-Table Tablespace 입니다.
System Tablespace 는 모든 테이블의 데이터를 하나의 파일에 기록하는 방식을 취합니다.
반면 File-Per-Table Tablespace 는 각 테이블마다 개별적인 Tablespace 를 가집니다.
이는 MySQL 의 설정을 따르게 되는데요.
innodb_file_per_table 이 활성화된다면 File-Per-Table Tablespace 방식을 취하고
innodb_file_per_table 이 비활성화된다면 System Tablespace 방식을 취하게 됩니다.
< innodb_file_per_table 조회하기 >
show variables like '%innodb_file_per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.06 sec)
MySQL 8 버전 이후에는 innodb_file_per_table = ON 설정이 기본값으로 사용됩니다.
따라서 File-Per-Table Tablespace 에 대해서 깊이 있게 알아보려고 합니다.
File-Per-Table Tablespace.
시스템 변수인 datadir 은 Tablespace 들이 저장되는 위치정보를 가집니다.
< 시스템 변수 datadir >
show variables like 'datadir'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.03 sec)
그리고 test, test1, test2, test3, test4 인 5개의 database 를 생성하였습니다.
< database 생성 >
mysql> create database test; Query OK, 1 row affected (0.03 sec) mysql> create database test1; Query OK, 1 row affected (0.03 sec) mysql> create database test2; Query OK, 1 row affected (0.00 sec) mysql> create database test3; Query OK, 1 row affected (0.02 sec) mysql> create database test4; Query OK, 1 row affected (0.02 sec)
아래와 같이 datadir 디렉토리 하위에 데이터베이스에 대응되는 폴더들이 생성됩니다.
ls -al /var/lib/mysql | grep test drwxr-x--- 2 mysql mysql 4096 Oct 22 02:33 test drwxr-x--- 2 mysql mysql 4096 Oct 22 03:17 test1 drwxr-x--- 2 mysql mysql 4096 Oct 22 03:17 test2 drwxr-x--- 2 mysql mysql 4096 Oct 22 03:18 test3 drwxr-x--- 2 mysql mysql 4096 Oct 22 03:18 test4
이제 테이블을 생성해보겠습니다.
test1, test2, test3 데이터베이스에는 test_city 테이블을 생성하였고,
test4 데이터베이스에는 어떠한 테이블도 생성하지 않았습니다.
mysql> use test1; Database changed mysql> create table test_city(id int not null auto_increment primary key, name varchar(64) not null); Query OK, 0 rows affected (0.04 sec) mysql> use test2; Database changed mysql> create table test_city(id int not null auto_increment primary key, name varchar(64) not null); Query OK, 0 rows affected (0.03 sec) mysql> use test3; Database changed mysql> create table test_city(id int not null auto_increment primary key, name varchar(64) not null); Query OK, 0 rows affected (0.06 sec)
datadir 에 해당하는 /var/lib/mysql/ 하위에 test1, test2, test3 의 폴더가 생겼구요.
하위에는 test_city.idb 파일이 존재함을 알 수 있습니다.
반면, 어떠한 테이블도 생성하지 않은 test4 데이터베이스의 경우에는 /var/lib/mysql/test4 하위에 어떠한 파일도 존재하지 않습니다.
즉, 테이블을 생성하지 않으면 Tablespace 가 생성되지 않습니다.
< File-Per-Table Tablespace 확인 >
ls -al /var/lib/mysql/test1 total 88 drwxr-x--- 2 mysql mysql 4096 Oct 22 03:20 . drwxrwxrwt 11 mysql mysql 4096 Oct 22 03:18 .. -rw-r----- 1 mysql mysql 114688 Oct 22 03:20 test_city.ibd ls -al /var/lib/mysql/test2 total 88 drwxr-x--- 2 mysql mysql 4096 Oct 22 03:20 . drwxrwxrwt 11 mysql mysql 4096 Oct 22 03:18 .. -rw-r----- 1 mysql mysql 114688 Oct 22 03:20 test_city.ibd ls -al /var/lib/mysql/test3 total 88 drwxr-x--- 2 mysql mysql 4096 Oct 22 03:20 . drwxrwxrwt 11 mysql mysql 4096 Oct 22 03:18 .. -rw-r----- 1 mysql mysql 114688 Oct 22 03:20 test_city.ibd ls -al /var/lib/mysql/test4 total 8 drwxr-x--- 2 mysql mysql 4096 Oct 22 03:18 . drwxrwxrwt 11 mysql mysql 4096 Oct 22 03:18 ..
Physical Backup.
Tablespace 는 Physical Backup 과정에서 사용됩니다.
MySQL backup 은 Physical Backup 과 Logical Backup 으로 나뉩니다.
mysqldump 같은 툴이 Logical Backup 으로 사용됩니다.
이는 MySQL 데이터의 현 상태를 SQL Write Query 의 리스트로 관리합니다.
그래서 현재 상태의 데이터들이 수많은 SQL Write Query 의 리스트로 표현되죠.
mysqldump 의 backup 결과물 또한 .sql 확장자를 가집니다.
반면, XtraBackup 같은 툴은 Physical Backup 으로 분류됩니다.
Physical Backup 은 System Tablespace, File-Per-Table Tablespace 의 실질적인 파일들을 카피합니다.
그리고 Redo Log 같은 최근 Checkpoint 이후의 데이터 변경 기록들 또한 카피합니다.
그 외 여러 파일들을 활용하여 Backup 시점의 상태를 복원할 수 있는 데이터를 생성합니다.
철저히 MySQL 에 저장된 파일들을 토대서 Backup 을 시도하게 됩니다.
이 과정에서 Tablespace 가 전적으로 활용되게 됩니다.
마치며...
MySQL 의 Tablespace 에 대해서 알아보았습니다.
File-Per-Table Tablespace 에 대해서 중점적으로 알아보았는데요.
추후에 System Tablespace, Temporary Tablespace 에 대해서도 알아볼 예정입니다.
혹시나 제 글을 읽다가 보완할 점이나 궁금한 점이 있으시면 댓글을 남겨주시면 좋을 같네요.
반응형'Database' 카테고리의 다른 글
MySQL my.cnf (0) 2023.09.11 MySQL mysqldump 알아보기 (0) 2023.05.18 Mysql Procedure (0) 2023.05.15 MySQL ACID Compliant (0) 2023.05.08 mysql connection (0) 2023.02.15