내용으로 건너뛰기

스토리지가 가득 찬 것으로 표시되는 RDS for MySQL 또는 MariaDB 인스턴스 문제를 해결하려면 어떻게 해야 합니까?

5분 분량
0

스토리지가 가득 찬 것으로 표시되는 Amazon Relational Database Service(Amazon RDS) for MySQL 또는 MariaDB 인스턴스의 문제를 해결하고 싶습니다.

간략한 설명

스토리지 공간이 가득 찬 것으로 표시되는 Amazon RDS for MySQL 또는 MariaDB 인스턴스 문제를 해결하려면 DB 인스턴스에서 사용된 총 공간을 확인하여 공간을 사용하는 항목을 식별하십시오. DB 인스턴스의 공간을 다음 객체에 사용할 수 있습니다.

  • 사용자 생성 데이터베이스
  • 임시 테이블
  • 이진 로그 또는 MySQL 스탠바이 인스턴스 릴레이 로그(읽기 전용 복제본을 사용하는 경우)
  • InnoDB 테이블스페이스
  • 일반 로그, 느린 쿼리 로그 및 오류 로그

스토리지 공간을 확인하고 공간을 사용하는 항목을 확인한 후 공간을 회수할 수 있습니다. 그런 다음, FreeStorageSpace 지표를 모니터링하여 추가 스토리지 공간 문제를 방지할 수 있습니다.

참고: 가용 스토리지가 갑자기 감소하는 경우 SHOW FULL PROCESSLIST 명령을 실행하여 DB 인스턴스 수준에서 쿼리를 확인하십시오. SHOW FULL PROCESSLIST 명령은 각 연결에서 수행하는 모든 활성 연결 및 쿼리에 대한 정보를 제공합니다. 오랜 시간 동안 활성 상태였던 트랜잭션을 검토하려면 먼저 INFORMATION_SCHEMA.INNODB_TRX 또는 SHOW ENGINE INNODB STATUS 명령을 실행하십시오. 그런 다음, 출력을 검토합니다.

해결 방법

스토리지가 가득 찼다고 표시되는 Amazon RDS for MySQL 또는 MariaDB 인스턴스 문제를 해결하려면 다음 단계를 완료하십시오.

MySQL DB 인스턴스에서 사용된 총 공간 확인

각 사용자 생성 데이터베이스의 크기 식별

SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",1) AS DATABASE_NAME, ROUND((DATA_FREE/1024/1024/1024),3) AS 'REUSABLE (GB)', ROUND(SUM((TOTAL_EXTENTS * EXTENT_SIZE)/1024/1024/1024),3) AS 'TOTAL (GB)' FROM INFORMATION_SCHEMA.FILES GROUP BY DATABASE_NAME ORDER BY 'TOTAL (GB)'  DESC;

지정한 사용자 데이터베이스의 각 테이블 크기를 확인합니다.
참고: example-database-name을 데이터베이스 이름으로 바꾸십시오.

SELECT SUBSTRING_INDEX(TABLESPACE_NAME,"/",-1) as 'TABLE_NAME', ROUND((total_extents * extent_size)/1024/1024/1024,3) AS "TableSizeinGB" from information_schema.files WHERE FILE_NAME LIKE 'example-database-name';

MariaDB 인스턴스에서 사용된 총 공간 확인

각 사용자 생성 데이터베이스의 크기를 식별합니다.

mysql> SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024/1024,2) "size in GB" FROM information_schema.tables GROUP BY 1 ORDER BY 2 DESC;

지정한 사용자 데이터베이스의 각 테이블 크기를 확인합니다.
참고: example-database를 데이터베이스 이름으로 바꾸고 example-table을 테이블 이름으로 바꾸십시오.

mysql> SELECT table_schema "example-database", example-table,(data_length + index_length)/1024/1024/1024 AS "TableSizeinGB" from information_schema.tables where table_schema='database_name';

임시 테이블 확인

InnoDB 사용자가 생성한 임시 테이블과 디스크상의 내부 임시 테이블은 ibtmp1이라는 임시 테이블스페이스 파일에 생성됩니다. 임시 테이블스페이스 파일은 MySQL 데이터 디렉터리의 ibtmp2까지 확장될 수 있습니다. 임시 테이블 ibtmp1이 과도한 스토리지를 사용하는 경우 DB 인스턴스를 재부팅하여 공간을 확보하십시오.

참고: MySQL 버전 5.7 이상 또는 MySQL 버전 8.0 이상만 사용하여 InnoDB 테이블스페이스의 파일 크기를 쿼리할 수 있습니다.

InnoDB 임시 테이블스페이스를 식별합니다.

mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibtmp%';

글로벌 임시 테이블스페이스 데이터 파일이 차지하고 있는 디스크 공간을 회수하려면 MySQL 서버를 다시 시작하거나 DB 인스턴스를 재부팅하십시오. 자세한 내용은 MySQL 웹 사이트의 임시 테이블스페이스를 참조하십시오.

InnoDB 테이블스페이스 확인

MySQL은 쿼리로 인해 제거할 수 없는 내부 임시 테이블을 생성할 수 있습니다. 이러한 임시 테이블은 information_schema 내부의 tables라는 테이블에 속하지 않습니다. 자세한 내용은 MySQL 웹 사이트에서 MySQL의 내부 임시 테이블 사용을 참조하십시오.

내부 임시 테이블을 식별합니다.

mysql> SELECT * FROM information_schema.innodb_sys_tables WHERE name LIKE '%#%';

InnoDB 시스템 테이블스페이스를 식별합니다.

mysql> SELECT file_name, tablespace_name, table_name, engine, index_length, total_extents, extent_size from information_schema.files WHERE file_name LIKE '%ibdata%';

참고: 이전 쿼리는 MySQL 버전 5.7 이상 또는 MySQL 버전 8.0 이상에서 지원됩니다.

시스템 테이블스페이스의 크기가 커지면 줄일 수 없습니다. 이 문제를 해결하려면 InnoDB 테이블을 덤프하고 테이블을 새 MySQL DB 인스턴스로 가져올 수 있습니다. 시스템 테이블스페이스가 커지는 것을 방지하려면 테이블당 파일 테이블스페이스를 사용하십시오. 자세한 내용은 MySQL 웹 사이트의 테이블당 파일 테이블스페이스를 참조하십시오.

Innodb_file_per_table을 활성화하면 각 테이블이 자체 테이블스페이스 파일에 데이터와 인덱스를 저장합니다. 공간을 회수하려면 OPTIMIZE TABLE을 실행합니다. 자세한 내용은 MySQL 웹 사이트에서 OPTIMIZE TABLE 문을 참조하십시오.

참고: OPTIMIZE TABLE 명령은 COPY 알고리즘을 사용하여 원본 테이블과 동일한 크기의 임시 테이블을 생성합니다. OPTIMIZE TABLE을 실행하기 전에 사용 가능한 디스크 공간이 있는지 확인하십시오.

테이블을 최적화하려면 다음 명령을 실행합니다.
참고: example-table-name을 최적화하려는 테이블로 바꾸십시오.

mysql> OPTIMIZE TABLE example-table-name;

(선택 사항) 테이블을 다시 빌드하려면 다음 명령을 실행합니다.
참고: example-table-name을 최적화하려는 테이블로 바꾸십시오.

mysql> ALTER TABLE example-table-name ENGINE=INNODB;

이진 로그 확인

Amazon RDS 인스턴스에서 자동 백업을 활성화하면 DB 인스턴스에서 이진 로그가 자동으로 활성화됩니다. 이진 로그는 디스크에 저장되고 스토리지 공간을 사용하지만 모든 이진 로그 보존 구성에서 제거됩니다. 인스턴스의 기본 binlog 보존 값은 Null로 설정되며 파일은 즉시 제거됩니다.

스토리지 공간 부족 문제를 방지하려면 Amazon RDS for MySQL에서 이진 로그 보존 기간에 적절한 값을 설정하십시오.

이진 로그가 유지되는 시간을 보려면 mysql.rds_show_configuration 명령을 실행합니다.

CALL mysql.rds_show_configuration;

이진 로그가 사용하는 공간을 줄이려면 이진 로그가 유지되는 시간을 줄이십시오. NULL 값은 로그를 즉시 제거합니다.

활성 인스턴스에 대한 대기 인스턴스가 있는 경우 대기 인스턴스에서 ReplicaLag 지표를 모니터링하십시오. ReplicaLag 지표는 활성 인스턴스에서 이진 로그가 처리되거나 대기 인스턴스에서 릴레이 로그가 처리될 때 발생하는 지연을 나타냅니다.

제거 또는 복제 문제가 있는 경우 시간이 지남에 따라 이진 로그가 누적되어 추가 디스크 공간을 사용할 수 있습니다. 인스턴스의 이진 로그 수와 파일 크기를 확인하려면 SHOW BINARY LOGS 명령을 사용합니다. 자세한 내용은 MySQL 웹 사이트의 SHOW BINARY LOGS 문을 참조하십시오.

DB 인스턴스가 복제 대기 인스턴스 역할을 하는 경우 Relay_Log_Space를 확인하여 릴레이 로그의 크기를 확인하십시오.

SHOW SLAVE STATUS\G

MySQL 로그(일반 로그, 느린 쿼리 로그 및 오류 로그) 확인

느린 쿼리, FILE 유형의 일반 로그 및 오류 로그의 크기를 확인하려면 데이터베이스 로그 파일을 보고 나열하십시오. 느린 쿼리 로그와 일반 로그 테이블이 과도한 스토리지를 사용하는 경우 로그 테이블을 수동으로 교체하여 테이블 기반 MySQL 로그를 관리하십시오.

이전 데이터를 제거하고 디스크 공간을 회수하려면 다음 명령을 두 번 연속으로 실행합니다.

mysql> CALL mysql.rds_rotate_slow_log;mysql> CALL mysql.rds_rotate_general_log;

참고: 테이블은 로그의 정확한 파일 크기를 제공하지 않습니다. slow_loggeneral_log의 경우 log_output 파라미터 값File로 수정하십시오.

Amazon RDS DB 인스턴스 모니터링 및 규모 조정

Amazon RDS 인스턴스를 모니터링하고 규모를 조정하려면 다음 작업을 수행하십시오.