하드 디스크 용량이 부족해서 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 한다.