

# 执行 Oracle 数据库实例的常见数据库任务
<a name="Appendix.Oracle.CommonDBATasks.Database"></a>

下文中介绍了如何在运行 Oracle 的 Amazon RDS 数据库实例上，执行与数据库相关的特定常见 DBA 任务。为了提供托管服务体验，Amazon RDS 未提供数据库实例的 Shell 访问权限。并且 Amazon RDS 还限制了对需要高级权限的某些系统程序和表的访问。

**Topics**
+ [

# 更改数据库的全局名称
](Appendix.Oracle.CommonDBATasks.RenamingGlobalName.md)
+ [

# 在 RDS for Oracle 中使用表空间
](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md)
+ [

# 在 RDS for Oracle 中使用临时文件
](Appendix.Oracle.CommonDBATasks.using-tempfiles.md)
+ [

# 在 RDS for Oracle 中调整表空间、数据文件和临时文件的大小
](Appendix.Oracle.CommonDBATasks.ResizeTempSpaceReadReplica.md)
+ [

# 在 RDS for Oracle 中的存储卷之间移动数据
](Appendix.Oracle.CommonDBATasks.MovingDataBetweenVolumes.md)
+ [

# 在 RDS for Oracle 中使用外部表
](Appendix.Oracle.CommonDBATasks.External_Tables.md)

# 更改数据库的全局名称
<a name="Appendix.Oracle.CommonDBATasks.RenamingGlobalName"></a>

要更改数据库的全局名称，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.rename_global_name`。`rename_global_name` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_new_global_name`  |  varchar2  |  —  |  是  |  数据库的新全局名称。  | 

数据库必须处于打开状态，才能更改名称。有关更改数据库的全局名称的更多信息，请参阅 Oracle 文档中的 [ALTER DATABASE](http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_1004.htm#SQLRF52547)。

以下示例将数据库的全局名称更改为 `new_global_name`。

```
EXEC rdsadmin.rdsadmin_util.rename_global_name(p_new_global_name => 'new_global_name');
```

# 在 RDS for Oracle 中使用表空间
<a name="Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles"></a>

可以将表空间与 RDS for Oracle 结合使用，后者是一种用于存储数据库数据的逻辑存储单元。

**重要**  
如果您的数据库实例有副本，我们建议使用参数组设置而不是会话级别的更改来管理默认文件位置。对主实例中默认文件位置的会话级别更改不会自动反映在副本中。使用参数组设置可确保文件位置在主实例和副本实例间保持一致。

**Topics**
+ [

## 在 RDS for Oracle 中指定数据库文件位置
](#Appendix.Oracle.CommonDBATasks.DatabaseFileLocations)
+ [

## 在 RDS for Oracle 中创建表空间并调整其大小
](#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)
+ [

## 在 RDS for Oracle 中的附加存储卷上创建表空间
](#Appendix.Oracle.CommonDBATasks.CreatingTablespacesWithFileLocations)
+ [

## 在 RDS for Oracle 中设置默认表空间
](#Appendix.Oracle.CommonDBATasks.SettingDefaultTablespace)
+ [

## 在 RDS for Oracle 中设置默认临时表空间
](#Appendix.Oracle.CommonDBATasks.SettingDefTempTablespace)
+ [

## 在实例存储上创建临时表空间
](#Appendix.Oracle.CommonDBATasks.creating-tts-instance-store)

## 在 RDS for Oracle 中指定数据库文件位置
<a name="Appendix.Oracle.CommonDBATasks.DatabaseFileLocations"></a>

RDS for Oracle 使用 Oracle 管理的文件（OMF）来命名数据库文件。创建数据库文件时，数据库会根据 `DB_CREATE_FILE_DEST` 初始化参数的当前设置派生该设置。

`DB_CREATE_FILE_DEST` 初始化参数的默认值为 `/rdsdbdata/db`（对于独立数据库）和 `/rdsdbdata/db/pdb` [对于容器化（CDB/MT）架构]。如果数据库实例有附加存储卷，则可以将 `DB_CREATE_FILE_DEST` 设置为卷位置。例如，如果实例在 `/rdsdbdata/db` 上挂载了卷，则可以将 `DB_CREATE_FILE_DEST` 设置为该值。

您可以在会话级别或 Oracle 数据库实例级别修改 `DB_CREATE_FILE_DEST` 参数。

### 在实例级别修改 DB\$1CREATE\$1FILE\$1SET
<a name="Appendix.Oracle.CommonDBATasks.InstanceLevelModification"></a>

要在实例级别修改该参数，请更新分配给数据库实例的参数组中的该参数并应用该参数。有关更多信息，请参阅[RDS for Oracle 初始化参数](Oracle.Concepts.FeatureSupport.Parameters.md)和[在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 在会话级别修改 DB\$1CREATE\$1FILE\$1DEST
<a name="Appendix.Oracle.CommonDBATasks.SessionLevelModification"></a>

您可以通过执行 `ALTER SESSION` 语句在会话级别修改该参数。当您想要在特定位置为特定会话创建数据库文件而不影响整个实例时，这种方法非常有用。

以下示例显示了如何检查当前参数值并针对会话修改该值：

```
SHOW PARAMETER db_create_file_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      /rdsdbdata/db

ALTER SESSION SET db_create_file_dest = '/rdsdbdata2/db';

Session altered.

SHOW PARAMETER db_create_file_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      /rdsdbdata2/db
```

## 在 RDS for Oracle 中创建表空间并调整其大小
<a name="Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles"></a>

创建表空间时，数据库会在创建时在由 `DB_CREATE_FILE_DEST` 初始化参数指定的存储卷中创建数据文件。原定设置情况下，如果未指定数据文件大小，则创建的表空间原定设置为 `AUTOEXTEND ON`，且没有最大大小。在以下示例中，表空间 *users1* 是可自动扩展的。

```
CREATE TABLESPACE users1;
```

由于这些默认设置，表空间会增大以占用所有分配的存储空间。建议您在永久表空间和临时表空间上指定适当的最大大小，并仔细监视空间使用率。

以下示例创建一个名为 *users2* 的表空间，起始大小为 1GB。由于指定了数据文件大小，但未指定 `AUTOEXTEND ON`，因此表空间不可自动扩展。

```
CREATE TABLESPACE users2 DATAFILE SIZE 1G;
```

以下示例创建一个名为 *users3* 的表空间，起始大小为 1GB，开启了自动扩展，且最大大小为 10GB。

```
CREATE TABLESPACE users3 DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 10G;
```

以下示例创建一个名为 *temp01* 的临时表空间。

```
CREATE TEMPORARY TABLESPACE temp01;
```

您可以使用 `ALTER TABLESPACE` 调整大文件表空间的大小。可以 KB (K)、MB (M)、GB (G) 或 TB (T) 为单位指定大小。以下示例将名为 *users\$1bf* 的大文件表空间的大小调整到 200MB。

```
ALTER TABLESPACE users_bf RESIZE 200M;
```

以下示例向名为 *users\$1sf* 的小文件表空间添加另一个数据文件。

```
ALTER TABLESPACE users_sf ADD DATAFILE SIZE 100000M AUTOEXTEND ON NEXT 250m MAXSIZE UNLIMITED;
```

## 在 RDS for Oracle 中的附加存储卷上创建表空间
<a name="Appendix.Oracle.CommonDBATasks.CreatingTablespacesWithFileLocations"></a>

要在附加存储卷上创建表空间，请将 `DB_CREATE_FILE_DEST` 参数修改为卷位置。以下示例将文件位置设置为 `/rdsdbdata2/db`。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata2/db';

Session altered.
```

在以下示例中，您将在附加卷 `/rdsdbdata2/db` 上创建表空间。

```
CREATE TABLESPACE new_tablespace DATAFILE SIZE 10G;

Tablespace created.

SELECT tablespace_name,file_id,file_name FROM dba_data_files
WHERE tablespace_name = 'NEW_TABLESPACE';

TABLESPACE_NAME              FILE_ID FILE_NAME
------------------------- ---------- --------------------------------------------------------------------------------
NEW_TABLESPACE                     7 /rdsdbdata2/db/ORCL_A/datafile/o1_mf_newtable_a123b4c5_.dbf
```

要创建小文件表空间并将其数据文件分散到不同的存储卷，请在创建表空间后向表空间添加数据文件。在以下示例中，您创建了一个表空间，其中数据文件位于默认位置 `/rdsdbdata/db`。然后将默认目标设置为 `/rdsdbdata/db2`。向新创建的表空间中添加数据文件时，数据库会将该文件存储在 `/rdsdbdata/db2` 中。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata/db';

Session altered.

CREATE SMALLFILE TABLESPACE smalltbs DATAFILE SIZE 10G;

Tablespace created.

SELECT tablespace_name,file_id,file_name FROM dba_data_files
WHERE tablespace_name = 'SMALLTBS';

TABLESPACE_NAME              FILE_ID FILE_NAME
------------------------- ---------- --------------------------------------------------------------------------------
SMALLTBS                           8 /rdsdbdata/db/ORCL_A/datafile/o1_mf_smalltbs_n563yryk_.dbf

ALTER SESSION SET db_create_file_dest = '/rdsdbdata2/db';

Session altered.

ALTER TABLESPACE smalltbs ADD DATAFILE SIZE 10G;

Tablespace altered.

SELECT tablespace_name,file_id,file_name FROM dba_data_files
WHERE tablespace_name = 'SMALLTBS';

TABLESPACE_NAME              FILE_ID FILE_NAME
------------------------- ---------- --------------------------------------------------------------------------------
SMALLTBS                           8 /rdsdbdata/db/ORCL_A/datafile/o1_mf_smalltbs_n563yryk_.dbf
SMALLTBS                           9 /rdsdbdata2/db/ORCL_A/datafile/o1_mf_smalltbs_n564004g_.dbf
```

## 在 RDS for Oracle 中设置默认表空间
<a name="Appendix.Oracle.CommonDBATasks.SettingDefaultTablespace"></a>

要设置默认表空间，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.alter_default_tablespace`。`alter_default_tablespace` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `tablespace_name`  |  varchar  |  —  |  是  |  默认表空间的名称。  | 

以下示例将默认表空间设置为 *users2*：

```
EXEC rdsadmin.rdsadmin_util.alter_default_tablespace(tablespace_name => 'users2');
```

## 在 RDS for Oracle 中设置默认临时表空间
<a name="Appendix.Oracle.CommonDBATasks.SettingDefTempTablespace"></a>

要设置默认临时表空间，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.alter_default_temp_tablespace`。`alter_default_temp_tablespace` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `tablespace_name`  |  varchar  |  —  |  是  |  默认临时表空间的名称。  | 

以下示例将默认临时表空间设置为 *temp01*。

```
EXEC rdsadmin.rdsadmin_util.alter_default_temp_tablespace(tablespace_name => 'temp01');
```

## 在实例存储上创建临时表空间
<a name="Appendix.Oracle.CommonDBATasks.creating-tts-instance-store"></a>

要在实例存储上创建临时表空间，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.create_inst_store_tmp_tblspace`。`create_inst_store_tmp_tblspace` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_tablespace_name`  |  varchar  |  —  |  是  |  临时表空间的名称。  | 

以下示例在实例存储中创建临时表空间 *temp01*。

```
EXEC rdsadmin.rdsadmin_util.create_inst_store_tmp_tblspace(p_tablespace_name => 'temp01');
```

**重要**  
运行 `rdsadmin_util.create_inst_store_tmp_tblspace` 时，新创建的临时表空间不会自动设置为原定设置临时表空间。要将其设置为原定设置，请参阅 [在 RDS for Oracle 中设置默认临时表空间](#Appendix.Oracle.CommonDBATasks.SettingDefTempTablespace)。

有关更多信息，请参阅 [在 RDS for Oracle 实例存储中存储临时数据](CHAP_Oracle.advanced-features.instance-store.md)。

# 在 RDS for Oracle 中使用临时文件
<a name="Appendix.Oracle.CommonDBATasks.using-tempfiles"></a>

## 在只读副本上向实例存储中添加临时文件
<a name="Appendix.Oracle.CommonDBATasks.adding-tempfile-replica"></a>

当您在主数据库实例上创建临时表空间时，只读副本不会创建临时文件。假设由于以下原因之一，只读副本上存在一个空的临时表空间：
+ 您从只读副本上的表空间中删除了一个临时文件。有关更多信息，请参阅 [删除只读副本上的临时文件](Appendix.Oracle.CommonDBATasks.dropping-tempfiles-replica.md)。
+ 您在主数据库实例上创建了一个新的临时表空间。在这种情况下，RDS for Oracle 会将元数据同步到只读副本。

您可以将临时文件添加到空的临时表空间，并将临时文件存储在实例存储中。要在实例存储中创建临时文件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.add_inst_store_tempfile`。您只能在只读副本上使用此过程。 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_tablespace_name`  |  varchar  |  —  |  是  |  只读副本上临时表空间的名称。  | 

在以下示例中，您的只读副本上存在空的临时表空间 *temp01*。运行以下命令以创建此表空间的临时文件，并将其存储在实例存储中。

```
EXEC rdsadmin.rdsadmin_util.add_inst_store_tempfile(p_tablespace_name => 'temp01');
```

有关更多信息，请参阅 [在 RDS for Oracle 实例存储中存储临时数据](CHAP_Oracle.advanced-features.instance-store.md)。

# 删除只读副本上的临时文件
<a name="Appendix.Oracle.CommonDBATasks.dropping-tempfiles-replica"></a>

您不能删除只读副本上的现有临时表空间。您可以将只读副本上的临时文件存储从 Amazon EBS 更改为实例存储，或者从实例存储更改为 Amazon EBS。为实现这些目标，请执行以下操作：

1. 删除只读副本上临时表空间中的当前临时文件。

1. 在不同的存储上创建新的临时文件。

要删除临时文件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util. drop_replica_tempfiles`。您只能在只读副本上使用此过程。`drop_replica_tempfiles` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_tablespace_name`  |  varchar  |  —  |  是  |  只读副本上临时表空间的名称。  | 

假设一个名为 *temp01* 的临时表空间位于只读副本上的实例存储中。通过运行以下命令，删除此表空间中的所有临时文件。

```
EXEC rdsadmin.rdsadmin_util.drop_replica_tempfiles(p_tablespace_name => 'temp01');
```

有关更多信息，请参阅 [在 RDS for Oracle 实例存储中存储临时数据](CHAP_Oracle.advanced-features.instance-store.md)。

# 在 RDS for Oracle 中调整表空间、数据文件和临时文件的大小
<a name="Appendix.Oracle.CommonDBATasks.ResizeTempSpaceReadReplica"></a>

原定设置情况下，在开启自动扩展的情况下创建 Oracle 表空间，并且没有最大大小。由于这些原定设置，表空间有时可能会变得过大。建议您在永久表空间和临时表空间上指定适当的最大大小，并仔细监视空间使用率。

## 调整永久表空间大小
<a name="resizing-perm-tbs"></a>

要调整 RDS for Oracle 数据库实例中永久表空间的大小，请使用以下任何 Amazon RDS 过程：
+ `rdsadmin.rdsadmin_util.resize_datafile`
+ `rdsadmin.rdsadmin_util.autoextend_datafile`

`resize_datafile` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_data_file_id`  |  number  |  —  |  是  |  要调整大小的数据文件的标识符。  | 
|  `p_size`  |  varchar2  |  —  |  是  |  数据文件的大小。以字节数（原定设置）、KB（K）、MB（M）或 GB（G）为单位指定大小。  | 

`autoextend_datafile` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_data_file_id`  |  number  |  —  |  是  |  要调整大小的数据文件的标识符。  | 
|  `p_autoextend_state`  |  varchar2  |  —  |  是  |  自动扩展功能的状态。指定 `ON` 可自动扩展数据文件，指定 `OFF` 可关闭自动扩展功能。  | 
|  `p_next`  |  varchar2  |  —  |  否  |  下一个数据文件增量的大小。以字节数（原定设置）、KB（K）、MB（M）或 GB（G）为单位指定大小。  | 
|  `p_maxsize`  |  varchar2  |  —  |  否  |  允许自动扩展的最大磁盘空间。以字节数（原定设置）、KB（K）、MB（M）或 GB（G）为单位指定大小。您可以指定 `UNLIMITED` 以删除文件大小限制。  | 

以下示例将数据文件 4 的大小调整为 500MB。

```
EXEC rdsadmin.rdsadmin_util.resize_datafile(4,'500M');
```

以下示例对于数据文件 4 关闭自动扩展功能。该示例还为数据文件 5 开启自动扩展功能，增量为 128MB，且没有最大大小。

```
EXEC rdsadmin.rdsadmin_util.autoextend_datafile(4,'OFF');
EXEC rdsadmin.rdsadmin_util.autoextend_datafile(5,'ON','128M','UNLIMITED');
```

## 调整临时表空间大小
<a name="resizing-temp-tbs"></a>

要调整 RDS for Oracle 数据库实例中临时表空间（包括只读副本）的大小，请使用以下任何 Amazon RDS 过程：
+ `rdsadmin.rdsadmin_util.resize_temp_tablespace`
+ `rdsadmin.rdsadmin_util.resize_tempfile`
+ `rdsadmin.rdsadmin_util.autoextend_tempfile`

`resize_temp_tablespace` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_temp_tablespace_name`  |  varchar2  |  —  |  是  |  要调整大小的临时表空间的名称。  | 
|  `p_size`  |  varchar2  |  —  |  是  |  表空间的大小。以字节数（原定设置）、KB（K）、MB（M）或 GB（G）为单位指定大小。  | 

`resize_tempfile` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_temp_file_id`  |  number  |  —  |  是  |  要调整大小的临时文件的标识符。  | 
|  `p_size`  |  varchar2  |  —  |  是  |  临时文件的大小。以字节数（原定设置）、KB（K）、MB（M）或 GB（G）为单位指定大小。  | 

`autoextend_tempfile` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_temp_file_id`  |  number  |  —  |  是  |  要调整大小的临时文件的标识符。  | 
|  `p_autoextend_state`  |  varchar2  |  —  |  是  |  自动扩展功能的状态。指定 `ON` 可自动扩展临时文件，指定 `OFF` 可关闭自动扩展功能。  | 
|  `p_next`  |  varchar2  |  —  |  否  |  下一个临时文件增量的大小。以字节数（原定设置）、KB（K）、MB（M）或 GB（G）为单位指定大小。  | 
|  `p_maxsize`  |  varchar2  |  —  |  否  |  允许自动扩展的最大磁盘空间。以字节数（原定设置）、KB（K）、MB（M）或 GB（G）为单位指定大小。您可以指定 `UNLIMITED` 以删除文件大小限制。  | 

以下示例将名为 `TEMP` 的临时表空间的大小调整为 4GB。

```
EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('TEMP','4G');
```

```
EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('TEMP','4096000000');
```

以下示例将基于临时文件（文件标识符为 `1`）的临时表空间大小调整为 2MB。

```
EXEC rdsadmin.rdsadmin_util.resize_tempfile(1,'2M');
```

以下示例对于临时文件 1 关闭自动扩展功能。该示例还将临时文件 2 的最大自动扩展大小设置为 10GB，增量为 100MB。

```
EXEC rdsadmin.rdsadmin_util.autoextend_tempfile(1,'OFF');
EXEC rdsadmin.rdsadmin_util.autoextend_tempfile(2,'ON','100M','10G');
```

有关 Oracle 数据库实例的只读副本的更多信息，请参阅[使用 Amazon RDS for Oracle 的只读副本](oracle-read-replicas.md)。

# 在 RDS for Oracle 中的存储卷之间移动数据
<a name="Appendix.Oracle.CommonDBATasks.MovingDataBetweenVolumes"></a>

您可以在主存储卷和附加存储卷之间移动数据文件和数据库对象。在移动数据之前，请考虑以下几点：
+ 源卷和目标卷必须具有足够的可用空间。
+ 数据移动操作会消耗两个卷上的 I/O。
+ 大量数据移动可能会影响数据库性能。
+ 当您还原快照时，如果数据受到 EBS 延迟加载的影响，则在存储卷之间移动数据可能会较慢。

**Topics**
+ [

## 在 RDS for Oracle 中的卷之间移动数据文件
](#Appendix.Oracle.CommonDBATasks.MovingDatafiles)
+ [

## 在 RDS for Oracle 中的卷之间移动表数据和索引
](#Appendix.Oracle.CommonDBATasks.MovingTableData)
+ [

## 使用附加卷管理 LOB 存储
](#Appendix.Oracle.CommonDBATasks.ManagingLargeLOBStorage)

## 在 RDS for Oracle 中的卷之间移动数据文件
<a name="Appendix.Oracle.CommonDBATasks.MovingDatafiles"></a>

要在存储卷之间移动数据文件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.move_datafile`。请注意以下要求：
+ 必须使用 Oracle 企业版才能运行 `move_datafile` 过程。
+ 您无法移动表空间 `SYSTEM` 和 `RDSADMIN`。

`move_datafile` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 必需 | 描述 | 
| --- | --- | --- | --- | 
|  `p_data_file_id`  |  number  |  是  |  要移动的数据文件的 ID。  | 
|  `p_location`  |  varchar2  |  是  |  要将数据文件移动到的存储卷。  | 

以下示例将表空间从默认卷 `rdsdbdata` 移到附加卷 `rdsdbdata2`。

```
SQL> SELECT tablespace_name,file_id,file_name FROM dba_data_files
 WHERE tablespace_name = 'MYNEWTABLESPACE';

TABLESPACE_NAME              FILE_ID FILE_NAME
------------------------- ---------- --------------------------------------------------------------------------------
MYNEWTABLESPACE                    6 /rdsdbdata/db/ORCL_A/datafile/o1_mf_mynewtab_n123abcd_.dbf

EXECUTE rdsadmin.rdsadmin_util.move_datafile( 6, 'rdsdbdata2');

PL/SQL procedure successfully completed.

SQL> SELECT tablespace_name,file_id,file_name FROM dba_data_files
  WHERE tablespace_name = 'MYNEWTABLESPACE';

TABLESPACE_NAME              FILE_ID FILE_NAME
------------------------- ---------- --------------------------------------------------------------------------------
MYNEWTABLESPACE                    6 /rdsdbdata2/db/ORCL_A/datafile/o1_mf_mynewtab_n356efgh_.dbf
```

## 在 RDS for Oracle 中的卷之间移动表数据和索引
<a name="Appendix.Oracle.CommonDBATasks.MovingTableData"></a>

您可以通过在附加存储卷上创建表空间来优化数据库存储。然后，您可以使用标准 Oracle SQL 将表、索引和分区等对象移动到这些表空间。当数据库包含具有不同访问模式的数据时，这种方法对于性能调整非常有用。例如，您可以将频繁访问的操作数据存储在高性能存储卷上，同时将极少访问的历史数据移到成本较低的存储卷上。

在以下示例中，您在高性能卷 `rdsdbdata2` 上创建了一个新的表空间。然后，当表处于联机状态时，您可以将该表移到附加存储卷中。您还可以将索引移到相同的卷上。联机时移动表和重建索引要求使用 Oracle 企业版。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata2/db';
CREATE TABLESPACE perf_tbs DATAFILE SIZE 10G;

ALTER TABLE employees
  MOVE TABLESPACE perf_tbs ONLINE;

ALTER INDEX employees_idx
  REBUILD ONLINE TABLESPACE perf_tbs;
```

在以下示例中，您在低成本卷上创建表空间。然后，使用联机操作将表分区移到低成本存储卷上。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata3/db';
CREATE TABLESPACE hist_tbs DATAFILE SIZE 10G;

ALTER TABLE orders
  MOVE PARTITION orders_2022
  TABLESPACE hist_tbs ONLINE;
```

在以下示例中，您可以查询活动会话的长时间操作。

```
SELECT sid,opname,sofar,totalwork,time_remaining,elapsed_seconds 
  FROM v$session_longops 
  WHERE time_remaining > 0;
```

您可以使用以下查询检查表空间使用情况。

```
SELECT tablespace_name, used_percent
  FROM dba_tablespace_usage_metrics
  ORDER BY used_percent DESC;
```

## 使用附加卷管理 LOB 存储
<a name="Appendix.Oracle.CommonDBATasks.ManagingLargeLOBStorage"></a>

您的数据库可能包含具有 BLOB 或 CLOB 对象的表，这些对象会占用大量存储空间，但并不频繁访问。要优化存储，您可以将这些 LOB 段重新放置到附加存储卷上的表空间。

在以下示例中，您在一个旨在存储低访问频率数据的低成本卷上，为 LOB 数据创建一个表空间。然后创建在该卷上存储数据的表。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata3/db';
CREATE TABLESPACE lob_data DATAFILE SIZE 5G AUTOEXTEND ON NEXT 1G;

CREATE TABLE documents (
    doc_id NUMBER PRIMARY KEY,
    doc_date DATE,
    doc_content CLOB
) TABLESPACE user_data
LOB(doc_content) STORE AS (TABLESPACE lob_data);
```

# 在 RDS for Oracle 中使用外部表
<a name="Appendix.Oracle.CommonDBATasks.External_Tables"></a>

*Oracle 外部表*是具有不在数据库中数据的表。这些数据位于数据库可以访问的外部文件中。使用外部表，您可以访问数据而无需将其加载到数据库中。有关外部表的更多信息，请参阅 Oracle 文档中的[管理外部表](http://docs.oracle.com/database/121/ADMIN/tables.htm#ADMIN01507)。

使用 Amazon RDS，您可以将外部表文件存储在目录对象中。您可以创建目录对象，或者使用 Oracle 数据库中预定义的目录对象，例如 DATA\$1PUMP\$1DIR 目录。有关创建目录对象的信息，请参阅[在主数据存储空间中创建和删除目录](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.NewDirectories)。您可以查询 ALL\$1DIRECTORIES 视图来列出您的 Amazon RDS Oracle 数据库实例的目录对象。

**注意**  
目录对象指向由实例使用的主数据存储空间 (Amazon EBS 卷)。—包括数据文件、重做日志、审核、跟踪和其他文件在内—所用的空间均计入分配的存储中。

您可以使用 [ DBMS\$1FILE\$1TRANSFER](https://docs.oracle.com/database/121/ARPLS/d_ftran.htm#ARPLS095) 包或 [UTL\$1FILE](https://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS069) 包，将外部数据文件从一个 Oracle 数据库移动到另一个。外部数据文件从源数据库上的目录移至目标数据库上的指定目录中。有关使用 `DBMS_FILE_TRANSFER` 的信息，请参阅 [使用 Oracle Data Pump 导入](Oracle.Procedural.Importing.DataPump.md)。

移动外部数据文件之后，您可以用它来创建外部表。以下示例创建使用 USER\$1DIR1 目录中 `emp_xt_file1.txt` 文件的外部表。

```
CREATE TABLE emp_xt (
  emp_id      NUMBER,
  first_name  VARCHAR2(50),
  last_name   VARCHAR2(50),
  user_name   VARCHAR2(20)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY USER_DIR1
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (emp_id,first_name,last_name,user_name)
  )
  LOCATION ('emp_xt_file1.txt')
)
PARALLEL
REJECT LIMIT UNLIMITED;
```

假设您要将位于 Amazon RDS Oracle 数据库实例中的数据移动到外部数据文件中。在这种情况下，您可以通过创建外部表并从数据库中的表选择数据来填充外部数据文件。例如，以下 SQL 语句通过查询数据库中的 `orders_xt` 表创建 `orders` 外部表。

```
CREATE TABLE orders_xt
  ORGANIZATION EXTERNAL
   (
     TYPE ORACLE_DATAPUMP
     DEFAULT DIRECTORY DATA_PUMP_DIR
     LOCATION ('orders_xt.dmp')
   )
   AS SELECT * FROM orders;
```

在此示例中，数据填充到 DATA\$1PUMP\$1DIR 目录的 `orders_xt.dmp` 文件中。