

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Oracle 数据泵将本地 Oracle 数据库迁移到 Amazon RDS for Oracle
<a name="migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump"></a>

*Mohan Annam 和 Brian motzer，Amazon Web Services*

## Summary
<a name="migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump-summary"></a>

此模式描述了如何使用 Oracle 数据泵将 Oracle 数据库从本地数据中心迁移到 Amazon Relational Database Service（Amazon RDS）for Oracle 数据库实例。 

该模式包括从源数据库创建数据转储文件，将文件存储在 Amazon Simple Storage Service（Amazon S3）存储桶中，然后将数据恢复到 Amazon RDS for Oracle 数据库实例中。当您使用 AWS Database Migration Service（AWS DMS）进行迁移遇到限制时，此模式非常有用。

## 先决条件和限制
<a name="migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 在 AWS Identity and Access Management (IAM) 中创建角色以及 Amazon S3 分段上传所需权限
+ 从源数据库导出数据所需权限
+ AWS 命令行界面（AWS CLI）[已安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)

**产品版本**
+ Oracle 数据泵仅适用于 Oracle 数据库 10g 发行版 1 (10.1) 及更高版本。

## 架构
<a name="migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump-architecture"></a>

**源技术堆栈**
+ 本地 Oracle 数据库

**目标技术堆栈**
+ Amazon RDS for Oracle
+ SQL 客户端（Oracle SQL 开发人员）
+ 一个 S3 存储桶

**源架构和目标架构**

![使用 Oracle Data Pump 将 Amazon S3 数据分段从本地 Oracle 数据库上传到 Amazon RDS。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/d8d6e00f-753e-4ecc-80e5-e60e279a699b/images/1bb6095a-0a95-4469-be0e-7b7bd59b35ae.png)


## 工具
<a name="migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump-tools"></a>

**Amazon Web Services**
+ [AWS Identity and Access Management (AWS IAM) ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)通过控制验证和授权使用您 AWS 资源的用户，帮助您安全地管理对您 AWS 资源的访问。在这种模式中，IAM 用于创建将数据从 Amazon S3 迁移到 Amazon RDS for Oracle 所需角色和策略。
+ [Amazon Relational Database Service (Amazon RDS) for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩缩 Oracle 关系数据库。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**其他工具**
+ [Oracle 数据泵](https://docs.oracle.com/cd/B19306_01/server.102/b14215/dp_overview.htm)可帮助您将数据和元数据从一个数据库高速移动至另一个数据库。在这种模式中，Oracle 数据泵用于将数据转储 (.dmp) 文件导出到 Oracle 服务器，然后将其导入到 Amazon RDS for Oracle 中。有关更多信息，请参阅 Amazon RDS 文档中的[将数据导入到 Amazon RDS 上的 Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Oracle.Procedural.Importing.html#Oracle.Procedural.Importing.DataPump.S3)。
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) 是一个集成的开发环境，可简化传统部署和基于云的部署中 Oracle 数据库的开发和管理。它与本地 Oracle 数据库和 Amazon RDS for Oracle 交互，运行导出和导入数据所需 SQL 命令。

## 操作说明
<a name="migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump-epics"></a>

### 创建 S3 存储桶
<a name="create-an-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建存储桶。 | 要创建 S3 存储桶，请按照 [AWS 文档](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)中的说明进行操作。 | AWS 系统管理员 | 

### 创建 IAM 角色并分配策略
<a name="create-the-iam-role-and-assign-policies"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置 IAM 权限。 | 要配置权限，请按照 [AWS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-s3-integration.html#oracle-s3-integration.preparing)中的说明进行操作。 | AWS 系统管理员 | 

### 创建 Amazon RDS for Oracle 目标数据库实例并关联 Amazon S3 集成角色
<a name="create-the-target-amazon-rds-for-oracle-db-instance-and-associate-the-amazon-s3-integration-role"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Amazon RDS for Oracle 目标数据库实例。 | 要创建 Amazon RDS for Oracle 实例，请按照 [AWS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html)中的说明进行操作。 | AWS 系统管理员 | 
| 将该角色与数据库实例关联。 | 要将角色与实例关联，请按照 [AWS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-s3-integration.html#oracle-s3-integration.preparing.instance)中的说明进行操作。 | 数据库管理员 | 

### 在目标数据库上创建数据库用户
<a name="create-the-database-user-on-the-target-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 用户。 | 连接来自 Oracle SQL Developer 或 SQL\*Plus 的 Amazon RDS for Oracle 目标数据库，然后运行以下 SQL 命令来创建要将架构导入的用户。<pre>create user SAMPLE_SCHEMA identified by <PASSWORD>;<br />grant create session, resource to <USER NAME>;<br />alter user <USER NAME> quota 100M on users;</pre> | 数据库管理员 | 

### 从 Oracle 源数据库创建导出文件
<a name="create-the-export-file-from-the-source-oracle-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建数据转储文件。 | 要在 `DATA_PUMP_DIR` 目录中创建名为 `sample.dmp` 的转储文件（用于导出 `SAMPLE_SCHEMA` 用户），请使用以下脚本。<pre>DECLARE<br />    hdnl NUMBER;<br />BEGIN<br />    hdnl := dbms_datapump.open(operation => 'EXPORT', <br />                                job_mode => 'SCHEMA', <br />                                job_name => NULL);<br /><br />    dbms_datapump.add_file( handle => hdnl, <br />                            filename => 'sample.dmp', <br />                            directory => 'DATA_PUMP_DIR', <br />                            filetype => dbms_datapump.ku$_file_type_dump_file);<br /><br />    dbms_datapump.add_file(handle => hdnl, <br />                            filename => 'export.log', <br />                            directory => 'DATA_PUMP_DIR', <br />                            filetype => dbms_datapump.ku$_file_type_log_file);<br /><br />    dbms_datapump.metadata_filter(hdnl, 'SCHEMA_EXPR', 'IN (''SAMPLE_SCHEMA'')');  <br /><br />    dbms_datapump.start_job(hdnl);<br />END;<br />/</pre><br />通过查看本地 `DATA_PUMP_DIR` 目录中的 `export.log` 文件来查看导出详细信息。 | 数据库管理员 | 

### 将转储文件上传到 S3 存储桶中
<a name="upload-the-dump-file-to-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将数据转储文件从源上传到 S3 存储桶。 | 使用 AWS CLI 运行以下命令。<pre>aws s3 cp sample.dmp s3://<bucket_created_epic_1>/</pre> | 数据库管理员 | 

### 将导出文件从 S3 存储桶下载到 RDS 实例
<a name="download-the-export-file-from-the-s3-bucket-to-the-rds-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将数据转储文件下载到 Amazon RDS | 要将转储文件 `sample.dmp` 从 S3 存储桶复制到 Amazon RDS for Oracle 数据库，请运行以下 SQL 命令。在此示例中，`sample.dmp` 文件从 S3 存储桶 `my-s3-integration1` 下载到 Oracle 目录 `DATA_PUMP_DIR`。确保分配给 RDS 实例的磁盘空间足以容纳数据库和导出文件。<pre>-- If you want to download all the files in the S3 bucket remove the p_s3_prefix line.<br /><br />SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(<br />      p_bucket_name    =>  'my-s3-integration',    <br />      p_s3_prefix => 'sample.dmp',<br />      p_directory_name =>  'DATA_PUMP_DIR') <br />   AS TASK_ID FROM DUAL;</pre><br />前述命令输出一个任务 ID。要通过查看任务 ID 中的数据来查看下载状态，请运行以下命令。<pre>SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-<task_id>.log'));<br /><br /></pre><br />要查看 `DATA_PUMP_DIR` 目录中的文件，请运行以下命令。<pre>SELECT filename,type,filesize/1024/1024 size_megs,to_char(mtime,'DD-MON-YY HH24:MI:SS') timestamp<br />FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => upper('DATA_PUMP_DIR'))) order by 4;</pre> | AWS 系统管理员 | 

### 将转储文件导入到目标数据库中
<a name="import-the-dump-file-into-the-target-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将架构和数据恢复到 Amazon RDS。 | 要将转储文件导入 `sample_schema` 数据库架构，请从 SQL Developer 或 SQL\*Plus 中运行以下 SQL 命令。<pre>DECLARE<br />hdnl NUMBER;<br />BEGIN<br /><br />hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null);<br /><br />DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'sample.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);<br /><br />DBMS_DATAPUMP.ADD_FILE( handle    => hdnl, filename  => 'import.log', directory => 'DATA_PUMP_DIR', filetype  => dbms_datapump.ku$_file_type_log_file);<br /><br />DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''SAMPLE_SCHEMA'')');<br /><br />DBMS_DATAPUMP.START_JOB(hdnl);<br /><br />END;<br />/</pre><br />要查看导入后的日志文件，请运行以下命令。<pre>SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR','import.log'));</pre> | 数据库管理员 | 

### 从 DATA\_PUMP\_DIR 目录中移除转储文件
<a name="remove-the-dump-file-from-the-data_pump_dir-directory"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 列出并清理导出文件。 | 列出并删除 `DATA_PUMP_DIR` 目录中的导出文件，运行以下命令。<pre>-- List the files<br />SELECT filename,type,filesize/1024/1024 size_megs,to_char(mtime,'DD-MON-YY HH24:MI:SS') timestamp FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => upper('DATA_PUMP_DIR'))) order by 4;</pre><pre>-- Remove the files<br />EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample.dmp');<br />EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','import.log');</pre> | AWS 系统管理员 | 

## 相关资源
<a name="migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump-resources"></a>
+ [Amazon S3 集成](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-s3-integration.html#oracle-s3-integration.preparing)
+ [创建数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateDBInstance.html)
+ [将数据导入到 Amazon RDS 上的 Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Oracle.Procedural.Importing.html#Oracle.Procedural.Importing.DataPump.S3)
+ [Amazon S3 文档](https://docs.aws.amazon.com/s3/index.html)
+ [IAM 文档](https://docs.aws.amazon.com/iam/index.html)
+ [Amazon RDS 文档](https://docs.aws.amazon.com/rds/index.html)
+ [Oracle 数据泵文档](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html)
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/)