為什麼我的 Amazon RDS for Oracle 資料庫執行個體所使用的儲存空間超出預期?

4 分的閱讀內容
0

我擁有 Amazon Relational Database Service (Amazon RDS) for Oracle 資料庫執行個體,但其使用的空間超出我的預期。我想知道我是否可以釋放執行個體上的空間。

簡短描述

多個元件使用 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 資料庫執行個體會為所有資料表空間啟用自動擴充。這包含資料表空間、復原資料表空間,以及暫存資料表空間。每種類型的資料表空間都會擴大以容納更多資料。您的資料表空間會持續擴大,直到您不再需要更多儲存空間,或直到資料表使用完所有已分配的儲存空間為止。

調整資料表空間的大小

資料表空間和復原資料表空間

若要調整資料表空間和復原資料表空間的大小,請參閱如何調整 Amazon RDS for Oracle 資料庫執行個體的資料表空間大小?

暫存資料表空間

若要調整暫存資料表空間的大小,請完成下列步驟:

  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. 如果您的資料庫執行個體類別具有 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。將封存日誌上傳至 Amazon S3 後,Amazon RDS 會自動從基礎主機中刪除日誌。若要將封存日誌與其他服務 (例如Oracle LogMiner 或 GoldenGate) 搭配使用,請延長封存日誌保留期限

  2. 計算封存日誌在基礎主機上使用的空間。
    首先,執行以下命令建立封存日誌目錄:

    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'));
  3. 如果分配的空間超出您的預期,請更新保留期限政策值。然後,允許 Amazon RDS 自動化清除較舊的封存日誌檔案。
    下列範例將 RDS for Oracle 執行個體設為保留 24 小時的封存日誌:

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

如需詳細資訊,請參閱清除追蹤檔案

檢查資料幫浦目錄的空間分配

請完成下列步驟:

  1. 如果資料幫浦目錄的已分配空間超出您的預期,請尋找可移除的 .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 資料庫執行個體的儲存空間

終止工作階段

監控 Amazon RDS 執行個體中的指標

Amazon RDS 資料庫執行個體儲存空間不足