Amazon RDS for Oracle DB 인스턴스가 예상보다 많은 스토리지를 사용하는 이유는 무엇입니까?
Amazon Relational Database Service(Amazon RDS) for Oracle DB 인스턴스에서 예상보다 많은 공간을 사용합니다. 인스턴스에서 공간을 확보할 수 있는지 알고 싶습니다.
간략한 설명
여러 구성 요소에서 Amazon RDS for Oracle 인스턴스용 스토리지를 사용합니다. 이러한 구성 요소로는 테이블 스페이스, 아카이브 로그, 로그 파일, 온라인 재실행 로그 파일, 데이터 펌프 파일이 있습니다.
인스턴스에서 스토리지 증가를 관리하려면 다음 작업을 수행하여 구성 요소가 사용하는 스토리지 공간의 양을 파악하십시오.
- 임시 테이블스페이스와 같은 객체를 포함한 모든 테이블스페이스의 데이터에 할당된 공간의 양을 찾습니다.
- 아카이브 로그 또는 추적 파일의 공간 할당을 확인합니다.
- 데이터 펌프 디렉터리의 공간 할당을 확인합니다.
참고: RDS 인스턴스에 할당된 스토리지 공간은 데이터 볼륨을 나타냅니다. 인스턴스를 만들면 Amazon RDS에서 할당된 스토리지를 데이터 볼륨에 매핑합니다. 이 프로세스에서는 물리적 스토리지 볼륨 외에 파일 시스템을 생성하기 위해 원시 디스크 공간을 적은 비율을 사용합니다.
해결 방법
아카이브 로그 디렉터리 생성
아카이브 로그 디렉터리를 생성하려면 다음 SQL 코드를 실행합니다.
EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;
테이블스페이스에서 데이터에 할당된 공간의 양 찾기
Oracle 데이터베이스의 여러 구성 요소에 할당된 공간의 분포를 확인하려면 다음 SQL 코드를 실행합니다.
SET pages 200 SELECT '===========================================================' || CHR(10) || 'Total Database Physical Size = ' || ROUND(redolog_size_gib + dbfiles_size_gib + tempfiles_size_gib + archlog_size_gib + ctlfiles_size_gib, 2) || ' GiB' || CHR(10) || '===========================================================' || CHR(10) || ' Redo Logs Size : ' || ROUND(redolog_size_gib, 3) || ' GiB' || CHR(10) || ' Data Files Size : ' || ROUND(dbfiles_size_gib, 3) || ' GiB' || CHR(10) || ' Temp Files Size : ' || ROUND(tempfiles_size_gib, 3) || ' GiB' || CHR(10) || ' Archive Log Size : ' || ROUND(archlog_size_gib, 3) || ' GiB' || CHR(10) || ' Control Files Size : ' || ROUND(ctlfiles_size_gib, 3) || ' GiB' || CHR(10) || '===========================================================' || CHR(10) || ' Used Database Size : ' || used_db_size_gib || ' GiB' || CHR(10) || ' Free Database Size : ' || free_db_size_gib || ' GiB' || CHR(10) || ' Data Pump Directory Size : ' || dpump_db_size_gib || ' GiB' || CHR(10) || ' BDUMP Directory Size : ' || bdump_db_size_gib || ' GiB' || CHR(10) || ' ADUMP Directory Size : ' || adump_db_size_gib || ' GiB' || CHR(10) || '===========================================================' || CHR(10) || 'Total Size (including Dump and Log Files) = ' || ROUND(ROUND(redolog_size_gib, 2) + ROUND(dbfiles_size_gib, 2) + ROUND(tempfiles_size_gib, 2) + ROUND(archlog_size_gib, 2) + ROUND(ctlfiles_size_gib, 2) + ROUND(adump_db_size_gib, 2) + ROUND(dpump_db_size_gib, 2) + ROUND(bdump_db_size_gib, 2), 2) || ' GiB' || CHR(10) || '===========================================================' AS summary FROM (SELECT sys_context('USERENV', 'DB_NAME') db_name, (SELECT SUM(bytes) / 1024 / 1024 / 1024 redo_size FROM (SELECT bytes FROM v$log UNION ALL SELECT bytes FROM v$standby_log)) redolog_size_gib, (SELECT SUM(bytes) / 1024 / 1024 / 1024 data_size FROM dba_data_files) dbfiles_size_gib, (SELECT NVL(SUM(bytes), 0) / 1024 / 1024 / 1024 temp_size FROM dba_temp_files) tempfiles_size_gib, (SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir('ARCHIVELOG_DIR'))) archlog_size_gib, (SELECT SUM(block_size * file_size_blks) / 1024 / 1024 / 1024 controlfile_size FROM v$controlfile) ctlfiles_size_gib, ROUND(SUM(used.bytes) / 1024 / 1024 / 1024, 3) db_size_gib, ROUND(SUM(used.bytes) / 1024 / 1024 / 1024, 3) - ROUND( free.f / 1024 / 1024 / 1024) used_db_size_gib, ROUND(free.f / 1024 / 1024 / 1024, 3) free_db_size_gib, (SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir('BDUMP'))) bdump_db_size_gib, (SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir('ADUMP'))) adump_db_size_gib, (SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR'))) dpump_db_size_gib FROM (SELECT bytes FROM v$datafile UNION ALL SELECT bytes FROM v$tempfile) used, (SELECT SUM(bytes) AS f FROM dba_free_space) free GROUP BY free.f);
Oracle 데이터베이스의 여러 사용자 디렉터리에 할당된 공간의 분포를 확인하려면 다음 명령을 실행합니다.
SET SERVEROUTPUT ON; DECLARE v_result NUMBER; v_directory_name VARCHAR2(100); BEGIN DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE('------------------------------'); DBMS_OUTPUT.PUT_LINE('ADDITIONAL DIRECTORY FOUND IN DATABASE'); DBMS_OUTPUT.PUT_LINE('------------------------------'); FOR rec IN (SELECT directory_name, directory_path FROM dba_directories WHERE directory_name NOT IN ('OPATCH_INST_DIR','JAVA$JOX$CUJS$DIRECTORY$','RDS$TEMP','DATA_PUMP_DIR','ADUMP','RDS$DB_TASKS','OPATCH_SCRIPT_DIR','OPATCH_LOG_DIR','BDUMP','SDO_DIR_WORK','SDO_DIR_ADMIN','BDUMP_A') ) LOOP v_directory_name := rec.directory_name; -- Output directory details EXECUTE IMMEDIATE 'SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir(''' || v_directory_name || '''))' INTO v_result; DBMS_OUTPUT.PUT_LINE('Directory Name: ' || rec.directory_name); DBMS_OUTPUT.PUT_LINE('Directory Path: ' || rec.directory_path); DBMS_OUTPUT.PUT_LINE('Total Size (GB) for ' || v_directory_name || ': ' || v_result); DBMS_OUTPUT.PUT_LINE('------------------------------'); END LOOP; END; /
기본적으로 Amazon RDS for Oracle DB 인스턴스의 경우 모든 테이블스페이스에 자동 확장을 사용하도록 설정되어 있습니다. 여기에는 데이터 테이블스페이스, 실행 취소 테이블스페이스 및 임시 테이블스페이스가 포함됩니다. 각 유형의 테이블스페이스는 더 많은 데이터를 수용하도록 확장됩니다. 테이블스페이스는 추가 스토리지가 필요하지 않거나 테이블이 할당된 스토리지 공간을 모두 사용할 때까지 확장됩니다.
테이블스페이스 크기 조정
데이터 테이블스페이스 및 실행 취소 테이블스페이스
데이터 테이블스페이스 및 실행 취소 테이블스페이스의 크기를 조정하려면 Amazon RDS for Oracle DB 인스턴스의 테이블스페이스 크기를 조정하려면 어떻게 해야 합니까?를 참조하십시오.
임시 테이블스페이스
임시 테이블스페이스의 크기를 조정하려면 다음 단계를 완료합니다.
-
임시 테이블스페이스 사용량에 대한 정보를 보려면 DBA_TEMP_FREE_SPACE 뷰에서 다음 명령을 실행합니다.
SELECT * FROM dba_temp_free_space; -
임시 테이블스페이스의 크기를 조정하려면 테이블스페이스 사용량 쿼리의 출력을 기반으로 다음 명령을 실행합니다.
ALTER TABLESPACE temp RESIZE 10G;참고: 10G를 조정하려는 크기로 바꾸십시오. 할당된 테이블스페이스가 10GB 임계값을 초과하면 이전 명령이 실패합니다.
-
이전 명령이 실패하는 경우 다음 명령을 실행하여 임시 테이블스페이스의 공간을 줄이십시오.
ALTER TABLESPACE temp SHRINK SPACE KEEP 10g; -
디스크에 활성 정렬을 수행하고 임시 세그먼트가 할당된 장기 실행 세션이 있는지 확인하려면 다음 명령을 실행합니다.
SELECT * FROM v$sort_usage; -
애플리케이션 로직에 따라 세션이 종료되는 경우 세션을 종료하십시오. 세션을 종료한 후 임시 테이블스페이스의 크기를 다시 조정하십시오.
세션을 종료할 수 없는 경우 새 임시 테이블스페이스를 만드십시오. 테이블스페이스를 만든 후에는 이를 기본 테이블스페이스로 설정하십시오.
그런 다음 앞서 있던 임시 테이블스페이스를 제거하십시오.SELECT property_name, property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE'; CREATE TEMPORARY TABLESPACE temp2; EXEC rdsadmin.rdsadmin_util.alter_default_temp_tablespace(tablespace_name => 'temp2'); SET pages 2000 COLUMN username FRO a30 SELECT username, TEMPORARY_TABLESPACE FROM dba_users; DROP TABLESPACE temp including contents and datafiles; -
DB 인스턴스 클래스에 NVMe 기반 SSD 스토리지가 있는 경우 인스턴스 저장소에 Oracle 임시 테이블스페이스를 생성하여 RDS 스토리지 공간을 절약하십시오. 자세한 내용은 RDS for Oracle 인스턴스 저장소에 임시 데이터 저장을 참조하십시오.
아카이브 로그 또는 추적 파일의 공간 할당 확인
다음 단계를 완료합니다.
-
현재 아카이브 로그 보존을 확인하려면 다음 SQL 명령을 실행합니다.
SELECT value FROM rdsadmin.rds_configuration WHERE name ='archivelog retention hours';참고: Amazon RDS for Oracle 인스턴스에서 아카이브 로그 보존은 기본적으로 0으로 설정되어 있습니다. 아카이브 로그가 Amazon S3에 업로드된 후 Amazon RDS는 기본 호스트에서 로그를 자동으로 삭제합니다. 아카이브 로그를 Oracle LogMiner 또는 GoldenGate와 같은 다른 서비스에서 사용하려면 아카이브 로그 보존 기간을 늘리십시오.
-
기본 호스트에서 아카이브 로그가 사용하는 공간을 계산합니다.
먼저 다음 명령을 실행하여 아카이브 로그 디렉터리를 생성합니다.EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;그런 다음 아래의 명령을 실행하여 RDS 인스턴스에서 아카이브 로그가 사용하는 공간의 양을 확인합니다.
SELECT SUM(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR')); -
할당된 공간이 예상보다 많으면 보존 정책 값을 업데이트합니다. 그런 다음 Amazon RDS 자동화를 통해 이전 아카이브 로그 파일을 지우도록 허용합니다.
다음 예시 명령은 아카이브 로그를 24시간 동안 유지하도록 구성된 RDS for Oracle 인스턴스를 구성합니다.BEGIN rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24'); END; / COMMIT;
자세한 내용은 추적 파일 제거를 참조하십시오.
데이터 펌프 디렉터리의 공간 할당 확인
다음 단계를 완료합니다.
-
데이터 펌프 디렉터리에 할당된 공간이 예상보다 많은 경우 제거할 수 있는 .dmp 파일을 찾습니다. 다음 명령을 실행합니다.
SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY mtime; -
위 명령으로 .dmp 파일을 찾은 경우 각 파일에 대해 다음 명령을 실행하여 삭제합니다.
EXEC utl_file.fremove('DATA_PUMP_DIR', 'file_name');참고: 위의 명령에서 file_name을 .dmp 파일의 이름으로 바꾸십시오.

