ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL Tablespace 알아보기
    Database 2023. 5. 12. 18:18
    728x90
    반응형

    - 목차

     

    함께 보면 좋을 글

    https://westlife0615.tistory.com/16

     

    MySQL Page 알아보기

    - 목차 함께 읽으면 좋은 글 https://westlife0615.tistory.com/8 MySQL Undo Log (Undo Tablespace) 알아보기 - 목차 소개. MySQL 은 Undo Log 라는 데이터 저장 영역이 있습니다. Undo 란 revert, rollback 과 같이 직전에 수행

    westlife0615.tistory.com

     

    소개.

    이번 글에서는 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

     

    MySQL Page 알아보기

    - 목차 함께 읽으면 좋은 글 https://westlife0615.tistory.com/8 MySQL Undo Log (Undo Tablespace) 알아보기 - 목차 소개. MySQL 은 Undo Log 라는 데이터 저장 영역이 있습니다. Undo 란 revert, rollback 과 같이 직전에 수행

    westlife0615.tistory.com

     

    먼저 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
Designed by Tistory.