為什麼我的 Amazon RDS for Oracle 資料庫執行個體所使用的儲存空間超出預期?
我擁有 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 資料庫執行個體的資料表空間大小?
暫存資料表空間
若要調整暫存資料表空間的大小,請完成下列步驟:
-
若要查看暫存資料表空間使用情況的相關資訊,請在 DBA_TEMP_FREE_SPACE 檢視上執行以下命令:
SELECT * FROM dba_temp_free_space;
-
若要調整暫存資料表空間的大小,請根據資料表空間使用情況查詢的輸出執行下列命令:
ALTER TABLESPACE temp RESIZE 10G;
**注意:**將 10G 替換為您要調整大小的數量。當分配的資料表空間超過 10 GB 閾值時,上述命令將失敗。
-
如果上一個命令失敗,請執行下列命令以減少暫存資料表空間中的空間:
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;
-
如果您的資料庫執行個體類別具有 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 自動化清除較舊的封存日誌檔案。
下列範例將 RDS for Oracle 執行個體設為保留 24 小時的封存日誌: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 檔案的名稱。
相關資訊

相關內容
- 已提問 1 年前lg...
- 已提問 2 年前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 6 個月前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 10 個月前
- AWS 官方已更新 4 個月前
- AWS 官方已更新 3 年前