Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
為什麼我的 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 檔案的名稱。
相關資訊
相關內容
- 已提問 2 年前
- 已提問 3 年前
- 已提問 2 年前

