예상보다 많은 스토리지를 사용하는 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 또는 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 인스턴스를 사용한 복제를 참조하십시오.

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