Amazon Relational Database Service(Amazon RDS) for MySQL DB가 예상보다 많은 공간을 사용하는 이유를 알고 싶습니다. 또한 디스크 스토리지도 최적화하려고 합니다.
해결 방법
Amazon RDS DB 인스턴스의 사용 가능한 스토리지 공간을 모니터링하려면 Amazon CloudWatch FreeStorageSpace 지표를 사용할 수 있습니다. 하지만 FreeStorageSpace 지표는 DB 인스턴스의 스토리지를 사용하는 항목을 보여주지 않습니다. 스토리지를 사용하고 있는 항목을 확인하고 스토리지 공간을 회수하려면 다음 방법을 사용하십시오.
OPTIMIZE TABLE 실행
테이블은 현재 사용되지 않는 공간만 사용합니다. 하지만 Amazon RDS는 여전히 테이블에 공간을 할당합니다. innodb_file_per_table을 설정한 경우 OPTIMIZE TABLE 명령을 실행하여 공간을 회수할 수 있습니다. 자세한 내용은 MySQL 웹사이트에서 OPTIMIZE TABLE 문을 참조하십시오.
InnoDB, MyISAM 및 ARCHIVE 테이블에 OPTIMIZE TABLE을 사용할 수 있습니다. OPTIMIZE TABLE은 Amazon RDS 기본 innodb_file_per_table 구성 설정에 따라 별도의 테이블스페이스에 테이블을 생성할 때 작동합니다. 자세한 내용은 MySQL 웹 사이트의 테이블당 파일 테이블스페이스를 참조하십시오.
Amazon RDS는 OPTIMIZE TABLE 명령을 허용하지만 실제로는 ALTER TABLE...FORCE 명령을 대신 실행합니다. 이 경우 다음과 유사한 경고 메시지가 표시됩니다.
"Table does not support optimize, doing recreate + analyze instead."
통계를 업데이트한 후 다음 information_schema.tables 쿼리를 실행하여 통계에 기반한 스토리지 사용량을 추정합니다.
SELECT table_name,
data_length,
max_data_length,
index_length,
data_free
FROM
information_schema.tables
WHERE table_schema='schema_name'
;
참고: 위 쿼리에서 사용 사례에 맞는 값을 추가하십시오.
data_free 열은 현재 사용 중이 아닌 테이블에 할당된 여유 공간의 양을 보여줍니다.
애플리케이션 테이블 스토리지 줄이기
애플리케이션 테이블이 RDS MySQL DB 인스턴스에서 사용하는 스토리지의 양을 보려면 다음 쿼리를 실행합니다.
SELECT TABLESPACE_NAME,
ROUND(DATA_FREE/EXTENT_SIZE,0) FREE_DATA_MB,
FREE_EXTENTS FREE_EXTENTS_MB, TOTAL_EXTENTS
TOTAL_EXTENTS_MB FROM
INFORMATION_SCHEMA.FILES;
RDS MySQL DB 인스턴스에서 가장 큰 애플리케이션 테이블을 찾으려면 다음 쿼리를 실행합니다.
SELECT TABLESPACE_NAME,
ROUND(DATA_FREE/EXTENT_SIZE,0) FREE_DATA_MB,
FREE_EXTENTS FREE_EXTENTS_MB,
TOTAL_EXTENTS TOTAL_EXTENTS_MB FROM
INFORMATION_SCHEMA.FILES
ORDER BY TOTAL_EXTENTS_MB DESC;
참고: 데이터베이스에 768바이트보다 긴 가변 길이 열이 있는 테이블이 포함된 경우 데이터베이스와 테이블이 사용하는 개별 스토리지를 계산할 수 없습니다. 이 제한에는 BLOB, TEXT, VARCHAR 및 VARBINARY 명령이 포함됩니다.
바이너리 로그 스토리지 줄이기
Amazon RDS 인스턴스에 읽기 전용 복제본을 추가하면 소스 인스턴스의 바이너리 로그에서 추가 스토리지를 사용합니다. 소스 인스턴스의 바이너리 로그가 사용하는 스토리지의 양을 확인하려면 BinLogDiskUsage CloudWatch 지표를 확인하십시오. 바이너리 로그에서 스토리지를 점점 더 많이 사용하는 경우 읽기 전용 복제본을 동기화해야 할 수 있습니다.
일반 로그 및 느린 쿼리 로그 스토리지 줄이기 또는 끄기
일반 로그 및 느린 쿼리 로그 파라미터를 끄면 인스턴스에서 로그 및 로그 백업을 저장하기 시작합니다. 파일을 교체하고 디스크 사용량을 제어하려면 mysql.rds_rotate_general_log 및 mysql.rds_rotate_slow_log를 참조하십시오.
참고: 문제를 해결하지 않을 경우에는 일반 및 느린 쿼리 로그를 끄는 것이 좋습니다.
InnoDB 시스템 테이블스페이스 크기 관리 또는 줄이기
시스템 테이블스페이스는 10MB의 공간으로 시작하며 InnoDB 데이터 사전과 실행 취소 공간이 포함됩니다. 공간을 할당한 후에는 파일이 최소 10MB가 되어 더 많은 가용 스토리지를 사용할 수 있습니다.
기본적으로 Amazon RDS는 innodb_file_per_table을 1로 설정하여 데이터베이스가 자체 .ibd 파일에 각 테이블스페이스에 대한 데이터를 저장할 수 있도록 합니다. 관련 테이블의 재사용 가능한 공간을 복구하려면 OPTIMIZE TABLE을 사용하여 각 테이블 테이블스페이스 파일의 크기를 조정하십시오. 또는 테이블을 삭제할 수도 있습니다.
innodb_file_per_table을 0으로 설정하면 Amazon RDS가 모든 테이블을 시스템 테이블스페이스에 할당합니다. 시스템에서 테이블 또는 인덱스를 삭제하거나 할당된 테이블에서 데이터를 삭제 또는 잘라내는 경우, 테이블스페이스는 해당 공간을 재사용 가능한 것으로 표시합니다. 그러나 innodb_file_per_table은 파일 시스템을 위한 공간을 확보하지 않습니다.
시스템 테이블스페이스가 위치한 인스턴스에서는 해당 시스템 테이블스페이스를 축소할 수 없습니다. 대신 현재 데이터베이스의 데이터를 내보낸 다음, 해당 데이터를 새 인스턴스로 가져오십시오. 가동 중지 시간을 줄이려면 새 MySQL 인스턴스를 소스 Amazon RDS 인스턴스의 복제본으로 구성하십시오. 복제본을 소스 Amazon RDS 인스턴스와 동기화한 후 새 인스턴스로 전환합니다.
참고: 스냅샷에서 복원하거나 읽기 전용 복제본을 생성할 경우 시스템 테이블스페이스에서 공간을 복구하지는 않습니다. 두 방법 모두 시스템 테이블스페이스가 포함된 소스 인스턴스 스토리지 볼륨의 스냅샷을 사용합니다.
관련 정보
Amazon RDS DB 인스턴스의 스토리지 부족
Amazon RDS DB 인스턴스 수정
Amazon RDS for MySQL를 사용할 때 발생하는 "MySQL HA_ERR_RECORD_FILE_FULL" 오류를 해결하려면 어떻게 해야 합니까?