スキップしてコンテンツを表示

Amazon RDS for Oracle DB インスタンスが想定よりも多くのストレージを使用している理由を教えてください。

所要時間5分
0

使用している Amazon Relational Database Service (Amazon RDS) for Oracle DB インスタンスが、想定よりも多くのスペースを消費しています。インスタンスの空き容量を増やせるかどうかを判断したいです。

簡単な説明

複数のコンポーネントが Amazon RDS for Oracle インスタンスのストレージを使用します。これらのコンポーネントには、テーブルスペース、アーカイブログ、ログファイル、オンライン redo ログファイル、Data Pump ファイルなどがあります。

インスタンスでのストレージ消費量の増加に対処するには、次の手順を実行してコンポーネントが使用するストレージ容量を確認します。

  • 一時テーブルスペースなどのオブジェクトを含む、すべてのテーブルスペースのデータに割り当てられているスペースの量を調べます。
  • アーカイブログやトレースファイルに割り当てられた容量を確認します。
  • Data Pump ディレクトリに割り当てられた容量を確認します。

注: RDS インスタンスに割り当てられたストレージスペースが、データボリュームを表します。インスタンスを作成すると、Amazon RDS は割り当てられたストレージをデータボリュームにマッピングします。このプロセスでは、未フォーマットディスク領域のごく一部を使用して物理ストレージボリューム以外のファイルシステムも作成します。

解決策

archivelog ディレクトリを作成する

archivelog ディレクトリを作成するには、次の 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 インスタンスでは、すべてのテーブルスペースで auto-extend が有効です。これには、データテーブルスペース、UNDO テーブルスペース、一時テーブルスペースが含まれます。各タイプのテーブルスペースは、より多くのデータに対応するために容量を増加させます。テーブルスペースは、追加のストレージが必要なくなるか、テーブルが割り当てられたストレージスペースをすべて使用するまで拡大します。

テーブルスペースのサイズを変更する

データ用テーブルスペースと undo テーブルスペース

データ用テーブルスペースのサイズを変更する方法については、「Amazon RDS for Oracle DB インスタンスでテーブルスペースのサイズを変更する方法を教えてください」を参照してください。

一時テーブルスペース

一時テーブルスペースのサイズを変更するには、次の手順を実行します。

  1. 一時テーブルスペースの使用状況に関する情報を確認するには、DBA_TEMP_FREE_SPACE ビューで次のコマンドを実行します。

    SELECT * FROM dba_temp_free_space;
  2. 一時テーブルスペースのサイズを変更するには、テーブルスペースの使用状況クエリの出力に基づいて次のコマンドを実行します。

    ALTER TABLESPACE temp RESIZE 10G;

    注: 10G は、リサイズする目標容量に置き換えます。割り当てられたテーブルスペースが 10 GB のしきい値を超えている場合、上記のコマンドは失敗します。

  3. 上記のコマンドを実行できない場合は、次のコマンドを実行して一時テーブルスペースの容量を減らします。

    ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;
  4. ディスクへのアクティブなソートを実行しており、一時セグメントが割り当てられている長時間実行中のセッションがないか確認するには、次のコマンドを実行します。

    SELECT * FROM v$sort_usage;
  5. アプリケーションロジックでセッションを終了できる場合は、そのセッションを終了してください。セッションを終了した後、一時テーブルスペースのサイズ変更を再試行します。
    セッションを終了できない場合は、新しい一時テーブルスペースを作成してください。テーブルスペースを作成した後、そのテーブルスペースをデフォルトのテーブルスペースとして設定します。
    次に、以前の一時テーブルスペースを削除します。

    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;
  6. DB インスタンスクラスに NVMe ベースの SSD ストレージがある場合は、インスタンスストアに Oracle 一時テーブルスペースを作成して RDS ストレージスペースを節約します。詳細については、「RDS for Oracle インスタンスストアに一時データを格納する」を参照してください。

アーカイブログまたはトレースファイルのスペース割り当てを確認する

次の手順を実行します。

  1. 現在のアーカイブログの保持期間を確認するには、次の SQL コマンドを実行します。

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

    注: Amazon RDS for Oracle インスタンスでは、アーカイブログの保持期間はデフォルトで 0 に設定されています。archivelogs を Amazon S3 にアップロードすると、Amazon RDS はそのログを基盤ホストから自動的に削除します。Oracle LogMiner や GoldenGate などの他のサービスで archivelogs を使用するには、アーカイブログの保持期間を延長します。

  2. archivelogs が基盤ホスト上で消費する容量を計算します。
    まず、次のコマンドを実行して archivelog ディレクトリを作成します。

    EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

    次に以下のコマンドを実行し、archivelog が RDS インスタンスで使用している容量を判定します。

    SELECT SUM(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR'));
  3. 割り当てられたスペースが想定よりも大きくなった場合は、保持ポリシーの値を更新してください。次に、Amazon RDS オートメーションで古いアーカイブログファイルを消去できるようにします。
    次のコマンド例では、RDS for Oracle インスタンスがアーカイブログを 24 時間分保持するように設定しています。

    BEGIN rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24');  
    END;   
    /  
    COMMIT;

詳細については、「トレースファイルの削除」を参照してください。

Data Pump ディレクトリのスペース割り当てを確認する

次の手順を実行します。

  1. Data Pump ディレクトリの割り当てスペースが想定よりも大きくなった場合は、削除できる .dmp ファイルを特定します。次のコマンドを実行します。

    SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY mtime;
  2. 上記のコマンドで .dmp ファイルが見つかった場合は、ファイルごとに次のコマンドを実行して削除します。

    EXEC utl_file.fremove('DATA_PUMP_DIR', 'file_name');

    注: 上記のコマンドでは、file_name を実際の .dmp ファイルに置き換えます。

関連情報

Amazon RDS DB インスタンス用のストレージの操作方法

セッションの破棄

Amazon RDS インスタンスのモニタリングメトリクス

ストレージが不足している Amazon RDS DB インスタンス

コメントはありません

関連するコンテンツ