

# 使用 Oracle 可传输表空间进行迁移
<a name="oracle-migrating-tts"></a>

您可以使用 Oracle 可传输表空间功能，将一组表空间从本地 Oracle 数据库复制到 RDS for Oracle 数据库实例。在物理层，您可以使用 Amazon EFS 或 Amazon S3 将源数据文件和元数据文件传输到目标数据库实例。可传输表空间功能使用 `rdsadmin.rdsadmin_transport_util` 软件包。有关此软件包的语法和语义，请参阅[传输表空间](rdsadmin_transport_util.md)。

有关阐述如何传输表空间的博客文章，请参阅 [Migrate Oracle Databases to Amazon using transportable tablespace](https://www.amazonaws.cn/blogs/database/migrate-oracle-databases-to-aws-using-transportable-tablespace/)，以及 [Amazon RDS for Oracle Transportable Tablespaces using RMAN](https://www.amazonaws.cn/blogs/database/amazon-rds-for-oracle-transportable-tablespaces-using-rman/)。

**Topics**
+ [Oracle 可传输表空间概述](#oracle-migrating-tts.overview)
+ [第 1 阶段：设置源主机](#oracle-migrating-tts.setup-phase)
+ [第 2 阶段：准备完整的表空间备份](#oracle-migrating-tts.initial-br-phase)
+ [第 3 阶段：制作和传输增量备份](#oracle-migrating-tts.roll-forward-phase)
+ [阶段 4：传输表空间](#oracle-migrating-tts.final-br-phase)
+ [第 5 阶段：验证传输的表空间](#oracle-migrating-tts.validate)
+ [第 6 阶段：清理剩余文件](#oracle-migrating-tts.cleanup)

## Oracle 可传输表空间概述
<a name="oracle-migrating-tts.overview"></a>

可传输的表空间集由正在传输的表空间集的数据文件和包含表空间元数据的导出转储文件组成。在诸如可传输表空间之类的物理迁移解决方案中，您可以传输物理文件：数据文件、配置文件和 Data Pump 转储文件。

**Topics**
+ [可传输表空间的优缺点](#oracle-migrating-tts.overview.benefits)
+ [可传输表空间的限制](#oracle-migrating-tts.limitations)
+ [可传输表空间的先决条件](#oracle-migrating-tts.requirements)

### 可传输表空间的优缺点
<a name="oracle-migrating-tts.overview.benefits"></a>

当您需要以最少的停机时间将一个或多个大型表空间迁移到 RDS 时，建议您使用可传输的表空间。与逻辑迁移相比，可传输的表空间具有以下优势：
+ 停机时间低于大多数其他 Oracle 迁移解决方案。
+ 由于可传输表空间功能仅复制物理文件，因此，它避免了在逻辑迁移中可能发生的数据完整性错误和逻辑损坏。
+ 不需要额外的许可证。
+ 您可以跨不同的平台和字节顺序类型迁移一组表空间，例如，从 Oracle Solaris 平台迁移到 Linux。但是，不支持在 Windows 服务器之间传输表空间。
**注意**  
Linux 经过充分测试并得到支持。并非所有 UNIX 版本都经过测试。

如果您使用可传输的表空间，则可以使用 Amazon S3 或 Amazon EFS 传输数据：
+ 使用 EFS 时，您的备份在导入期间将保留在 EFS 文件系统中。之后，您可以删除这些文件。在此技术中，您无需为数据库实例预调配 EBS 存储。出于这个原因，我们建议使用 Amazon EFS 而不是 S3。有关更多信息，请参阅 [Amazon EFS 集成](oracle-efs-integration.md)。
+ 使用 S3 时，您可以将 RMAN 备份下载到附加到数据库实例的 EBS 存储。在导入期间，文件将保留在您的 EBS 存储中。导入后，您可以释放此空间，该空间仍保持分配给您的数据库实例。

可传输表空间的主要缺点是您需要相对较高级的 Oracle 数据库知识。有关更多信息，请参见《Oracle 数据库管理员指南》**中的[在数据库之间传输表空间](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-F7B2B591-AA88-4D16-8DCF-712763923FFB)。

### 可传输表空间的限制
<a name="oracle-migrating-tts.limitations"></a>

当您在 RDS for Oracle 中使用可传输表空间时，将适用 Oracle 数据库对此功能的限制。有关更多信息，请参见《Oracle 数据库管理员指南》**中的[可传输表空间的限制]( https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-DAB51E42-9BBC-4001-B5CB-0ECDBE128787)和[传输数据的一般限制](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)。请注意 RDS for Oracle 中可传输表空间的以下其他限制：
+ 源数据库或目标数据库都不能使用标准版 2（SE2）。仅支持企业版。
+ 您不能使用 Oracle Database 11g 数据库作为源。RMAN 跨平台可传输表空间功能依赖于 RMAN 传输机制，而 Oracle Database 11g 不支持该机制。
+ 您无法使用可传输的表空间从 RDS for Oracle 数据库实例迁移数据。您只能使用可传输的表空间将数据迁移到 RDS for Oracle 数据库实例。
+ 不支持 Windows 操作系统。
+ 您无法将表空间传输到较低版本级别的数据库中。目标数据库的版本级别必须与源数据库相同或更高。例如，您无法将表空间从 Oracle Database 21c 传输到 Oracle Database 19c。
+ 您无法传输诸如 `SYSTEM` 和 `SYSAUX` 之类的管理表空间。
+ 您无法传输非数据对象，例如 PL/SQL 软件包、Java 类、视图、触发器、序列、用户、角色和临时表。要传输非数据对象，请手动创建它们或使用 Data Pump 元数据导出和导入。有关更多信息，请参阅 [My Oracle Support Note 1454872.1](https://support.oracle.com/knowledge/Oracle%20Cloud/1454872_1.html)。
+ 您无法传输已加密或使用加密列的表空间。
+ 如果您使用 Amazon S3 传输文件，则支持的最大文件大小为 5TiB。
+ 如果源数据库使用诸如 Spatial 等 Oracle 选项，则除非在目标数据库上配置了相同的选项，否则无法传输表空间。
+ 在 Oracle 副本配置中，您无法将表空间传输到 RDS for Oracle 数据库实例。解决方法是，您可以删除所有副本，传输表空间，然后重新创建副本。

### 可传输表空间的先决条件
<a name="oracle-migrating-tts.requirements"></a>

 开始之前，完成以下任务：
+ 查看 My Oracle Support 的以下文档中描述的可传输表空间的要求：
  + [使用跨平台增量备份减少可传输表空间停机时间（文档 ID 2471245.1）](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1)
  + [可传输表空间（TTS）局限性和限制：详细信息、参考和适用的版本（文档 ID 1454872.1）](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1454872.1)
  + [可传输表空间（TTS）的主要注意事项 -- 常见疑问和问题（文档 ID 1166564.1）](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1166564.1)
+ 计划字节顺序转换。如果您指定源平台 ID，则 RDS for Oracle 会自动转换字节顺序。要了解如何查找平台 ID，请参阅 [Data Guard 对同一 Data Guard 配置中异构主备用服务器和物理备用服务器的支持（文档 ID 413484.1）](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)。
+ 确保在目标数据库实例上启用了可传输表空间功能。只有在运行以下查询时没有出现 `ORA-20304` 错误的情况下，才会启用该功能：

  ```
  SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files);
  ```

  如果未启用可传输表空间功能，请重启您的数据库实例。有关更多信息，请参阅 [重启数据库实例](USER_RebootInstance.md)。
+ 确保源和目标数据库中的时区文件相同。
+ 确保源数据库和目标数据库上的数据库字符集满足以下任一要求：
  + 字符集是相同的。
  + 字符集是兼容的。有关兼容性要求的列表，请参阅 Oracle 数据库文档中的 [General Limitations on Transporting Data](https://docs.oracle.com/en/database/oracle/oracle-database/19/spmdu/general-limitations-on-transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)。
+ 如果您计划使用 Amazon S3 传输文件，请执行以下操作：
  + 确保 Amazon S3 桶可用于文件传输，并且 Amazon S3 桶与数据库实例处于相同的 Amazon 区域中。有关说明，请参阅 *Amazon Simple Storage Service 入门指南* 中的[创建存储桶](https://docs.amazonaws.cn/AmazonS3/latest/userguide/CreatingABucket.html)。
  + 按照[为与 Amazon S3 集成的 RDS for Oracle 配置 IAM 权限](oracle-s3-integration.preparing.md)中的说明为 Amazon RDS 集成准备 Amazon S3 桶。
+ 如果您计划使用 Amazon EFS 传输文件，请确保已按照[Amazon EFS 集成](oracle-efs-integration.md)中的说明配置 EFS。
+ 我们强烈建议您在目标数据库实例中开启自动备份。由于[元数据导入步骤](#oracle-migrating-tts.transport.import-dmp)可能会失败，因此，必须能够将数据库实例还原到其导入前的状态，从而避免需要再次备份、传输和导入表空间。

## 第 1 阶段：设置源主机
<a name="oracle-migrating-tts.setup-phase"></a>

在此步骤中，您将复制 My Oracle Support 提供的传输表空间脚本，并设置必要的配置文件。在以下步骤中，*源主机*正在运行包含要传输到*目标实例*的表空间的数据库。

**设置您的源主机**

1. 以 Oracle 主目录的所有者身份登录到您的源主机。

1. 确保 `ORACLE_HOME` 和 `ORACLE_SID` 环境变量指向您的源数据库。

1. 以管理员身份登录数据库，并验证时区版本、数据库字符集和国家/地区字符集是否与目标数据库中相同。

   ```
   SELECT * FROM V$TIMEZONE_FILE;
   SELECT * FROM NLS_DATABASE_PARAMETERS 
     WHERE PARAMETER IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
   ```

1. 按照 [Oracle 支持说明 2471245.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1) 中所述，设置可传输表空间实用程序。

   安装包括在源主机上编辑 `xtt.properties` 文件。以下示例 `xtt.properties` 文件指定 `/dsk1/backups` 目录中三个表空间的备份。这些是您打算传输到目标数据库实例的表空间。它还指定源平台 ID 以自动转换字节顺序。
**注意**  
有关有效的平台 ID，请参阅 [Data Guard 对同一 Data Guard 配置中异构主备用服务器和物理备用服务器的支持（文档 ID 413484.1）](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)。

   ```
   #linux system 
   platformid=13
   #list of tablespaces to transport
   tablespaces=TBS1,TBS2,TBS3
   #location where backup will be generated
   src_scratch_location=/dsk1/backups
   #RMAN command for performing backup
   usermantransport=1
   ```

## 第 2 阶段：准备完整的表空间备份
<a name="oracle-migrating-tts.initial-br-phase"></a>

在此阶段中，您将首次备份表空间，将备份传输到目标主机，然后使用过程 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 将其还原。此阶段完成后，初始表空间备份将驻留在您的目标数据库实例上，并且可以使用增量备份进行更新。

**Topics**
+ [步骤 1：备份源主机上的表空间](#oracle-migrating-tts.backup-full)
+ [步骤 2：将备份文件传输到您的目标数据库实例](#oracle-migrating-tts.transfer-full)
+ [步骤 3：在目标数据库实例上导入表空间](#oracle-migrating-tts.initial-tts-import)

### 步骤 1：备份源主机上的表空间
<a name="oracle-migrating-tts.backup-full"></a>

在此步骤中，您将使用 `xttdriver.pl` 脚本对表空间进行完整备份。`xttdriver.pl` 的输出存储在 `TMPDIR` 环境变量中。

**备份您的表空间**

1. 如果您的表空间处于只读模式，请以具有 `ALTER TABLESPACE` 权限的用户身份登录到源数据库，并将表空间置于读/写模式。否则，请跳到下一步。

   以下示例将 `tbs1`、`tbs2` 和 `tbs3` 置于读/写模式。

   ```
   ALTER TABLESPACE tbs1 READ WRITE;
   ALTER TABLESPACE tbs2 READ WRITE;
   ALTER TABLESPACE tbs3 READ WRITE;
   ```

1. 使用 `xttdriver.pl` 脚本备份您的表空间。或者，您可以指定 `--debug` 以在调试模式下运行脚本。

   ```
   export TMPDIR=location_of_log_files
   cd location_of_xttdriver.pl
   $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup
   ```

### 步骤 2：将备份文件传输到您的目标数据库实例
<a name="oracle-migrating-tts.transfer-full"></a>

在此步骤中，将备份和配置文件从临时位置复制到目标数据库实例。请选择以下选项之一：
+ 如果源主机和目标主机共享 Amazon EFS 文件系统，请使用操作系统实用程序（例如 `cp`）将您的备份文件和 `res.txt` 文件从临时位置复制到共享目录。然后跳至 [步骤 3：在目标数据库实例上导入表空间](#oracle-migrating-tts.initial-tts-import)。
+ 如果您需要将备份暂存到 Amazon S3 桶，请完成以下步骤。

![\[使用 Amazon S3 或 Amazon EFS 传输文件。\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/oracle-tts.png)


#### 步骤 2.2：将备份上传到 Amazon S3 桶
<a name="oracle-migrating-tts.upload-full"></a>

将您的备份和 `res.txt` 文件从临时目录上传到您的 Amazon S3 桶。有关更多信息，请参阅《Amazon Simple Storage Service 开发人员指南》**中的[上传对象](https://docs.amazonaws.cn/AmazonS3/latest/userguide/upload-objects.html)。

#### 步骤 2.3：将备份从 Amazon S3 桶下载到目标数据库实例
<a name="oracle-migrating-tts.download-full"></a>

在此步骤中，您将使用过程 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 将备份下载到您的 RDS for Oracle 数据库实例。

**从您的 Amazon S3 桶下载备份**

1. 启动 SQL\$1Plus 或 Oracle SQL Developer，并登录到 RDS for Oracle 数据库实例。

1. 使用 Amazon RDS 过程 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 将备份从 Amazon S3 桶下载到您的目标数据库实例。以下示例将所有文件从名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶下载到 `DATA_PUMP_DIR` 目录中。

   ```
   EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'res.txt');
   SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
     p_bucket_name    =>  'amzn-s3-demo-bucket',
     p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;
   ```

   `SELECT` 语句返回 `VARCHAR2` 数据类型的任务 ID。有关更多信息，请参阅 [将文件从 Amazon S3 存储桶下载到 Oracle 数据库实例](oracle-s3-integration.using.md#oracle-s3-integration.using.download)。

### 步骤 3：在目标数据库实例上导入表空间
<a name="oracle-migrating-tts.initial-tts-import"></a>

使用过程 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 将表空间还原到目标数据库实例。此过程会自动将数据文件转换为正确的字节顺序格式。

如果您从 Linux 以外的平台导入，请在调用 `p_platform_id` 时使用参数 `import_xtts_tablespaces` 指定源平台。确保您指定的平台 ID 与 [步骤 2：在源主机上导出表空间元数据](#oracle-migrating-tts.transport.export) 中 `xtt.properties` 文件中指定的平台 ID 匹配。

**在目标数据库实例上导入表空间**

1. 启动 Oracle SQL 客户端，并以主用户身份登录到目标 RDS for Oracle 数据库实例。

1. 运行过程 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces`，同时指定要导入的表空间和包含备份的目录。

   以下示例从 *DATA\$1PUMP\$1DIR* 目录中导入表空间 *TBS1*、*TBS2* 和 *TBS3*。源平台是基于 AIX 的系统（64 位），其平台 ID 为 `6`。您可以通过查询 `V$TRANSPORTABLE_PLATFORM` 查找平台 ID。

   ```
   VAR task_id CLOB
   
   BEGIN
     :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces(
           'TBS1,TBS2,TBS3',
           'DATA_PUMP_DIR',
           p_platform_id => 6);
   END;
   /
   
   PRINT task_id
   ```

1. （可选）通过查询表 `rdsadmin.rds_xtts_operation_info` 来监控进度。`xtts_operation_state` 列显示值 `EXECUTING`、`COMPLETED` 或 `FAILED`。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**注意**  
对于长时间运行的操作，也可以查询 `V$SESSION_LONGOPS`、`V$RMAN_STATUS` 和 `V$RMAN_OUTPUT`。

1. 使用上一步中的任务 ID 查看已完成的导入的日志。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));
   ```

   在继续下一步之前，请确保导入成功。

## 第 3 阶段：制作和传输增量备份
<a name="oracle-migrating-tts.roll-forward-phase"></a>

在此阶段，您需要在源数据库处于活动状态时定期制作和传输增量备份。此技术减小了最终表空间备份的大小。如果您进行多个增量备份，则必须先在最后一个增量备份之后复制 `res.txt` 文件，然后才能将其应用到目标实例。

步骤与[第 2 阶段：准备完整的表空间备份](#oracle-migrating-tts.initial-br-phase)中的步骤相同，不同之处为导入步骤是可选的。

## 阶段 4：传输表空间
<a name="oracle-migrating-tts.final-br-phase"></a>

在此阶段，您将备份只读表空间并导出 Data Pump 元数据，将这些文件传输到目标主机，然后导入表空间和元数据。

**Topics**
+ [步骤 1：备份只读表空间](#oracle-migrating-tts.final-backup)
+ [步骤 2：在源主机上导出表空间元数据](#oracle-migrating-tts.transport.export)
+ [步骤 3：（仅限 Amazon S3）将备份和导出文件传输到您的目标数据库实例](#oracle-migrating-tts.transport)
+ [步骤 4：在目标数据库实例上导入表空间](#oracle-migrating-tts.restore-full)
+ [步骤 5：在目标数据库实例上导入表空间元数据](#oracle-migrating-tts.transport.import-dmp)

### 步骤 1：备份只读表空间
<a name="oracle-migrating-tts.final-backup"></a>

此步骤与[步骤 1：备份源主机上的表空间](#oracle-migrating-tts.backup-full)相同，但有一个关键区别：在最后一次备份表空间之前，您将表空间置于只读模式。

以下示例将 `tbs1`、`tbs2`、和 `tbs3` 置于只读模式。

```
ALTER TABLESPACE tbs1 READ ONLY;
ALTER TABLESPACE tbs2 READ ONLY;
ALTER TABLESPACE tbs3 READ ONLY;
```

### 步骤 2：在源主机上导出表空间元数据
<a name="oracle-migrating-tts.transport.export"></a>

通过在源主机上运行 `expdb` 实用程序来导出表空间元数据。以下示例将表空间 *TBS1*、*TBS2* 和 *TBS3* 导出到目录 *DATA\$1PUMP\$1DIR* 中的转储文件 *xttdump.dmp*。

```
expdp username/pwd \
dumpfile=xttdump.dmp \
directory=DATA_PUMP_DIR \
statistics=NONE \
transport_tablespaces=TBS1,TBS2,TBS3 \
transport_full_check=y \
logfile=tts_export.log
```

如果 *DATA\$1PUMP\$1DIR* 是 Amazon EFS 中的共享目录，请跳至[步骤 4：在目标数据库实例上导入表空间](#oracle-migrating-tts.restore-full)。

### 步骤 3：（仅限 Amazon S3）将备份和导出文件传输到您的目标数据库实例
<a name="oracle-migrating-tts.transport"></a>

如果您使用 Amazon S3 暂存表空间备份和 Data Pump 导出文件，请完成以下步骤。

#### 步骤 3.1：将备份和转储文件从源主机上传到您的 Amazon S3 桶
<a name="oracle-migrating-tts.transport.upload-dmp"></a>

将您的备份和转储文件从源主机上传到 Amazon S3 桶。有关更多信息，请参阅《Amazon Simple Storage Service 开发人员指南》**中的[上传对象](https://docs.amazonaws.cn/AmazonS3/latest/userguide/upload-objects.html)。

#### 步骤 3.2：将备份和转储文件从 Amazon S3 桶下载到目标数据库实例
<a name="oracle-migrating-tts.transport.download-dmp"></a>

在此步骤中，您将使用过程 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 将备份和转储文件下载到您的 RDS for Oracle 数据库实例。按照 [步骤 2.3：将备份从 Amazon S3 桶下载到目标数据库实例](#oracle-migrating-tts.download-full) 中的步骤操作。

### 步骤 4：在目标数据库实例上导入表空间
<a name="oracle-migrating-tts.restore-full"></a>

使用过程 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` 还原表空间。有关此过程的语法和语义，请参阅[将传输的表空间导入到您的数据库实例](rdsadmin_transport_util_import_xtts_tablespaces.md)

**重要**  
完成最终表空间导入后，下一步是[导入 Oracle Data Pump 元数据](#oracle-migrating-tts.transport.export)。如果导入失败，请务必将数据库实例恢复到失败前的状态。因此，建议您按照[为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)中的说明创建数据库实例的数据库快照。快照将包含所有导入的表空间，因此，如果导入失败，则无需重复备份和导入过程。  
如果您的目标数据库实例已开启自动备份，并且 Amazon RDS 在您导入元数据之前未检测到已启动有效的快照，则 RDS 会尝试创建快照。根据您的实例活动，此快照可能会成功，也可能不成功。如果未检测到有效的快照或无法启动快照，则元数据导入将退出并显示错误。

**在目标数据库实例上导入表空间**

1. 启动 Oracle SQL 客户端，并以主用户身份登录到目标 RDS for Oracle 数据库实例。

1. 运行过程 `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces`，同时指定要导入的表空间和包含备份的目录。

   以下示例从 *DATA\$1PUMP\$1DIR* 目录中导入表空间 *TBS1*、*TBS2* 和 *TBS3*。

   ```
   BEGIN
     :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces('TBS1,TBS2,TBS3','DATA_PUMP_DIR');
   END;
   /
   PRINT task_id
   ```

1. （可选）通过查询表 `rdsadmin.rds_xtts_operation_info` 来监控进度。`xtts_operation_state` 列显示值 `EXECUTING`、`COMPLETED` 或 `FAILED`。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**注意**  
对于长时间运行的操作，也可以查询 `V$SESSION_LONGOPS`、`V$RMAN_STATUS` 和 `V$RMAN_OUTPUT`。

1. 使用上一步中的任务 ID 查看已完成的导入的日志。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));
   ```

   在继续下一步之前，请确保导入成功。

1. 按照[为 Amazon RDS 的单可用区数据库实例创建数据库快照](USER_CreateSnapshot.md)中的说明制作手动数据库快照。

### 步骤 5：在目标数据库实例上导入表空间元数据
<a name="oracle-migrating-tts.transport.import-dmp"></a>

在此步骤中，使用过程 `rdsadmin.rdsadmin_transport_util.import_xtts_metadata` 将可传输的表空间元数据导入您的 RDS for Oracle 数据库实例。有关此过程的语法和语义，请参阅[将可传输的表空间元数据导入到数据库实例中](rdsadmin_transport_util_import_xtts_metadata.md)。在操作期间，导入的状态显示在表 `rdsadmin.rds_xtts_operation_info` 中。

**重要**  
在导入元数据之前，我们强烈建议您确认在导入表空间后已成功创建数据库快照。如果导入步骤失败，请还原数据库实例，解决导入错误，然后再次尝试导入。

**将 Data Pump 元数据导入您的 RDS for Oracle 数据库实例**

1. 启动 Oracle SQL 客户端，并以主用户身份登录到目标数据库实例。

1. 在传输的表空间中创建拥有模式的用户（如果这些用户尚不存在）。

   ```
   CREATE USER tbs_owner IDENTIFIED BY password;
   ```

1. 导入元数据，同时指定转储文件的名称及其目录位置。

   ```
   BEGIN
     rdsadmin.rdsadmin_transport_util.import_xtts_metadata('xttdump.dmp','DATA_PUMP_DIR');
   END;
   /
   ```

1. （可选）查询可传输的表空间历史记录表以查看元数据导入的状态。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```

   操作完成后，您的表空间将处于只读模式。

1. （可选）查看日志文件。

   以下示例列出了 BDUMP 目录的内容，然后查询导入日志。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP'));
   
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file(
     p_directory => 'BDUMP',
     p_filename => 'rds-xtts-import_xtts_metadata-2023-05-22.01-52-35.560858000.log'));
   ```

## 第 5 阶段：验证传输的表空间
<a name="oracle-migrating-tts.validate"></a>

在此可选步骤中，使用过程 `rdsadmin.rdsadmin_rman_util.validate_tablespace` 验证传输的表空间，然后将表空间置于读/写模式。

**验证传输的数据**

1. 启动 SQL\$1Plus 或 SQL Developer，并以主用户身份登录到目标数据库实例。

1. 使用过程 `rdsadmin.rdsadmin_rman_util.validate_tablespace` 验证表空间。

   ```
   SET SERVEROUTPUT ON
   BEGIN
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS1',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS2',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS3',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
   END;
   /
   ```

1. 将表空间置于读/写模式。

   ```
   ALTER TABLESPACE TBS1 READ WRITE;
   ALTER TABLESPACE TBS2 READ WRITE;
   ALTER TABLESPACE TBS3 READ WRITE;
   ```

## 第 6 阶段：清理剩余文件
<a name="oracle-migrating-tts.cleanup"></a>

在此可选步骤中，您将删除所有不需要的文件。使用 `rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` 过程列出表空间导入后孤立的数据文件，然后使用 `rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` 过程删除它们。有关这些过程的语法和语义，请参阅[列出表空间导入后的孤立文件](rdsadmin_transport_util_list_xtts_orphan_files.md)和[表空间导入后的孤立数据文件](rdsadmin_transport_util_cleanup_incomplete_xtts_import.md)。

**清理剩余文件**

1. 按如下方式删除 *DATA\$1PUMP\$1DIR* 中的旧备份：

   1. 通过运行 `rdsadmin.rdsadmin_file_util.listdir` 列出备份文件。

      ```
      SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
      ```

   1. 通过调用 `UTL_FILE.FREMOVE` 逐一删除备份。

      ```
      EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'backup_filename');
      ```

1. 如果您导入了表空间，但没有为这些表空间导入元数据，则可以按如下方式删除孤立的数据文件：

   1. 列出需要删除的孤立数据文件。以下示例运行过程 `rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files`。

      ```
      SQL> SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files);
      
      FILENAME       FILESIZE
      -------------- ---------
      datafile_7.dbf 104865792
      datafile_8.dbf 104865792
      ```

   1. 通过运行过程 `rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import` 删除孤立文件。

      ```
      BEGIN
        rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import('DATA_PUMP_DIR');
      END;
      /
      ```

      清理操作会在 `BDUMP` 目录中生成一个使用名称格式 `rds-xtts-delete_xtts_orphaned_files-YYYY-MM-DD.HH24-MI-SS.FF.log` 的日志文件。

   1. 读取上一步中生成的日志文件。以下示例读取日志 `rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log`。

      ```
      SELECT * 
      FROM TABLE(rdsadmin.rds_file_util.read_text_file(
             p_directory => 'BDUMP',
             p_filename  => 'rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log'));
      
      TEXT
      --------------------------------------------------------------------------------
      orphan transported datafile datafile_7.dbf deleted.
      orphan transported datafile datafile_8.dbf deleted.
      ```

1. 如果您导入了表空间并为这些表空间导入了元数据，但遇到了兼容性错误或其他 Oracle Data Pump 问题，请按如下方式清理部分传输的数据文件：

   1. 通过查询 `DBA_TABLESPACES` 列出包含部分传输的数据文件的表空间。

      ```
      SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE PLUGGED_IN='YES';
      
      TABLESPACE_NAME
      --------------------------------------------------------------------------------
      TBS_3
      ```

   1. 删除表空间和部分传输的数据文件。

      ```
      DROP TABLESPACE TBS_3 INCLUDING CONTENTS AND DATAFILES;
      ```