

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 RDS for Oracle 中縮減資料表空間
<a name="Oracle.ShrinkTablespace"></a>

從 Oracle Database 26ai (26.0.0.0) 開始，Amazon RDS for Oracle 支援使用 `rdsadmin.rdsadmin_util.shrink_tablespace` 程序縮減資料表空間。使用此程序透過縮減其資料檔案來回收資料表空間中未使用的空間。縮減可降低儲存體使用量，無需遷移資料或重新建立資料表空間。

**Topics**
+ [概觀](#Oracle.ShrinkTablespace.Overview)
+ [要求](#Oracle.ShrinkTablespace.Requirements)
+ [語法](#Oracle.ShrinkTablespace.Syntax)
+ [Parameters](#Oracle.ShrinkTablespace.Parameters)
+ [範例](#Oracle.ShrinkTablespace.Examples)
+ [考量事項](#Oracle.ShrinkTablespace.Considerations)
+ [相關資源](#Oracle.ShrinkTablespace.Resources)

## 概觀
<a name="Oracle.ShrinkTablespace.Overview"></a>

隨著時間的推移，Oracle 資料庫中的資料表空間可以從已刪除或重組的資料中累積未使用的空間。`rdsadmin.rdsadmin_util.shrink_tablespace` 程序會包裝 Oracle `DBMS_SPACE.SHRINK_TABLESPACE`功能，並為您處理所需的內部權限。

資料表空間縮減支援下列模式：
+ **分析模式** (`DBMS_SPACE.TS_MODE_ANALYZE`) – 評估資料表空間，並報告您可以回收多少空間，而無需進行變更。
+ **收縮模式** (`DBMS_SPACE.TS_MODE_SHRINK`) – 移動物件並調整資料表空間中的資料檔案大小，以回收未使用的空間。此為預設模式。

## 要求
<a name="Oracle.ShrinkTablespace.Requirements"></a>

若要使用資料表空間縮減，您的資料庫執行個體必須符合下列需求：
+ Oracle 資料庫 26ai 或更新版本
+ Oracle Enterprise Edition

## 語法
<a name="Oracle.ShrinkTablespace.Syntax"></a>

```
EXEC rdsadmin.rdsadmin_util.shrink_tablespace(
  p_tablespace_name => '{{tablespace_name}}',
  p_shrink_mode     => {{mode}},
  p_target_size     => {{target_bytes}});
```

## Parameters
<a name="Oracle.ShrinkTablespace.Parameters"></a>


**shrink\_tablespace 參數**  

| 參數名稱 | 資料類型 | 預設 | 必要 | 描述 | 
| --- | --- | --- | --- | --- | 
| `p_tablespace_name` | `VARCHAR2` | — | 是 | 要縮小的資料表空間名稱。 | 
| `p_shrink_mode` | `NUMBER` | `2` (`TS_MODE_SHRINK`) | 否 | 收縮模式。使用 `DBMS_SPACE.TS_MODE_ANALYZE`(`1`) 僅分析，或 `DBMS_SPACE.TS_MODE_SHRINK`(`2`) 執行縮減。 | 
| `p_target_size` | `NUMBER` | `0` | 否 | 目標大小，以位元組為單位。使用 `0`（預設值） 縮小至可能的大小下限。指定正值以縮小至特定目標。 | 

## 範例
<a name="Oracle.ShrinkTablespace.Examples"></a>

### 分析可回收空間的資料表空間
<a name="Oracle.ShrinkTablespace.Examples.Analyze"></a>

若要分析資料表空間而不進行變更，請執行下列命令：

```
EXEC rdsadmin.rdsadmin_util.shrink_tablespace('USERS', DBMS_SPACE.TS_MODE_ANALYZE);
```

下列為範例輸出：

```
-------------------ANALYZE RESULT-------------------
Total Movable Objects: 0
Total Movable Size(GB): 0
Original Datafile Size(GB): .1
Suggested Target Size(GB): .06
Process Time: +00 00:00:00.021513
```

### 將資料表空間縮減至最小大小
<a name="Oracle.ShrinkTablespace.Examples.Minimum"></a>

若要縮小資料表空間並回收所有未使用的空間，請執行下列命令：

```
EXEC rdsadmin.rdsadmin_util.shrink_tablespace('USERS');
```

下列為範例輸出：

```
-------------------SHRINK RESULT-------------------
Total Moved Objects: 0
Total Moved Size(GB): 0
Original Datafile Size(GB): .1
New Datafile Size(GB): .05
Process Time: +00 00:00:00.281151
```

### 將資料表空間縮減為特定目標大小
<a name="Oracle.ShrinkTablespace.Examples.Target"></a>

若要將資料表空間縮減為以位元組為單位的目標大小，請指定 `p_target_size` 參數。如果目標小於可達到的大小下限，Oracle 會自動向上調整：

```
EXEC rdsadmin.rdsadmin_util.shrink_tablespace('USERS', DBMS_SPACE.TS_MODE_SHRINK, 52428800);
```

## 考量事項
<a name="Oracle.ShrinkTablespace.Considerations"></a>

當您縮減資料表空間時，請考慮下列事項：
+ 資料表空間縮減是線上操作。資料表空間中的物件在縮減期間仍可存取。
+ 縮減操作可能會在資料表空間內移動物件，例如資料表和索引，以在調整資料檔案大小之前合併可用空間。
+ 索引會在縮減操作後保持有效，並保留資料完整性。
+ 如果 的值`p_target_size`小於物件目前佔用的空間，Oracle 會將目標調整為可達到的大小下限。
+ 的值`p_target_size`不得超過目前的資料表空間大小。指定小於或等於目前大小的目標。
+ 資料表空間中物件上的作用中交易可能會阻止操作回收所有可用空間。為了獲得最佳結果，請在低活動期間執行收縮。
+ 不支援在沒有`rdsadmin_util`包裝函式的情況下`DBMS_SPACE.SHRINK_TABLESPACE`直接呼叫 。一律使用`rdsadmin.rdsadmin_util.shrink_tablespace`包裝函式。

## 相關資源
<a name="Oracle.ShrinkTablespace.Resources"></a>
+ Oracle 資料庫文件中的 [DBMS\_SPACE.SHRINK\_TABLESPACE](https://docs.oracle.com/en/database/oracle/oracle-database/26/arpls/DBMS_SPACE.html) 
+ 如需詳細資訊，請參閱[執行 Oracle 資料庫執行個體的一般資料庫任務](Appendix.Oracle.CommonDBATasks.Database.md)。