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

4 分的閱讀內容
0

我擁有 Amazon Relational Database Service (Amazon RDS) for Oracle 資料庫執行個體,但其使用的空間超出我的預期。

簡短說明

各種元件可以使用 Amazon RDS for Oracle 執行個體的基礎儲存體。這些元件包含表格空間、保存日誌、日誌檔、線上重做日誌檔,以及資料泵檔案。

若要管理執行個體的儲存體成長,請識別元件使用多少儲存空間:

1.    尋找已配置給所有表格空間 (包括暫時表格空間) 中資料的空間量。

2.    檢查保存日誌或追蹤檔的空間配置。

3.    檢查資料泵目錄的空間配置。

**注意事項:**RDS 執行個體的已配置儲存體代表資料磁碟區。建立執行個體時,Amazon RDS 會將已配置儲存體對映至資料磁碟區。本程序還會使用一小部分的原始磁碟空間,在實體儲存磁碟區上建立檔案系統。

解決方案

在表格空間中找到已配置給資料的空間量

若要確定配置給 Oracle 資料庫不同元件的空間分布,請使用下列查詢:

set pages 200
select
'===========================================================' || chr(10) ||
'Total Database Physical Size = ' || round(redolog_size_gib+dbfiles_size_gib+tempfiles_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 - Approx only : ' || 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(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 v$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 SUM(blocks * block_size / 1024 / 1024 / 1024) size_gib
FROM v$archived_log
WHERE first_time >= SYSDATE - (
(SELECT value
FROM rdsadmin.rds_configuration
WHERE name =
'archivelog retention hours') /
24 ))
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);

依預設,Amazon RDS for Oracle 資料庫執行個體的所有表格空間都會啟用 auto-extend。這包含資料表格空間、UNDO 表格空間,以及暫時表格空間。這表示每個表格空間都會增加以容納更多資料。此功能會繼續執行,直到您不再需要更多儲存體或使用所有已配置儲存空間為止。

調整表格空間的大小

資料表格空間和 UNDO 表格空間

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

暫時表格空間

1.    若要檢視暫時表格空間用量的相關資訊,請在 DBA_TEMP_FREE_SPACE 視圖上執行下列查詢:

SQL> SELECT * FROM dba_temp_free_space;

2.    若要調整暫時表格空間的大小 (例如,調整為 10 GB),請根據表格空間用量查詢的輸出執行下列查詢:

SQL> ALTER TABLESPACE temp RESIZE 10g;

如果已配置表格空間超過 10 GB 閾值,則此命令可能會失敗。

3.    如果命令失敗,請壓縮暫時表格空間上的空間:

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;

4.    檢查是否有長時間執行的工作階段,這些工作階段會對磁碟執行作用中排序,並配置暫時區段。若要這麼做,請執行下列查詢:

SQL> SELECT * FROM v$sort_usage;

5.    如果應用程式邏輯和業務允許您結束工作階段,您可以結束工作階段。然後,根據步驟 2 所示,再次調整暫時表格空間的大小。

6.    如果無法結束工作階段,請建立新的暫時表格空間。然後,將新的表格空間設為預設表格空間,並捨棄舊的暫時表格空間:

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.    檢查目前的保存日誌保留:

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.    計算保存日誌在基礎主機上使用的空間。首先,建立保存日誌目錄

SQL> EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

然後,識別 RDS 執行個體上保存日誌的實際用量:

SQL> 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 檔案:

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]');

相關資訊

使用 Amazon RDS 資料庫執行個體的儲存體

終止工作階段

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

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