Amazon RDS for Oracle DB 인스턴스가 예상보다 많은 스토리지를 사용하는 이유는 무엇입니까?

최종 업데이트 날짜: 2022년 9월 20일

Amazon Relational Database Service(RDS) for Oracle DB 인스턴스를 가지고 있지만 예상보다 많은 공간을 사용합니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

임시 테이블 공간은 데이터베이스 기능에 필요한 작업을 수용하기 위해 크게 증가할 수 있습니다. Amazon RDS for Oracle DB 인스턴스는 모든 테이블스페이스에 대해 자동 확장이 활성화된 상태로 생성됩니다. 즉, 더 이상 스토리지가 필요하지 않거나 할당된 스토리지 공간을 사용할 때까지 각 테이블 스페이스가 더 많은 데이터를 수용하기 위해 커집니다.

테이블스페이스의 예기치 않은 사용 문제를 해결하려면 다음 단계를 수행하십시오.

  1. 테이블스페이스의 데이터에 할당된 공간의 양을 찾습니다.
  2. 아카이브 로그 또는 추적 파일에 대한 공간 할당을 확인합니다.
  3. 데이터 펌프 디렉터리에 대한 공간 할당을 확인합니다.

해결 방법

테이블스페이스의 데이터에 할당된 공간 크기 찾기

1.    Oracle 데이터베이스의 여러 구성 요소에 할당된 공간의 확산을 확인합니다.

set pages 200
select
'===========================================================' || chr(10) ||
'Total Database Physical Size = ' || round(redolog_size_gb+dbfiles_size_gb+tempfiles_size_gb+ctlfiles_size_gb,2) || ' GB' || chr(10) ||
'===========================================================' || chr(10) ||
' Redo Logs Size : ' || round(redolog_size_gb,3) || ' GB' || chr(10) ||
' Data Files Size : ' || round(dbfiles_size_gb,3) || ' GB' || chr(10) ||
' Temp Files Size : ' || round(tempfiles_size_gb,3) || ' GB' || chr(10) ||
' Archive Log Size - Approx only : ' || round(archlog_size_gb,3) || ' GB' || chr(10) ||
' Control Files Size : ' || round(ctlfiles_size_gb,3) || ' GB' || chr(10) ||
'===========================================================' || chr(10) ||
' Used Database Size : ' || used_db_size_gb || ' GB' || chr(10) ||
' Free Database Size : ' || free_db_size_gb || ' GB' ||chr(10) ||
' Data Pump Directory Size : ' || dpump_db_size_gb || ' GB' || chr(10) ||
' BDUMP Directory Size : ' || bdump_db_size_gb || ' GB' || chr(10) ||
' ADUMP Directory Size : ' || adump_db_size_gb || ' GB' || chr(10) ||
'===========================================================' || chr(10) ||
'Total Size (including Dump and Log Files) = ' || round(round(redolog_size_gb,2) +round(dbfiles_size_gb,2)+round(tempfiles_size_gb,2)+round(ctlfiles_size_gb,2) +round(adump_db_size_gb,2) +round(dpump_db_size_gb,2)+round(bdump_db_size_gb,2),2) || ' GB' || chr(10) ||
'===========================================================' as summary
FROM (SELECT sys_context('USERENV', 'DB_NAME')
db_name,
(SELECT SUM(bytes) / 1024 / 1024 / 1024 redo_size
FROM v$log)
redolog_size_gb,
(SELECT SUM(bytes) / 1024 / 1024 / 1024 data_size
FROM dba_data_files)
dbfiles_size_gb,
(SELECT nvl(SUM(bytes), 0) / 1024 / 1024 / 1024 temp_size
FROM dba_temp_files)
tempfiles_size_gb,
(SELECT SUM(blocks * block_size / 1024 / 1024 / 1024) size_gb
FROM v$archived_log
WHERE first_time >= SYSDATE - (
(SELECT value
FROM rdsadmin.rds_configuration
WHERE name =
'archivelog retention hours') /
24 ))
archlog_size_gb,
(SELECT SUM(block_size * file_size_blks) / 1024 / 1024 / 1024
controlfile_size
FROM v$controlfile)
ctlfiles_size_gb,
round(SUM(used.bytes) / 1024 / 1024 / 1024, 3)
db_size_gb,
round(SUM(used.bytes) / 1024 / 1024 / 1024, 3) - round(
free.f / 1024 / 1024 / 1024)
used_db_size_gb,
round(free.f / 1024 / 1024 / 1024, 3)
free_db_size_gb,
(SELECT round(SUM(filesize) / 1024 / 1024 / 1024, 3)
FROM TABLE(rdsadmin.rds_file_util.listdir('BDUMP')))
bdump_db_size_gb,
(SELECT round(SUM(filesize) / 1024 / 1024 / 1024, 3)
FROM TABLE(rdsadmin.rds_file_util.listdir('ADUMP')))
adump_db_size_gb,
(SELECT round(SUM(filesize) / 1024 / 1024 / 1024, 3)
FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')))
dpump_db_size_gb
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);

임시 테이블스페이스에 할당된 공간이 예상보다 크면 다음 쿼리를 사용하여 데이터베이스에 사용된 공간을 추가로 분석합니다.

2.    임시 테이블스페이스 사용에 대한 정보를 보려면 DBA_TEMP_FREE_SPACE 보기에서 이 쿼리를 실행합니다.

SQL> SELECT * FROM dba_temp_free_space;

3.    임시 테이블스페이스의 크기를 조정하려면(예: 10GB) 테이블스페이스 사용량 쿼리의 출력에 따라 이 쿼리를 실행합니다.

SQL> ALTER TABLESPACE temp RESIZE 10g;

테이블스페이스가 10GB 임계값을 초과하여 확장 할당한 경우 이 명령이 실패할 수 있습니다.

4.    명령이 실패하면 이 명령을 실행하여 임시 테이블스페이스의 공간을 축소합니다.

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;

5.    디스크에 대한 활성 정렬을 수행하고 임시 세그먼트가 할당되어 있는 장기 실행 세션을 확인합니다. 이렇게 하려면 다음 쿼리를 실행합니다.

SQL> SELECT * FROM v$sort_usage;

6.    애플리케이션 로직 및 비즈니스에서 허용하는 경우 출력을 기반으로 세션을 종료할 수 있습니다. 그런 다음 3단계에 따라 임시 테이블스페이스의 크기를 다시 조정합니다.

7.    종료 세션이 옵션이 아닌 경우 새 임시 테이블스페이스를 생성합니다. 그런 다음 새 테이블스페이스를 기본값으로 설정하고, 이전 임시 테이블스페이스를 삭제합니다.

SQL> SELECT property_name,property_value FROM DATABASE_PROPERTIES where PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
SQL> create temporary tablespace temp2;
SQL> exec rdsadmin.rdsadmin_util.alter_default_temp_tablespace(tablespace_name => 'temp2');
<wait for a few minutes and verify if the default temporary tablespace for all users have been updated>
SQL> set pages 2000
SQL> column username for a30
SQL> select username, TEMPORARY_TABLESPACE from dba_users;
SQL> drop tablespace temp including contents and datafiles;

아카이브 로그 또는 추적 파일에 대한 공간 할당 확인

1.    현재 아카이브 로그 보존을 확인합니다.

SELECT value FROM rdsadmin.rds_configuration WHERE name ='archivelog retention hours';

2.    이 쿼리를 실행하여 아카이브 로그에 사용되는 공간을 계산합니다.

참고: X는 RDS for Oracle 인스턴스에 설정된 아카이브 로그 보존입니다. X를 이전 쿼리에서 보고된 값으로 바꿉니다.

SELECT sum(blocks*block_size)/1024/1024/1024 FROM v$archived_log WHERE first_time >=sysdate-X/24 AND dest_id=1;

3.    아카이브 로그에 할당된 공간이 예상보다 많으면 보존 정책 값을 업데이트합니다. 그런 다음 Amazon RDS 자동화를 통해 이전 아카이브 로그 파일을 지우도록 허용할 수 있습니다. 이 예제에서는 24시간 동안 아카이브 로그를 보존하도록 RDS for Oracle 인스턴스를 구성합니다.

begin
 rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24');
end;
 /
commit;

추적 파일 나열 및 제거에 대한 자세한 내용은 추적 파일 제거를 참조하십시오.

데이터 펌프 디렉터리에 대한 공간 할당 확인

1.    데이터 펌프 디렉터리에 할당된 공간이 예상보다 크면 공간을 확보하기 위해 제거할 수 있는 사용 가능한.dmp 파일을 찾습니다.

SQL> SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER by mtime;

2.    이 쿼리에서 .dmp 파일을 찾으면 이 쿼리를 실행하여 삭제하십시오. 파일 이름을 .dmp 파일의 이름으로 변경합니다.

SQL> EXEC utl_file.fremove('DATA_PUMP_DIR','[file name]');