如何調整 Amazon RDS for Oracle 資料庫執行個體的資料表空間大小?

上次更新日期:2021 年 11 月 3 日

我想知道如何管理 Amazon Relational Database Service (Amazon RDS) for Oracle 資料庫執行個體的資料表空間或調整其大小。

簡短描述

Amazon RDS for Oracle 資料庫執行個體的預設資料表空間類型為大檔案。大檔案資料表空間使資料檔案對使用者透明。因此,您可以直接對資料表空間執行操作,而無需管理每個底層資料檔案。大檔案資料表空間讓您無需新增新資料檔案或處理多個檔案,從而簡化了資料檔案管理。最佳實務是避免為 RDS for Oracle 執行個體使用小檔案料表空間

如果您的 RDS for Oracle 執行個體使用小檔案資料表空間,您將受到以下限制:

  • 您無法調整資料檔案的大小。但是,您可以透過在資料表空間中新增資料檔案來調整資料表空間的大小。
  • 您不能執行 ALTER DATABASE 查詢來調整大小或變更資料檔案組態。這是因為 RDS for Oracle 不支援 ALTER DATABASE 命令。如需詳細資訊,請參閱 RDS for Oracle 限制
  • 您必須手動管理 db_files 參數以定義資料庫中資料檔案的最大數量。當資料檔案的數量達到此限制時,可能需要調整 db_files。

依預設,RDS for Oracle 中的資料表空間為大檔案,並開啟 AUTOEXTEND大檔案資料表空間的最大大小為 16 TiB。當您將資料插入某個資料表空間時,該資料表空間會根據需要增加到為該資料表空間設定的上限或為相應 RDS 執行個體設定的所配置的儲存容量,以較小者為準。如果為該 RDS 執行個體所配置的儲存容量已用完,則該執行個體會切換到 STORAGE_FULL 狀態,並且無法擴展該資料表空間。若要解決此問題,您必須向該執行個體新增儲存容量。如需詳細資訊,請參閱如何解決 Amazon RDS 資料庫執行個體用完儲存體時發生的問題?

從資料表空間中刪除資料時,資料表空間的大小不會縮小。插入新資料時,可以重複使用空閒的區塊。您必須手動調整資料表空間的大小以回收未使用的空間。

解決方案

若要調整 RDS for Oracle 執行個體的資料表空間大小,請執行以下操作:

  1. 檢查資料表空間的組態。
  2. 根據您的使用案例增加或減少資料表空間的大小。

檢查資料表空間的組態

1.    執行類似於以下內容的查詢以確定資料表空間是否為:

  • 永久、undo 或臨時
  • 小檔案或大檔案
SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

2.    執行類似於以下內容的查詢以檢查 autoextend 功能是否已開啟、資料檔案的當前大小以及設定的上限:

對於永久和 undo 資料表空間:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

對於臨時資料表空間:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

您可能會在這些查詢的輸出中註意到以下內容:

  • 如果未開啟 autoextend 功能,則 MAX_GB 的值等於 0。
  • 如果資料表空間是小檔案,則 MAX_GB 的值取決於用於建立資料表空間的區塊大小。例如,如果使用的區塊大小為 8K,則 MAX_GB 的值為 32 GB。如需詳細資訊,請參閱 Oracle 文件的非標準區塊大小部分。
  • 如果資料表空間是大檔案,則 MAX_GB 的值顯示為 32 TB。但是,由於 RDS for Oracle 中的作業系統限制,該檔案最多只能擴展到 16 TiB。

或者,您可以執行以下查詢來取得用於建立資料表空間的 DDL:

SQL> SET LINESIZE 400
SQL> SET LONG 99999
SQL> SELECT DBMS_METADATA.GET_DDL('TABLESPACE','example-tablespace') FROM DUAL;

您可以從返回的 DDL 中取得有關資料表空間的所需資訊。

增加資料表空間的大小

如果您開啟了 autoextend 功能,那麼無論資料表空間的類型如何,都不需要增加資料表空間的大小。在這種情況下,資料表空間會根據需要自動調整大小。

如果您還沒有開啟 autoextend 功能並想調整資料表空間的大小,請執行以下操作:

對於大檔案資料表空間:使用 ALTER TABLESPACE 命令調整資料表空間的大小。您可以用千位元組 (K)、兆位元組 (M)、百萬位元組 (G) 或兆位元組 (T) 指定大小。大檔案資料表空間具有單個資料檔案,此命令調整與資料表空間關聯的底層單個資料檔案的大小。

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

對於小檔案資料表空間:您只能透過向資料表空間新增更多資料檔案來調整資料表空間的大小。您不能調整當前資料檔案的大小或或修改其組態。

SQL> ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;

減小資料表空間的大小

如果資料表空間是小檔案,則無法管理底層資料檔案。若要增加資料表空間大小,請新增資料檔案。新增資料檔案時,請確保為 AUTOEXTEND、SIZE 和 MAXSIZE 選擇正確的值。這些值以後無法變更。若要減小小檔案資料表空間的大小,請建立一個具有所需空間的新資料表空間,然後手動將所有資料移動到新的資料表空間。

如果您的資料表空間是大檔案,則請根據資料表空間的資料類型選擇以下方法之一來減小資料表空間的大小:

永久資料表空間:您不能將永久資料表空間的大小減小到小於資料表空間上限標準。如果您嘗試這樣做,您的調整大小操作將失敗並顯示以下錯誤:

ORA-03297: file contains used data beyond requested RESIZE value

但是,假設資料表空間的大小為 50 GB,上限標準為 40 GB。那麼,您可以透過執行類似於以下內容的查詢將資料表空間的大小減少到 40 GB:

SQL> ALTER TABLESPACE example-tablespace RESIZE 40G;

您不能將資料表空間的大小減小到小於上限標準。在此等情況下,您可以執行以下任一操作:

  • 重新組織資料表空間中的物件。
  • 建立一個新資料表空間並將所有物件遷移到新的資料表空間。然後,刪除舊資料表空間。

臨時資料表空間:您可以使用 SHRINK 命令減小臨時資料表空間的大小。

範例:

SQL> ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

若要調整僅供讀取複本中臨時資料表空間的大小,請使用 rdsadmin.rdsadmin_util.resize_temp_tablespace package:

SQL> EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('example-tablespace','100M');

如需詳細資訊,請參閱調整僅供讀取複本中的暫時資料表空間大小

-或-

您可以建立另一個所需大小的臨時資料表空間,然後將這個新的臨時資料表空間設定為預設臨時資料表空間。

1.    執行以下查詢以檢視當前的預設臨時資料表空間:

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

2.    執行以下查詢以建立新的臨時資料表空間:

SQL> CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;

3.    執行以下查詢以將新臨時資料表空間設定為預設臨時資料表空間:

SQL> EXEC RDSADMIN.RDSADMIN_UTIL.ALTER_DEFAULT_TEMP_TABLESPACE(TABLESPACE_NAME => 'example-tablespace');

若要修改特定使用者的臨時資料表空間,您可以執行以下操作:

1.    執行以下查詢以檢視該使用者當前的預設臨時資料表空間:

SQL>  SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';

2.    執行以下查詢以變更該使用者的預設臨時資料表空間:

SQL> ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

undo 資料表空間:首先,嘗試使用 ALTER TABLESPACE 命令減小 undo 資料表空間的大小。

執行以下查詢以識別當前正在使用的 undo 資料表空間:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

執行類似於以下內容的查詢以減小 undo 資料表空間的大小:

SQL> ALTER TABLESPACE example-tablespace RESIZE 500M;

如果儲存中沒有必須刪除的 undo 區段,則此查詢將成功執行。

如果上述查詢未成功執行,請執行以下操作:

1.    建立一個新的 undo 資料表空間:

執行類似於以下內容的查詢以建立新的 undo 資料表空間:

SQL> CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;

2.    將新建立的資料表空間設定為預設的 undo 資料表空間:

將參數群組中的 UNDO_TABLESPACE 初始化參數設定為指向新建立的資料表空間。如需詳細資訊,請參閱修改資料庫參數群組中的參數

範例:

UNDO_TABLESPACE = example-new-tablespace

此參數是一個動態參數,套用修改不會導致任何停機時間。但是,最佳實務是在進行變更後重新啟動資料庫執行個體。如需詳細資訊,請參閱管理 undo

執行以下查詢以驗證新的 undo 資料表空間是否為預設資料表空間:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

3.    刪除舊的 undo 資料表空間:

執行類似於以下內容的查詢以刪除舊的 undo 資料表空間:

SQL> DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;