Amazon RDS for Oracle DB 인스턴스용 테이블스페이스 크기를 조정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 11월 3일

Amazon Relational Database Service(Amazon RDS) for Oracle DB 인스턴스용 테이블스페이스를 관리하거나 크기를 조정하는 방법을 알고 싶습니다.

간략한 설명

Amazon RDS for Oracle DB 인스턴스용 기본 테이블스페이스 유형은 bigfile입니다. bigfile 테이블스페이스는 사용자에게 datafile의 투명성을 유지합니다. 따라서 각 기본 datafile을 관리하는 대신 테이블스페이스에 대한 작업을 직접 수행할 수 있습니다. bigfile 테이블스페이스는 새 datafile을 추가하거나 여러 파일을 처리할 필요가 없으므로 datafile 관리를 간소화합니다. RDS for Oracle 인스턴스용 smallfile 테이블스페이스를 사용하지 않는 것이 가장 좋습니다.

RDS for Oracle 인스턴스에 smallfile 테이블스페이스가 있는 경우 다음과 같은 제약을 받게 됩니다.

  • datafile의 크기를 조정할 수 없습니다. 그러나 테이블스페이스에 새 datafile을 추가하여 테이블스페이스의 크기를 조정할 수 있습니다.
  • ALTER DATABASE 쿼리를 실행하여 datafile 구성의 크기를 조정하거나 변경할 수 없습니다. 이는 RDS for Oracle에서 ALTER DATABASE 명령이 지원되지 않기 때문입니다. 자세한 내용은 RDS for Oracle 제한 사항을 참조하세요.
  • 데이터베이스에 있는 최대 datafile 수를 정의하려면 db_files 파라미터를 수동으로 관리해야 합니다. datafile 수가 이 제한에 도달하면 db_files를 조정해야 할 수 있습니다.

기본적으로 RDS for Oracle의 테이블스페이스는 AUTOEXTEND이 켜진 bigfile입니다. bigfile 테이블스페이스의 최대 크기는 16TiB입니다. 테이블스페이스에 데이터를 삽입하면 테이블스페이스는 필요에 따라 해당 테이블스페이스에 대해 구성된 최대 한도 또는 RDS 인스턴스에 대해 구성된 할당된 스토리지(둘 중 더 작은 값)까지 증가합니다. RDS 인스턴스에 할당된 스토리지가 모두 사용되면 인스턴스가 STORAGE_FULL 상태로 전환되고 테이블스페이스를 확장할 수 없습니다. 이 문제를 해결하려면 인스턴스에 스토리지 공간을 추가해야 합니다. 자세한 내용은 Amazon RDS DB 인스턴스에 스토리지가 부족할 때 발생하는 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요.

테이블스페이스에서 데이터를 삭제해도 테이블스페이스의 크기는 줄어들지 않습니다. 새 데이터를 삽입할 때 빈 블록을 다시 사용할 수 있습니다. 사용되지 않은 공간을 회수하려면 테이블스페이스의 크기를 수동으로 조정해야 합니다.

해결 방법

RDS for Oracle 인스턴스의 테이블스페이스 크기를 조정하려면 다음을 수행합니다.

  1. 테이블스페이스의 구성을 확인합니다.
  2. 사용 사례에 따라 테이블스페이스의 크기를 늘리거나 줄입니다.

테이블스페이스의 구성 확인

1.    다음과 유사한 쿼리를 실행하여 테이블스페이스가 다음인지 확인합니다.

  • permanent, undo 또는 temporary
  • smallfile 또는 bigfile
SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

2.    다음과 유사한 쿼리를 실행하여 autoextend 기능이 켜져 있는지, datafile의 현재 크기 및 구성된 최대 한도를 확인합니다.

permanent 및 undo 테이블스페이스:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

temporary 테이블스페이스:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

이러한 쿼리의 출력에서 다음을 확인할 수 있습니다.

  • autoextend 기능이 켜져 있지 않으면 MAX_GB의 값은 0입니다.
  • 테이블스페이스가 smallfile인 경우 MAX_GB의 값은 테이블스페이스를 생성하는 데 사용된 블록 크기에 따라 달라집니다. 예를 들어 사용된 블록 크기가 8K인 경우 MAX_GB의 값은 32GB입니다. 자세한 내용은 비표준 블록 크기에 대한 Oracle 문서를 참조하세요.
  • 테이블스페이스가 bigfile인 경우 MAX_GB 값은 32TB로 표시됩니다. 그러나 RDS for Oracle의 OS 제한으로 인해 파일은 최대 16TiB까지만 확장할 수 있습니다.

선택적으로 다음 쿼리를 실행하여 테이블스페이스를 생성하는 데 사용되는 DDL을 가져올 수 있습니다.

SQL> SET LINESIZE 400
SQL> SET LONG 99999
SQL> SELECT DBMS_METADATA.GET_DDL('TABLESPACE','example-tablespace') FROM DUAL;

반환된 DDL에서 테이블스페이스에 대한 필수 정보를 가져올 수 있습니다.

테이블스페이스 크기 늘리기

autoextend 기능을 설정한 경우 테이블스페이스 유형에 관계없이 테이블스페이스의 크기를 늘릴 필요가 없습니다. 이 경우 테이블스페이스의 크기가 필요에 따라 자동으로 조정됩니다.

autoextend 기능을 켜지 않은 상태에서 테이블스페이스의 크기를 조정하려면 다음을 수행합니다.

bigfile 테이블스페이스: ALTER TABLESPACE 명령을 사용하여 테이블스페이스의 크기를 조정합니다. 크기는 킬로바이트(K), 메가바이트(M), 기가바이트(G) 또는 테라바이트(T) 단위로 지정할 수 있습니다. bigfile 테이블스페이스에는 단일 datafile이 있으며 이 명령은 테이블스페이스와 연관된 기본 단일 datafile의 크기를 조정합니다.

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

smallfile 테이블스페이스: 테이블스페이스에 더 많은 datafile을 추가해야만 테이블스페이스의 크기를 조정할 수 있습니다. 현재 datafile의 크기를 조정하거나 구성을 수정할 수 없습니다.

SQL> ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;

테이블스페이스 크기 줄이기

테이블스페이스가 smallfile이면 기본 datafile을 관리할 수 없습니다. 테이블스페이스 크기를 늘리려면 새 datafile을 추가합니다. 새 datafile을 추가할 때 AUTOEXTEND, SIZE 및 MAXSIZE에 적합한 값을 선택해야 합니다. 이러한 값은 나중에 변경할 수 없습니다. smallfile 테이블스페이스의 크기를 줄이려면 원하는 공간으로 새 테이블스페이스를 생성하고 모든 데이터를 수동으로 새 테이블스페이스로 이동합니다.

테이블스페이스가 bigfile인 경우 다음 방법 중 하나를 선택하여 테이블스페이스의 데이터 유형에 따라 테이블스페이스 크기를 줄입니다.

permanent 테이블스페이스: permanent 테이블스페이스의 크기를 테이블스페이스의 하이 워터마크보다 작은 값으로 줄일 수 없습니다. 이렇게 하려고 하면 크기 조정 작업이 실패하고 다음 오류가 발생합니다.

ORA-03297: file contains used data beyond requested RESIZE value

그러나 테이블스페이스의 크기가 50GB이고 하이 워터마크가 40GB라고 가정합니다. 그런 다음 다음과 유사한 쿼리를 실행하여 테이블스페이스의 크기를 40GB로 줄일 수 있습니다.

SQL> ALTER TABLESPACE example-tablespace RESIZE 40G;

테이블스페이스의 크기를 하이 워터마크보다 작은 값으로 줄일 수는 없습니다. 이 경우 다음 중 하나를 수행할 수 있습니다.

  • 테이블스페이스에서 객체를 재구성합니다.
  • 새 테이블스페이스를 생성하고 모든 객체를 새 테이블스페이스로 마이그레이션합니다. 그런 다음 이전 테이블스페이스를 삭제합니다.

temporary 테이블스페이스: SHRINK 명령을 사용하여 temporary 테이블스페이스의 크기를 줄일 수 있습니다.

예:

SQL> ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

읽기 전용 복제본에서 temporary 테이블스페이스의 크기를 조정하려면 rdsadmin.rdsadmin_util.resize_temp_tablespace 패키지를 사용합니다.

SQL> EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('example-tablespace','100M');

자세한 내용은 읽기 전용 복제본의 temporary 테이블스페이스 크기 조정을 참조하세요.

-또는-

원하는 크기로 다른 temporary 테이블스페이스를 생성한 다음 이 새 temporary 테이블스페이스를 기본 temporary 테이블스페이스로 설정할 수 있습니다.

1.    다음 쿼리를 실행하여 현재 기본 temporary 테이블스페이스를 봅니다.

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

2.    다음 쿼리를 실행하여 새 temporary 테이블스페이스를 생성합니다.

SQL> CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;

3.    다음 쿼리를 실행하여 새 temporary 테이블스페이스를 기본 temporary 테이블스페이스로 설정합니다.

SQL> EXEC RDSADMIN.RDSADMIN_UTIL.ALTER_DEFAULT_TEMP_TABLESPACE(TABLESPACE_NAME => 'example-tablespace');

특정 사용자에 대한 temporary 테이블스페이스를 수정하려면 다음을 수행합니다.

1.    다음 쿼리를 실행하여 사용자의 현재 기본 temporary 테이블스페이스를 봅니다.

SQL>  SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';

2.    다음 쿼리를 실행하여 사용자의 기본 temporary 테이블스페이스를 변경합니다.

SQL> ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

undo 테이블스페이스: 먼저 ALTER TABLESPACE 명령을 사용하여 undo 테이블스페이스의 크기를 줄입니다.

다음 쿼리를 실행하여 현재 사용 중인 undo 테이블스페이스를 식별합니다.

SQL> SHOW PARAMETER UNDO_TABLESPACE;

다음과 유사한 질의를 실행하여 undo 테이블스페이스의 크기를 줄입니다.

SQL> ALTER TABLESPACE example-tablespace RESIZE 500M;

스토리지에 제거해야 하는 undo 세그먼트가 없는 경우 이 쿼리가 성공적으로 실행됩니다.

위 쿼리가 성공적으로 실행되지 않으면 다음을 수행합니다.

1.    새 undo 테이블스페이스를 생성합니다.

다음과 유사한 쿼리를 실행하여 새 undo 테이블스페이스를 생성합니다.

SQL> CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;

2.    새로 생성된 테이블스페이스를 기본 undo 테이블스페이스로 설정합니다.

새로 생성된 테이블스페이스를 가리키도록 파라미터 그룹에서 UNDO_TABLESPACE 초기화 파리미터를 설정합니다. 자세한 내용은 DB 파라미터 그룹의 파라미터 수정을 참조하세요.

예:

UNDO_TABLESPACE = example-new-tablespace

이 파라미터는 동적 파라미터이므로 수정 사항을 적용하는 데 가동 중지 시간이 발생하지 않습니다. 하지만 이 변경 후에는 DB 인스턴스를 재부팅하는 것이 가장 좋습니다. 자세한 내용은 undo 관리를 참조하세요.

다음 쿼리를 실행하여 새 undo 테이블스페이스가 기본 테이블스페이스인지 확인합니다.

SQL> SHOW PARAMETER UNDO_TABLESPACE;

3.    이전 undo 테이블스페이스를 삭제합니다.

다음과 유사한 쿼리를 실행하여 이전 undo 테이블스페이스를 삭제합니다.

SQL> DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;