하드 디스크 용량이 부족해서 MariaDB 서비스가 정지했다.

용량이 충분한 원격지 서버에 데이터를 백업해놓고, TRUNCATE 명령어를 사용해서 데이터를 비우기로 했다.

 

> TRUNCATE [테이블 이름];

 

TRUNCATE 시킨 테이블의 데이터 크기만큼 용량이 확보될 줄 알았는데, 확인 해보니 전혀 줄어들지가 않았다.

원인은 모든 데이터베이스 데이터를 하나의 ibdata 파일에 저장하고 있어서 였다.

TRUNCATE 하나면 모든게 해결될 줄 알았는데

 

 

데이터베이스 별 폴더를 생성하고, 테이블 별 ibdata를 생성하기 위해선 다음과 같이 사용하면 된다.

1. my.cnf 파일 옵션 수정

 - /etc/my.cnf 환경설정 파일을 다음과 같이 수정하면 된다.

[mysqld]
innodb_file_per_table=ON

또는 innodb_file_per_table=1로 설정해도 된다.

 

- 옵션이 적용되려면 MariaDB 서비스를 재시작 해야한다.

# systemctl restart mariadb

 

 

2. SET GLOBAL 사용하기

 - MariaDB 프롬프트에서 다음의 명령어를 사용해서 설정할 수 있다.

> SET GLOBAL innodb_file_per_table=ON;

 

/var/lib/mysql 경로로 가서 확인해보면 데이터베이스 별 폴더에 테이블 별 ibdata를 저장하고 있는 것을 볼 수 있다.

자, 이제 TRUNCATE 명령어를 사용해서 테이블 데이터를 삭제하면 .ibd 파일의 크기도 줄면서 하드 디스크 용량이 줄어드는 것을 볼 수 있다. 옵션 관련해서 자세한 내용은 공식 홈페이지 링크를 참조하자.

 

 

추가로, 만약에 DELETE 명령어를 사용해서 데이터를 지울 경우에는 OPTIMIZE를 해줘야지 ibdata 및 하드 디스크 용량이 확보된다.

OPTIMIZE를 하기 위해선 MariaDB 프롬프트에서 다음 명령어를 차례로 실행한다.

> START TRANSACTION
> DELETE FROM [테이블 이름] ...
> COMMIT
> OPTIMIZE TABLE [테이블 이름]

- START TRANSACTION: Auto commit을 하지 않고 트랜잭션을 시작한다.

- DELETE FROM [테이블 이름] ...: Table 안의 데이터를 삭제한다.

- COMMIT: 수동으로 Commit 작업을 한다.

- OPTIMIZE TABLE [테이블 이름]: Table을 Optimize 한다.