

# 使用 Oracle Data Pump 导入
<a name="Oracle.Procedural.Importing.DataPump"></a>

Oracle Data Pump 是一个实用程序，可让您将 Oracle 数据导出到转储文件并将其导入到另一个 Oracle 数据库。长期来看，它最终会取代 Oracle Export/Import 实用程序。Oracle Data Pump 是将大量数据从 Oracle 数据库迁移到 Amazon RDS 数据库实例的建议方法。

本节中的示例展示了将数据导入 Oracle 数据库的一种方法，但 Oracle Data Pump 支持其他方法。有关更多信息，请参阅 [Oracle Database 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html#GUID-501A9908-BCC5-434C-8853-9A6096766B5A)。

本节中的示例使用 `DBMS_DATAPUMP` 包。您可以使用 Oracle Data Pump 命令行实用程序 `impdp` 和 `expdp` 完成相同的任务。您可以在远程主机上安装这些实用程序以作为 Oracle 客户端安装的一部分，包括 Oracle 即时客户端。有关更多信息，请参阅[如何使用 Oracle Instant Client 为我的 Amazon RDS for Oracle 数据库实例运行 Data Pump 导入或导出？](https://aws.amazon.com/premiumsupport/knowledge-center/rds-oracle-instant-client-datapump/)

**Topics**
+ [Oracle Data Pump 概述](#Oracle.Procedural.Importing.DataPump.Overview)
+ [使用 Oracle Data Pump 和 Amazon S3 存储桶导入数据](#Oracle.Procedural.Importing.DataPump.S3)
+ [使用 Oracle Data Pump 和数据库链接导入数据](#Oracle.Procedural.Importing.DataPump.DBLink)

## Oracle Data Pump 概述
<a name="Oracle.Procedural.Importing.DataPump.Overview"></a>

Oracle Data Pump 由以下组件组成：
+ 命令行客户端 `expdp` 和 `impdp`
+ `DBMS_DATAPUMP` PL/SQL 程序包
+ `DBMS_METADATA` PL/SQL 程序包

您可以将 Oracle Data Pump 用于以下场景：
+ 将数据从 Oracle 数据库（可以是本地或在 Amazon EC2 实例上）导入到 RDS for Oracle 数据库实例。
+ 将数据从 RDS for Oracle 数据库实例导入到 Oracle 数据库（可以是本地或在 Amazon EC2 实例上）。
+ 在 RDS for Oracle 数据库实例之间导入数据，例如将数据从 EC2-Classic 迁移到 VPC。

要下载 Oracle Data Pump 实用工具，请参阅 Oracle Technology Network 网站上的 [Oracle 数据库软件下载](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)。有关在 Oracle Database 的版本之间进行迁移时的兼容性注意事项，请参阅 [Oracle Database 文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-BAA3B679-A758-4D55-9820-432D9EB83C68)。

### Oracle Data Pump 工作流
<a name="Oracle.Procedural.Importing.DataPump.Overview.how-it-works"></a>

通常，您在以下阶段使用 Oracle Data Pump：

1. 将数据导出到源数据库上的转储文件。

1. 将转储文件上载到目标 RDS for Oracle 数据库实例。您可以使用 Amazon S3 桶或使用两个数据库之间的数据库链接进行传输。

1. 将数据从转储文件中导入到 RDS for Oracle 数据库实例。

### Oracle Data Pump 最佳实践
<a name="Oracle.Procedural.Importing.DataPump.Overview.best-practices"></a>

当您使用 Oracle Data Pump 将数据导入到 RDS for Oracle 实例时，我们建议使用以下最佳实践：
+ 在 `schema` 或 `table` 模式中执行导入，以便导入特定架构和对象。
+ 将您导入的架构限制为您的应用程序所需的架构。
+ 请勿在 `full` 模式下导入，也不要导入系统维护的组件的架构。

  因为 RDS for Oracle 不允许 `SYS` 或 `SYSDBA` 管理用户进行访问，所以，这些操作可能会损坏 Oracle 数据词典并影响数据库的稳定性。
+ 加载大量数据时，请执行以下操作：

  1. 将转储文件转移到目标 RDS for Oracle 数据库实例。

  1. 为您的数据库实例拍摄快照。

  1. 测试导入以验证导入是否成功。

  如果数据库组件失效，则您可以删除数据库实例并通过数据库快照重新创建它。还原的数据库实例包括当您拍摄数据库快照时暂存在数据库实例上的任何转储文件。
+ 请勿导入使用 Oracle Data Pump 导出参数 `TRANSPORT_TABLESPACES`、`TRANSPORTABLE`、或 `TRANSPORT_FULL_CHECK` 创建的转储文件。RDS for Oracle 数据库实例不支持导入这些转储文件。
+ 不要导入包含 Oracle 计划程序对象的转储文件 `SYS`、`SYSTEM`、`RDSADMIN`、`RDSSEC` 和 `RDS_DATAGUARD`，以及属于以下类别的文件：
  + 作业
  + 计划
  + Schedules
  + 链
  + 规则
  + 评估背景
  + 规则集

  RDS for Oracle 数据库实例不支持导入这些转储文件。
+ 要排除不受支持的 Oracle 计划程序对象，请在 Data Pump 导出期间使用其他指令。如果您使用 `DBMS_DATAPUMP`，则可以在 `METADATA_FILTER` 之前添加额外的 `DBMS_METADATA.START_JOB`：

  ```
  DBMS_DATAPUMP.METADATA_FILTER(
    v_hdnl,
    'EXCLUDE_NAME_EXPR',
    q'[IN (SELECT NAME FROM SYS.OBJ$ 
           WHERE TYPE# IN (66,67,74,79,59,62,46) 
           AND OWNER# IN
             (SELECT USER# FROM SYS.USER$ 
              WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
              )
          )
    ]',
    'PROCOBJ'
  );
  ```

  如果使用 `expdp`，请创建包含以下示例中所示的 `exclude` 指令的参数文件。然后，将 `PARFILE=parameter_file` 与您的 `expdp` 命令一起使用。

  ```
  exclude=procobj:"IN 
    (SELECT NAME FROM sys.OBJ$
     WHERE TYPE# IN (66,67,74,79,59,62,46) 
     AND OWNER# IN 
       (SELECT USER# FROM SYS.USER$ 
        WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
       )
    )"
  ```

## 使用 Oracle Data Pump 和 Amazon S3 存储桶导入数据
<a name="Oracle.Procedural.Importing.DataPump.S3"></a>

以下导入过程使用 Oracle Data Pump 和 Amazon S3 存储桶。步骤如下所示：

1. 使用 Oracle [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) 程序包导出源数据库上的数据。

1. 将转储文件置于 Amazon S3 桶中。

1. 将转储文件从 Amazon S3 桶下载到目标 RDS for Oracle 数据库实例上的 `DATA_PUMP_DIR` 目录。

1. 使用 `DBMS_DATAPUMP` 程序包，将数据从复制的转储文件导入到 RDS for Oracle 数据库实例。

**Topics**
+ [使用 Oracle Data Pump 和 Amazon S3 桶导入数据的要求](#Oracle.Procedural.Importing.DataPumpS3.requirements)
+ [步骤 1：在 RDS for Oracle 目标数据库实例上向数据库用户授予权限](#Oracle.Procedural.Importing.DataPumpS3.Step1)
+ [步骤 2：使用 DBMS\$1DATAPUMP 将数据导出到转储文件中](#Oracle.Procedural.Importing.DataPumpS3.Step2)
+ [步骤 3：将转储文件上传到 Amazon S3 存储桶。](#Oracle.Procedural.Importing.DataPumpS3.Step3)
+ [步骤 4：将转储文件从 Amazon S3 桶下载到目标数据库实例](#Oracle.Procedural.Importing.DataPumpS3.Step4)
+ [步骤 5：使用 DBMS\$1DATAPUMP 将转储文件导入到目标数据库实例](#Oracle.Procedural.Importing.DataPumpS3.Step5)
+ [步骤 6：清除](#Oracle.Procedural.Importing.DataPumpS3.Step6)

### 使用 Oracle Data Pump 和 Amazon S3 桶导入数据的要求
<a name="Oracle.Procedural.Importing.DataPumpS3.requirements"></a>

此过程有以下要求：
+ 确保 Amazon S3 桶可用于文件传输，并且 Amazon S3 桶与数据库实例处于相同的 AWS 区域中。有关说明，请参阅 *Amazon Simple Storage Service 入门指南* 中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)。
+ 您上传到 Amazon S3 存储桶的对象不得超过 5 TB。有关在 Amazon S3 中使用对象的更多信息，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html)。
**注意**  
如果要转储超过 5 TB 的文件，则可以使用并行选项来运行 Oracle Data Pump 导出。此操作会将数据分散到多个转储文件中，以便不会超过单个文件的 5 TB 限制。
+ 您必须按照 [为与 Amazon S3 集成的 RDS for Oracle 配置 IAM 权限](oracle-s3-integration.preparing.md) 中的说明为 Amazon RDS 集成准备 Amazon S3 存储桶。
+ 您必须确保有足够的存储空间来存储源实例和目标数据库实例上的转储文件。

**注意**  
此过程将转储文件导入到 `DATA_PUMP_DIR` 目录（所有 Oracle 数据库实例上的预配置目录）中。此目录位于您的数据文件所在的存储卷上。当您导入转储文件时，现有 Oracle 文件使用更多空间。因此，您应该确保您的数据库实例可适应这个额外的空间使用。导入的转储文件不会自动从 `DATA_PUMP_DIR` 目录中删除或清除。要删除导入的转储文件，请使用 Oracle 网站上的 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)。

### 步骤 1：在 RDS for Oracle 目标数据库实例上向数据库用户授予权限
<a name="Oracle.Procedural.Importing.DataPumpS3.Step1"></a>

在此步骤中，您将创建您计划向其中导入数据的架构，并向用户授予必要的权限。

**在 RDS for Oracle 目标实例上创建用户并授予必要的权限**

1. 使用 SQL\$1Plus 或 Oracle SQL Developer，作为主用户登录到将向其中导入数据的 RDS for Oracle 数据库实例。有关连接到数据库实例的信息，请参阅[连接到 Oracle 数据库实例](USER_ConnectToOracleInstance.md)。

1. 在导入数据之前，创建所需的表空间。有关更多信息，请参阅 [在 RDS for Oracle 中创建表空间并调整其大小](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)。

1. 如果要向其中导入数据的用户账户不存在，请创建用户账户并授予必需的权限和角色。如果您打算将数据导入到多个用户架构，请创建各个用户账户并向其授予所需的权限和角色。

   例如，以下 SQL 语句创建新的用户并授予所需权限和角色，以将数据导入到此用户拥有的架构中。将 `schema_1` 替换为此步骤中和下列步骤中架构的名称。

   ```
   CREATE USER schema_1 IDENTIFIED BY my_password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

   前面的语句向新用户授予 `CREATE SESSION` 权限和 `RESOURCE` 角色。根据导入的数据库对象，您可能需要其他权限和角色。

### 步骤 2：使用 DBMS\$1DATAPUMP 将数据导出到转储文件中
<a name="Oracle.Procedural.Importing.DataPumpS3.Step2"></a>

要创建转储文件，请使用 `DBMS_DATAPUMP` 程序包。

**将 Oracle 数据导出到转储文件**

1. 使用 SQL Plus 或 Oracle SQL Developer，以管理用户身份连接到源 RDS for Oracle 数据库实例。如果源数据库是 RDS for Oracle 数据库实例，请使用 Amazon RDS 主用户身份进行连接。

1. 通过调用 `DBMS_DATAPUMP` 过程导出数据。

   以下脚本将 `SCHEMA_1` 架构导出到 `DATA_PUMP_DIR` 目录中名为 `sample.dmp` 的转储文件中。将 `SCHEMA_1` 替换为要导出的架构的名称。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN(
       operation => 'EXPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl         , 
       filename  => 'sample.dmp'   , 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_exp.log', 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM SYS.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注意**  
Data Pump 异步启动任务。有关监控 Data Pump 作业的信息，请参阅 Oracle 文档中的[监控作业状态](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。

1. （可选）通过调用 `rdsadmin.rds_file_util.read_text_file` 过程查看导出日志的内容。有关更多信息，请参阅 [读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

### 步骤 3：将转储文件上传到 Amazon S3 存储桶。
<a name="Oracle.Procedural.Importing.DataPumpS3.Step3"></a>

使用 Amazon RDS 过程 `rdsadmin.rdsadmin_s3_tasks.upload_to_s3` 将转储文件复制到 Amazon S3 存储桶中。以下示例将 `DATA_PUMP_DIR` 目录中的所有文件上传到名为 `amzn-s3-demo-bucket` 的 Amazon S3 存储桶中。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
  p_bucket_name    =>  'amzn-s3-demo-bucket',       
  p_directory_name =>  'DATA_PUMP_DIR') 
AS TASK_ID FROM DUAL;
```

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

### 步骤 4：将转储文件从 Amazon S3 桶下载到目标数据库实例
<a name="Oracle.Procedural.Importing.DataPumpS3.Step4"></a>

使用 Amazon RDS 过程 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 执行此步骤。将文件下载到目录时，如果目录中已存在同名文件，则过程 `download_from_s3` 将跳过下载。要从下载目录中删除文件，请使用 Oracle 网站上的 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)。

**下载转储文件**

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

1. 使用 Amazon RDS 过程 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 下载转储文件。

   以下示例将所有文件从名为 `amzn-s3-demo-bucket` 的 Amazon S3 桶下载到 `DATA_PUMP_DIR` 目录中。

   ```
   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)。

### 步骤 5：使用 DBMS\$1DATAPUMP 将转储文件导入到目标数据库实例
<a name="Oracle.Procedural.Importing.DataPumpS3.Step5"></a>

使用 `DBMS_DATAPUMP` 将架构导入到 RDS for Oracle 数据库实例。可能需要额外的选项（例如 `METADATA_REMAP`）。

**将数据导入到目标数据库实例**

1. 启动 SQL\$1Plus 或 SQL Developer 并以主用户身份登录 RDS for Oracle 数据库实例。

1. 通过调用 `DBMS_DATAPUMP` 过程导入数据。

   下面的示例将 *SCHEMA\$11* 数据从 `sample_copied.dmp` 导入到目标数据库实例。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'IMPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_copied.dmp', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_imp.log', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_log_file);
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注意**  
数据抽取任务将异步开始。有关监控 Data Pump 作业的信息，请参阅 Oracle 文档中的[监控作业状态](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。您可以使用 `rdsadmin.rds_file_util.read_text_file` 过程查看导入日志的内容。有关更多信息，请参阅 [读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

1. 通过列出目标数据库实例上的架构表来验证数据导入。

   例如，以下查询将返回 `SCHEMA_1` 的表数量。

   ```
   SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1';
   ```

### 步骤 6：清除
<a name="Oracle.Procedural.Importing.DataPumpS3.Step6"></a>

导入数据后，可以删除不想保留的文件。

**删除不需要的文件**

1. 启动 SQL\$1Plus 或 SQL Developer 并以主用户身份登录 RDS for Oracle 数据库实例。

1. 使用以下命令列出 `DATA_PUMP_DIR` 中的文件。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
   ```

1. 要删除 `DATA_PUMP_DIR` 中不再需要的文件，请使用以下命令。

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

   例如，以下命令删除名为 `sample_copied.dmp` 的文件

   ```
   EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
   ```

## 使用 Oracle Data Pump 和数据库链接导入数据
<a name="Oracle.Procedural.Importing.DataPump.DBLink"></a>

以下导入过程使用 Oracle Data Pump 和 Oracle [DBMS\$1FILE\$1TRANSFER](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_FILE_TRANSFER.html) 包。步骤如下所示：

1. 连接到源 Oracle 数据库，此数据库可以是本地数据库、Amazon EC2 实例 或 RDS for Oracle 数据库实例。

1. 使用 [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) 程序包导出数据。

1. 使用 `DBMS_FILE_TRANSFER.PUT_FILE` 将转储文件从 Oracle 数据库复制到通过数据库链接连接到的目标 RDS for Oracle 数据库实例上的 `DATA_PUMP_DIR` 目录中。

1. 使用 ` DBMS_DATAPUMP` 程序包，将数据从复制的转储文件导入到 RDS for Oracle 数据库实例。

使用 Oracle 数据转储和 `DBMS_FILE_TRANSFER` 包的导入过程具有以下步骤。

**Topics**
+ [使用 Oracle Data Pump 和数据库链接导入数据的要求](#Oracle.Procedural.Importing.DataPumpDBLink.requirements)
+ [步骤 1：在 RDS for Oracle 目标数据库实例上向用户授予权限](#Oracle.Procedural.Importing.DataPumpDBLink.Step1)
+ [步骤 2：向用户授予源数据库权限](#Oracle.Procedural.Importing.DataPumpDBLink.Step2)
+ [步骤 3：使用 DBMS\$1DATAPUMP 创建转储文件](#Oracle.Procedural.Importing.DataPumpDBLink.Step3)
+ [步骤 4：创建目标数据库实例的数据库链接](#Oracle.Procedural.Importing.DataPumpDBLink.Step4)
+ [步骤 5：使用 DBMS\$1FILE\$1TRANSFER 将导出的转储文件复制到目标数据库实例](#Oracle.Procedural.Importing.DataPumpDBLink.Step5)
+ [步骤 6：使用 DBMS\$1DATAPUMP 将数据文件导入到目标数据库实例](#Oracle.Procedural.Importing.DataPumpDBLink.Step6)
+ [步骤 7：清除](#Oracle.Procedural.Importing.DataPumpDBLink.Step7)

### 使用 Oracle Data Pump 和数据库链接导入数据的要求
<a name="Oracle.Procedural.Importing.DataPumpDBLink.requirements"></a>

此过程有以下要求：
+ 您必须对 `DBMS_FILE_TRANSFER` 和 `DBMS_DATAPUMP` 包具有执行权限。
+ 您必须对源数据库实例上的 `DATA_PUMP_DIR` 目录具有写入权限。
+ 您必须确保有足够的存储空间来存储源实例和目标数据库实例上的转储文件。

**注意**  
此过程将转储文件导入到 `DATA_PUMP_DIR` 目录（所有 Oracle 数据库实例上的预配置目录）中。此目录位于您的数据文件所在的存储卷上。当您导入转储文件时，现有 Oracle 文件使用更多空间。因此，您应该确保您的数据库实例可适应这个额外的空间使用。导入的转储文件不会自动从 `DATA_PUMP_DIR` 目录中删除或清除。要删除导入的转储文件，请使用 Oracle 网站上的 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)。

### 步骤 1：在 RDS for Oracle 目标数据库实例上向用户授予权限
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step1"></a>

要向用户授予对 RDS for Oracle 目标数据库实例的权限，请执行以下步骤：

1. 使用 SQL Plus 或 Oracle SQL Developer 连接到要向其中导入数据的 RDS for Oracle 数据库实例。以 Amazon RDS 主用户的身份连接。有关连接到数据库实例的信息，请参阅[连接到 Oracle 数据库实例](USER_ConnectToOracleInstance.md)。

1. 在导入数据之前，创建所需的表空间。有关更多信息，请参阅“[在 RDS for Oracle 中创建表空间并调整其大小](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)”。

1. 如果要导入数据的用户账户不存在，请创建用户账户并授予必需的权限和角色。如果您打算将数据导入到多个用户架构，请创建各个用户账户并向其授予所需的权限和角色。

   例如，以下命令创建名为 *schema\$11* 的新用户，并向此用户授予所需权限和角色，以将数据导入到用户架构中。

   ```
   CREATE USER schema_1 IDENTIFIED BY my-password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

   前一个示例为新用户授予 `CREATE SESSION` 权限和 `RESOURCE` 角色。根据导入的数据库对象，可能需要其他权限和角色。
**注意**  
将 `schema_1` 替换为此步骤中和下列步骤中架构的名称。

### 步骤 2：向用户授予源数据库权限
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step2"></a>

使用 SQL\$1Plus 或 Oracle SQL Developer 连接到包含要导入的数据的 RDS for Oracle 数据库实例。如有必要，可创建用户账户并授予必要权限。

**注意**  
如果源数据库是 Amazon RDS 实例，则可以跳过此步骤。使用您的 Amazon RDS 主用户账户来执行导出。

以下命令创建新用户并授予必要权限。

```
CREATE USER export_user IDENTIFIED BY my-password;
GRANT CREATE SESSION, CREATE TABLE, CREATE DATABASE LINK TO export_user;
ALTER USER export_user QUOTA 100M ON users;
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO export_user;
GRANT SELECT_CATALOG_ROLE TO export_user;
GRANT EXECUTE ON DBMS_DATAPUMP TO export_user;
GRANT EXECUTE ON DBMS_FILE_TRANSFER TO export_user;
```

**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

### 步骤 3：使用 DBMS\$1DATAPUMP 创建转储文件
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step3"></a>

要创建转储文件，请执行以下操作：

1. 使用 SQL\$1Plus 或 Oracle SQL Developer，以管理用户或在步骤 2 中创建的用户身份连接到源 Oracle 实例。如果源数据库是 Amazon RDS for Oracle 数据库实例，请使用 Amazon RDS 主用户身份连接。

1. 使用 Oracle Data Pump 实用程序创建转储文件。

   以下脚本在 `DATA_PUMP_DIR` 目录中创建一个名为 *sample.dmp* 的转储文件。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'EXPORT' , 
       job_mode  => 'SCHEMA' , 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample.dmp'    , 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl           , 
       filename  => 'sample_exp.log' , 
       directory => 'DATA_PUMP_DIR'  , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl              ,
       'SCHEMA_EXPR'       ,
       'IN (''SCHEMA_1'')'
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM sys.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注意**  
数据抽取任务将异步开始。有关监控 Data Pump 作业的信息，请参阅 Oracle 文档中的[监控作业状态](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。您可以使用 `rdsadmin.rds_file_util.read_text_file` 过程查看导出日志的内容。有关更多信息，请参阅“[读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)”。

### 步骤 4：创建目标数据库实例的数据库链接
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step4"></a>

在源数据库实例和目标数据库实例之间创建数据库链接。您的本地 Oracle 实例必须具有至数据库实例的网络连接，然后才能创建数据库链接以及传输导出转储文件。

执行此步骤，使用与上一步中相同的用户账户连接。

如果您将在同一 VPC 或对等 VPC 中的两个数据库实例之间创建数据库链接，则这两个数据库实例之间应具有有效路由。每个数据库实例的安全组必须允许另一个数据库实例的传入和传出。安全组入站和出站规则可引用同一 VPC 或对等 VPC 中的安全组。有关更多信息，请参阅“[在 VPC 中调整用于数据库实例的数据库链接](Appendix.Oracle.CommonDBATasks.DBLinks.md)”。

以下命令创建名为 `to_rds` 的数据库链接，连接到位于目标数据库实例中的 Amazon RDS 主用户。

```
CREATE DATABASE LINK to_rds 
  CONNECT TO <master_user_account> IDENTIFIED BY <password>
  USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>)
         (PORT=<listener port>))(CONNECT_DATA=(SID=<remote SID>)))';
```

### 步骤 5：使用 DBMS\$1FILE\$1TRANSFER 将导出的转储文件复制到目标数据库实例
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step5"></a>

使用 `DBMS_FILE_TRANSFER` 将转储文件从源数据库实例复制到目标数据库实例。以下脚本将名为 sample.dmp 的转储文件从源实例复制到名为 *to\$1rds* 的目标数据库链接（已在上一步中创建）。

```
BEGIN
  DBMS_FILE_TRANSFER.PUT_FILE(
    source_directory_object       => 'DATA_PUMP_DIR',
    source_file_name              => 'sample.dmp',
    destination_directory_object  => 'DATA_PUMP_DIR',
    destination_file_name         => 'sample_copied.dmp', 
    destination_database          => 'to_rds' );
END;
/
```

### 步骤 6：使用 DBMS\$1DATAPUMP 将数据文件导入到目标数据库实例
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step6"></a>

在数据库实例中使用 Oracle Data Pump 导入架构。可能需要额外选项（例如，METADATA\$1REMAP）。

 使用 Amazon RDS 主用户账户连接到数据库实例来执行导入。

```
DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN( 
    operation => 'IMPORT', 
    job_mode  => 'SCHEMA', 
    job_name  => null);
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_copied.dmp',
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_dump_file );
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_imp.log', 
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/
```

**注意**  
数据抽取任务将异步开始。有关监控 Data Pump 作业的信息，请参阅 Oracle 文档中的[监控作业状态](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。您可以使用 `rdsadmin.rds_file_util.read_text_file` 过程查看导入日志的内容。有关更多信息，请参阅“[读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)”。

您可以通过查看数据库实例上用户的表来验证数据导入。例如，以下查询将返回 `schema_1` 的表数量。

```
SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1'; 
```

### 步骤 7：清除
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step7"></a>

导入数据后，可以删除不想保留的文件。您可以使用以下命令列出 `DATA_PUMP_DIR` 中的文件。

```
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
```

要删除 `DATA_PUMP_DIR` 中不再需要的文件，请使用以下命令。

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','<file name>');
```

例如，以下命令删除名为 `"sample_copied.dmp"` 的文件 

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
```