

# 在 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)
+ [参数](#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 Database 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}});
```

## 参数
<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 Database 文档中的 [DBMS\_SPACE.SHRINK\_TABLESPACE](https://docs.oracle.com/en/database/oracle/oracle-database/26/arpls/DBMS_SPACE.html)
+ 有关更多信息，请参阅 [执行 Oracle 数据库实例的常见数据库任务](Appendix.Oracle.CommonDBATasks.Database.md)。