

# 在 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);
```