예상보다 많은 스토리지를 사용하는 Amazon RDS MySQL DB 인스턴스 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 11월 14일

MySQL의 Amazon Relational Database Service(Amazon RDS) 데이터베이스 인스턴스가 예상보다 많은 공간을 사용하고 있습니다. 왜 이런 현상이 발생하며, 디스크 스토리지를 최적화하려면 어떻게 해야 합니까?

해결 방법

RDS DB 인스턴스에 대해 사용 가능한 스토리지 공간을 모니터링하도록 FreeStorageSpace Amazon CloudWatch 지표를 사용할 수 있지만, 해당 지표는 DB 인스턴스가 스토리지를 어떻게 이용하는지 설명하지 않습니다.

다음 전략을 사용하여 스토리지 공간을 확보합니다.

OPTIMIZE TABLE 실행

테이블에서 사용하는 공간 중 일부는 실제로 사용 중이 아니라 그 테이블에 할당되었을 뿐입니다. innodb_file_per_table이 활성화된 경우(기본적으로 활성화됨) OPTIMIZE TABLE을 사용하여 해당 공간을 확보할 수 있습니다. OPTIMIZE TABLE은 InnoDB, MyISAM 및 ARCHIVE 테이블에서 작동하고 Amazon RDS는 OPTIMIZE TABLE 명령을 수락하지만 Amazon RDS는 ALTER TABLE...FORCE를 실행합니다. 이 경우 다음과 유사한 경고 메시지가 표시될 수 있습니다. "Table does not support optimize, doing recreate + analyze instead." 자세한 내용은 MySQL 설명서에서 OPTIMIZE TABLE을 참조하십시오.

조각화를 확인하려면 다음과 비슷한 쿼리를 실행하십시오.

SELECT
	table_name,
	data_length,
	max_data_length,
	index_length,
	data_free
FROM
	information_schema.tables 
WHERE table_schema='schema_name'
;

data_free 열에는 사실상 사용 중이 아닌 테이블에 할당된 여유 공간의 양이 강조 표시됩니다. Amazon RDS 기본 innodb_file_per_table 구성 설정에 따라 별도의 테이블스페이스에 테이블이 생성되는 경우 OPTIMIZE TABLE을 사용하여 이 공간을 확보할 수 있습니다. 자세한 내용은 MySQL 설명서에서 File-Per-Table Tablespaces를 참조하십시오.

애플리케이션 테이블 스토리지 감소

DB 인스턴스에서 애플리케이션 테이블이 사용하는 스토리지 크기를 확인하려면 다음과 비슷한 쿼리를 실행하십시오.

SELECT 
	table_schema,
	SUM(data_length + index_length + data_free)/1024/1024 AS total_mb,
	SUM(data_length)/1024/1024 AS data_mb,
	SUM(index_length)/1024/1024 AS index_mb,
	SUM(data_free)/1024/1024 AS free_mb,
	COUNT(*) AS tables,
	CURDATE() AS today 
FROM 
	information_schema.tables
	GROUP BY table_schema
	ORDER BY 2 DESC
;

DB 인스턴스에 가장 큰 애플리케이션 테이블을 찾으려면 다음과 비슷한 쿼리를 실행합니다.

SELECT 
	table_schema,
	table_name,
	(data_length + index_length + data_free)/1024/1024 AS total_mb,
	(data_length)/1024/1024 AS data_mb,
	(index_length)/1024/1024 AS index_mb,
	(data_free)/1024/1024 AS free_mb,
	CURDATE() AS today
FROM 
	information_schema.tables
	ORDER BY 3 DESC
;

참고: 데이터베이스에 768바이트 이상의 가변 길이 컬럼(예: BLOB, TEXT, VARCHAR, or VARBINARY)이 있는 테이블이 들어 있는 경우, 개별 데이터베이스 및 테이블에서 사용한 총 스토리지를 계산할 수 없습니다.

이진 로그 스토리지 감소

읽기 전용 복제본을 추가하면 소스 인스턴스의 이진 로그가 스토리지를 추가로 사용하게 됩니다. 소스 인스턴스의 이진 로그가 스토리지를 얼마나 많이 사용 중인지 알아보려면 BinLogDiskUsage CloudWatch 지표를 확인하세요. 분량이 대폭 증가하는 것은 하나 이상의 읽기 전용 복제본이 동기화되지 않았음을 의미할 수 있습니다. 자세한 내용은 MySQL 이진 로그 액세스를 참조하세요.

일반 로그 및 느린 쿼리 로그 스토리지 감소 또는 비활성화

일반 로그 및 느린 쿼리 로그 파라미터를 활성화하면 DB 인스턴스에서 이러한 로그와 로그의 백업을 저장하기 시작합니다. 이 파일을 교체하고 디스크 사용량을 통제하는 방법은 mysql.rds_rotate_general_logmysql.rds_rotate_slow_log를 참조하십시오.

참고: 잠재적인 성능 문제와 디스크 사용량 문제를 방지하려면, 일반 로그와 느린 쿼리 로그를 실제로 문제 해결에 사용하지 않을 때는 비활성화하십시오.

InnoDB 시스템 테이블스페이스 크기 관리 또는 감소

시스템 테이블스페이스에는 InnoDB 데이터 사전과 실행 취소 공간이 들어 있으며, 10MB부터 시작됩니다. 공간이 할당된 후에 장기 실행 트랜잭션이 사용 가능한 스토리지를 더 많이 이용하는 경우라도 파일은 항상 이 크기 이상입니다.

기본적으로 Amazon RDS는 innodb_file_per_table1로 설정합니다. 이는, 각 테이블스페이스의 데이터가 고유한 .ibd 파일로 저장됨을 의미합니다. 관련 테이블에 재사용할 수 있다고 표시된 공간을 복구하려면 OPTIMIZE TABLE 명령을 사용하여 테이블당 테이블스페이스 파일의 크기를 조정하거나 테이블을 하나 삭제합니다.

innodb_file_per_table0으로 설정된 경우, 모든 테이블은 시스템 테이블스페이스에도 할당됩니다. 테이블 또는 인덱스를 삭제하거나 시스템 테이블스페이스에 할당된 테이블에서 데이터를 삭제하거나 자르면 이전에 사용하던 해당 공간이 재사용 가능한 것으로 표시됩니다. 그러나 해당 명령은 파일 시스템에 대한 공간을 확보하지는 않습니다.

시스템 테이블스페이스 자체를 축소할 수 없기 때문에 현재 데이터베이스의 데이터를 내보낸 후 새 인스턴스로 가져옵니다. 가동 중단 시간을 줄이려면 새 MySQL 인스턴스를 소스 Amazon RDS 인스턴스의 복제본으로 구성하세요. 복제본이 소스 Amazon RDS 인스턴스와 동기화되면 새 인스턴스로 전환하세요. 수동 복제에 대한 자세한 내용은 Amazon RDS 외부에서 실행 중인 MySQL 또는 MariaDB 인스턴스를 사용한 복제를 참조하세요.

참고: 스냅샷에서 복원하거나 읽기 전용 복제본을 생성하는 것은 시스템 테이블스페이스에서 공간을 복구하는 데 도움이 되지 않습니다. 두 방법 모두 시스템 테이블스페이스가 들어 있는 소스 인스턴스 스토리지 볼륨의 스냅샷을 사용하기 때문입니다.