Amazon RDS for MySQL에 대해 알려진 문제 및 제한 - Amazon Relational Database Service

Amazon RDS for MySQL에 대해 알려진 문제 및 제한

Amazon RDS for MySQL 작업에 대해 알려진 문제 및 제한은 다음과 같습니다.

InnoDB 예약어

InnoDB는 RDS for MySQL의 예약어입니다. MySQL 데이터베이스에는 이 이름을 사용할 수 없습니다.

Amazon RDS for MySQL에 대해 스토리지가 가득 찬 동작

MySQL DB 인스턴스의 스토리지가 가득 차면 메타데이터 불일치, 사전 불일치 및 고아 테이블이 발생할 수 있습니다. 이러한 문제를 방지하기 위해 Amazon RDS에서는 storage-full 상태에 도달한 DB 인스턴스를 자동으로 중지합니다.

MySQL DB 인스턴스는 다음과 같은 경우에 storage-full 상태에 도달합니다.

  • DB 인스턴스의 스토리지는 20,000MiB 미만이며 사용 가능한 스토리지는 200MiB 이하에 이릅니다.

  • DB 인스턴스에는 102,400MiB 이상의 스토리지가 있으며 사용 가능한 스토리지는 1024MiB 이하에 이릅니다.

  • DB 인스턴스의 스토리지는 20,000MiB에서 102,400MiB 사이이며 사용 가능한 스토리지의 1% 미만입니다.

DB 인스턴스가 storage-full 상태에 도달했기 때문에 Amazon RDS에서 DB 인스턴스를 자동으로 중지하더라도 DB 인스턴스를 변경할 수 있습니다. DB 인스턴스를 다시 시작하려면 다음 중 하나 이상을 완료하세요.

이러한 변경 사항 중 하나를 수행한 후에는 DB 인스턴스가 자동으로 다시 시작됩니다. DB 인스턴스 수정에 대한 자세한 내용은 Amazon RDS DB 인스턴스 수정 단원을 참조하세요.

일관되지 않은 InnoDB 버퍼 풀 크기

MySQL 5.7에는 현재 InnoDB 버퍼 풀 크기가 관리되지 않는 버그가 있습니다. MySQL 5.7에서 innodb_buffer_pool_size 파라미터 값을 InnoDB 버퍼 풀 크기를 너무 많이 늘려 너무 많은 메모리를 소모하도록 하는 큰 값으로 조정할 수 있습니다. 이에 따라 MySQL 데이터베이스 엔진의 실행이 중지되거나 시작되지 않을 수 있습니다. 이 문제는 사용 가능한 메모리가 적은 DB 인스턴스 클래스 문제보다 더 일반적으로 발생합니다.

이 문제를 해결하려면 innodb_buffer_pool_size 파라미터 값을 innodb_buffer_pool_instances 파라미터 값과 innodb_buffer_pool_chunk_size 파라미터 값의 곱의 배수로 설정해야 합니다. 예를 들어, 다음 예에서와 같이 innodb_buffer_pool_size 파라미터 값을 innodb_buffer_pool_instancesinnodb_buffer_pool_chunk_size 파라미터 값의 곱의 8배로 설정할 수 있습니다.

innodb_buffer_pool_chunk_size = 536870912 innodb_buffer_pool_instances = 4 innodb_buffer_pool_size = (536870912 * 4) * 8 = 17179869184

MySQL 5.7 버그에 대한 자세한 내용은 MySQL 설명서의 https://bugs.mysql.com/bug.php?id=79379를 참조하세요.

인덱스 병합 최적화가 잘못된 결과를 반환

인덱스 병합 최적화를 사용하는 쿼리는 MySQL 5.5.37에서 도입된 MySQL 쿼리 옵티마이저의 버그로 인해 잘못된 결과를 반환할 수 있습니다. 여러 개의 인덱스가 있는 테이블에 대해 쿼리를 실행하면 최적화 프로그램이 여러 개의 인덱스를 기반으로 여러 범위의 행을 스캔하지만, 결과를 올바르게 함께 병합하지 않습니다. 쿼리 옵티마이저 버그에 대한 자세한 내용은 MySQL 버그 데이터베이스의 http://bugs.mysql.com/bug.php?id=72745http://bugs.mysql.com/bug.php?id=68194를 참조하세요.

예를 들면, 검색 인수가 인덱싱된 열을 참조하는 2개의 인덱스가 있는 테이블에 대한 쿼리를 고려합니다.

SELECT * FROM table1 WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

이 경우 검색 엔진이 두 인덱스를 모두 검색합니다. 그러나 버그로 인해 병합 결과가 정확하지 않습니다.

이 문제를 해결하려면 다음 중 한 가지 방법을 시도하면 됩니다.

  • MySQL DB 인스턴스용 DB 파라미터 그룹에서 optimizer_switch 파라미터를 index_merge=off로 설정합니다. DB 파라미터 그룹 파라미터 설정에 대한 자세한 내용은 Amazon RDS의 파라미터 그룹 단원을 참조하세요.

  • MySQL DB 인스턴스를 MySQL 버전 5.7 또는 8.0으로 업그레이드합니다. 자세한 내용은 RDS for MySQL DB 엔진 업그레이드 단원을 참조하십시오.

  • 인스턴스를 업그레이드하거나 optimizer_switch 파라미터를 변경할 수 없는 경우, 쿼리에 대한 인덱스를 명시적으로 확인하여 버그를 해결할 수 있습니다. 예:

    SELECT * FROM table1 USE INDEX covering_index WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

자세한 내용은 MySQL 설명서의 인덱스 병합 최적화를 참조하세요.

Amazon RDS DB 인스턴스에 대한 MySQL 파라미터 예외

일부 MySQL 파라미터의 경우 Amazon RDS DB 인스턴스와 함께 사용할 때 특별히 고려해야 할 사항이 있습니다.

lower_case_table_names

Amazon RDS는 대소문자 구분 파일 시스템을 사용하므로 lower_case_table_names 서버 파라미터의 값을 2(이름은 지정된 대로 저장되지만 소문자로 비교됨)로 설정하는 것은 지원하지 않습니다. 다음은 Amazon RDS for MySQL DB 인스턴스에 대해 지원되는 값입니다.

  • 모든 RDS for MySQL 버전에는 0(이름은 지정된 대로 저장되며 비교 시 대소문자 구분)이 지원됩니다.

  • RDS for MySQL 버전 5.7, 버전 8.0.28 이상의 8.0 버전에는 1(이름은 소문자로 저장되며 비교 시 대소문자 구분 안 함)이 지원됩니다.

lower_case_table_names 파라미터는 DB 인스턴스를 생성하기 전에 사용자 지정 DB 파라미터 그룹을 설정합니다. DB 인스턴스를 생성할 때 사용자 지정 DB 파라미터 그룹을 지정합니다.

파라미터 그룹이 8.0보다 낮은 버전의 MySQL DB 인스턴스와 연결된 경우 파라미터 그룹에서 lower_case_table_names 파라미터를 변경하지 않는 것이 좋습니다. 변경할 경우 특정 시점으로 복구 백업과 읽기 전용 복제본 DB 인스턴스에서 불일치가 발생할 수 있습니다.

파라미터 그룹이 버전 8.0 MySQL DB 인스턴스와 연결된 경우 파라미터 그룹에서 lower_case_table_names 파라미터를 수정할 수 없습니다.

읽기 전용 복제본은 항상 소스 DB 인스턴스와 동일한 lower_case_table_names 파라미터 값을 사용해야 합니다.

long_query_time

마이크로초 해상도로 느린 쿼리를 MySQL의 느린 쿼리 로그에 기록할 수 있도록 long_query_time 파라미터를 부동 소수점 값으로 설정합니다. 100밀리초에 해당하는 0.1초와 같은 값을 설정하여 1초 이내의 시간이 걸리는 느린 트랜젝션을 디버깅할 때 도움을 받을 수 있습니다.

Amazon RDS의 MySQL 파일 크기 제한

MySQL DB 인스턴스의 경우 최대 프로비저닝 스토리지 제한으로 인해 InnoDB 테이블당 파일 테이블스페이스를 사용하여 각 테이블의 크기가 최대 16TB로 제한됩니다. 또한 이 제한은 시스템 테이블스페이스를 최대 16TB의 크기로 제한합니다. MySQL DB 인스턴스에서는 테이블이 각각 자체 테이블스페이스에 들어 있는 InnoDB 테이블당 파일 테이블스페이스가 기본적으로 설정됩니다.

참고

일부 기존 DB 인스턴스에는 하한이 있습니다. 예를 들어, 2014년 4월 이전에 생성된 MySQL DB 인스턴스의 파일 및 테이블 크기 제한이 2TB입니다. 이 2TB 파일 크기 제한은 DB 인스턴스 생성 시기와 상관없이 2014년 4월 이전에 캡처된 DB 스냅샷으로 생성된 DB 인스턴스 또는 읽기 전용 복제본에도 적용됩니다.

애플리케이션에 따라 InnoDB 테이블당 파일 테이블스페이스 사용에 대한 장점과 단점은 서로 다릅니다. 애플리케이션에 가장 적합한 접근 방식을 확인하려면 MySQL 설명서의 테이블당 파일 테이블스페이스를 참조하세요.

테이블을 최대 파일 크기로 늘리도록 허용하는 것은 권장하지 않습니다. 일반적으로 모범 사례는 성능 및 복구 시간을 향상할 수 있도록 데이터를 더 작은 테이블로 분할하는 것입니다.

대형 테이블을 여러 개의 작은 테이블로 분할하는 데 사용할 수 있는 한 가지 옵션으로는 파티셔닝이 있습니다. 파티셔닝을 수행하면 사용자가 지정하는 규칙에 따라 라지 테이블의 일부가 개별 파일로 배포됩니다. 예를 들어, 트랜잭션을 날짜별로 저장하는 경우 파티셔닝을 사용하여 이전 트랜잭션을 개별 파일로 배포하는 파티셔닝 규칙을 생성할 수 있습니다. 이렇게 하면 애플리케이션에서 즉시 사용할 필요가 없는 이전 트랜잭션 데이터를 주기적으로 보관할 수 있습니다. 자세한 내용은 MySQL 설명서의 파티셔닝을 참조하세요.

모든 테이블과 InnoDB 시스템 테이블스페이스의 크기를 지원하는 단일 시스템 테이블 또는 보기가 없기 때문에 여러 테이블을 쿼리하여 테이블스페이스의 크기를 확인해야 합니다.

InnoDB 시스템 테이블스페이스와 데이터 딕셔너리 테이블스페이스의 크기를 확인하려면
  • 다음 SQL 명령을 사용하여 크기가 너무 커서 파티셔닝을 수행해야 하는 테이블스페이스가 있는지 확인합니다.

    참고

    데이터 딕셔너리 테이블스페이스는 MySQL 8.0에만 해당됩니다.

    select FILE_NAME,TABLESPACE_NAME, ROUND(((TOTAL_EXTENTS*EXTENT_SIZE) /1024/1024/1024), 2) as "File Size (GB)" from information_schema.FILES where tablespace_name in ('mysql','innodb_system');
InnoDB 시스템 테이블스페이스 외부의 InnoDB 사용자 테이블 크기를 확인하려면(MySQL 5.7 버전의 경우)
  • 다음 SQL 명령을 사용하여 크기가 너무 커서 파티셔닝을 수행해야 하는 테이블이 있는지 확인합니다.

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_SYS_TABLESPACES ORDER BY 3 DESC;
InnoDB 시스템 테이블스페이스 외부의 InnoDB 사용자 테이블 크기를 확인하려면(MySQL 8.0 버전의 경우)
  • 다음 SQL 명령을 사용하여 크기가 너무 커서 파티셔닝을 수행해야 하는 테이블이 있는지 확인합니다.

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_TABLESPACES ORDER BY 3 DESC;
비 InnoDB 사용자 테이블의 크기를 확인하려면
  • 다음 SQL 명령을 사용하여 비 InnoDB 사용자 테이블이 너무 큰지 확인합니다.

    SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH+DATA_FREE) / 1024 / 1024/ 1024), 2) As "Approximate size (GB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') and ENGINE<>'InnoDB';
InnoDB 테이블당 파일 테이블스페이스를 활성화하는 방법
  • DB 인스턴스의 파라미터 그룹에서 innodb_file_per_table 파라미터를 1로 설정합니다.

InnoDB 테이블당 파일 테이블스페이스를 비활성화하는 방법
  • DB 인스턴스의 파라미터 그룹에서 innodb_file_per_table 파라미터를 0으로 설정합니다.

파라미터 그룹 업데이트에 대한 자세한 내용은 Amazon RDS의 파라미터 그룹을(를) 참조하십시오.

InnoDB 테이블당 파일 테이블스페이스를 활성화하거나 비활성화한 경우 ALTER TABLE 명령을 실행하여 아래의 예와 같이 테이블을 전역 테이블스페이스에서 자체 테이블스페이스로 이동하거나 자체 테이블스페이스에서 전역 테이블스페이스로 이동할 수 있습니다.

ALTER TABLE table_name TABLESPACE=innodb_file_per_table;

MySQL Keyring Plugin 지원 안 됨

현재 Amazon RDS for MySQL에서는 MySQL keyring_aws Amazon Web Services Keyring Plugin이 지원되지 않습니다.

사용자 지정 포트

Amazon RDS는 MySQL 엔진의 사용자 지정 포트 33060으로의 연결을 차단합니다. MySQL 엔진에 사용할 다른 포트를 선택하세요.

MySQL 저장 프로시저 제한 사항

다음 RDS for MySQL 버전에서는 사용자 이름이 16자보다 긴 MySQL 사용자가 소유한 세션 또는 쿼리를 mysql.rds_killmysql.rds_kill_query 저장 프로시저로 종료할 수 없습니다.

  • 8.0.32 이하 8 버전

  • 5.7.41 이하 5.7 버전

외부 소스 인스턴스를 사용하여 GTID 기반 복제

Amazon RDS는 외부 MySQL 인스턴스에서 구성 중에 GTID_PURGED를 설정해야 하는 Amazon RDS for MySQL DB 인스턴스로의 글로벌 트랜잭션 식별자(GTID) 기반 복제를 지원합니다. 그러나 RDS for MySQL 8.0.37 이상 버전에서만 이 기능을 지원합니다.

MySQL 기본 인증 플러그인

RDS for MySQL 버전 8.0.34 이상에서 mysql_native_password 플러그인을 사용합니다. default_authentication_plugin 설정은 변경할 수 없습니다.

innodb_buffer_pool_size 재정의

마이크로 또는 소형 DB 인스턴스 클래스의 경우 innodb_buffer_pool_size 파라미터의 기본값이 다음 명령을 실행하여 반환되는 값과 다를 수 있습니다.

mysql> SELECT @@innodb_buffer_pool_size;

이러한 차이는 Amazon RDS가 DB 인스턴스 클래스 관리의 일환으로 기본값을 재정의해야 할 때 발생할 수 있습니다. 필요한 경우 기본값을 재정의하고 DB 인스턴스 클래스가 지원하는 값으로 설정할 수 있습니다. 유효한 값을 결정하려면 메모리 사용량과 DB 인스턴스의 총 가용 메모리를 더하세요. 자세한 내용은 Amazon RDS 인스턴스 유형을 참조하세요.

DB 인스턴스의 메모리가 4GB뿐인 경우 innodb_buffer_pool_size를 8GB로 설정할 수 없지만 다른 파라미터에 할당한 메모리 양에 따라 3GB로 설정할 수 있습니다.

입력한 값이 너무 크면 Amazon RDS는 값을 다음 한도까지 낮춥니다.

  • 마이크로 DB 인스턴스 클래스: 256MB

  • db.t4g 마이크로 DB 인스턴스 클래스: 128MB