

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

# 使用 AWS DMS 将 Oracle 分区表迁移到 PostgreSQL
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms"></a>

*Saurav Mishra 和 Eduardo Valentim，Amazon Web Services*

## Summary
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-summary"></a>

此模式描述如何使用不支持本机分区的 AWS Database Migration Service (AWS DMS) 加速将分区表从 Oracle 加载到 PostgreSQL。目标 PostgreSQL 数据库可以安装在亚马逊弹性计算云（亚马逊）上，也可以是适用于 PostgreSQL 的 EC2亚马逊关系数据库服务 (Amazon RDS) 或兼容亚马逊 Aurora PostgreSQL 的版本数据库实例。 

分区表上传包括以下步骤：

1. 创建类似于 Oracle 分区表的父表，但不包含任何分区。

1. 创建将从步骤 1 中创建的父表继承的子表。

1. 创建过程函数和触发器以处理父表中的插入。

但是，由于每次插入都会触发触发器，因此使用 AWS DMS 的初始加载可能会非常慢。

为了加快从 Oracle 到 PostgreSQL 9.0 的初始加载速度，此模式为每个分区创建一个单独的 AWS DMS 任务并加载相应的子表。然后，您可以在割接期间创建触发器。 

PostgreSQL 版本 10 支持本机分区。但是，在某些情况下，您可能会决定使用继承分区。有关更多信息，请参阅[其他信息](#migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-additional)部分。

## 先决条件和限制
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 具有分区表的源 Oracle 数据库
+ AWS 上的 PostgreSQL 数据库

**产品版本**
+ PostgreSQL 9.0

## 架构
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-architecture"></a>

**源技术堆栈**
+ Oracle 中的分区表

**目标技术堆栈**
+ PostgreSQL 中的分区表（在 EC2亚马逊上、适用于 PostgreSQL 的亚马逊 RDS 或 Aurora PostgreSQL 上）

**目标架构**

![\[每个分区的数据从 Oracle 中的分区表移至 AWS DMS 任务，然后导入 PostgreSQL。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/7fa2898e-3308-436a-aec8-ab6f680d7bac/images/1b9742ea-a13d-434c-83a7-56686cf76ea0.png)


## 工具
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-tools"></a>
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到 Amazon Web Services Cloud，或者在云和本地设置的组合之间迁移。

## 操作说明
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-epics"></a>

### 设置 AWS DMS
<a name="set-up-aws-dms"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 PostgreSQL 中创建表。 | 使用所需分区检查条件在 PostgreSQL 中创建父表和相应子表。 | 数据库管理员 | 
| 为每个分区创建 AWS DMS 任务。 | 在 AWS DMS 任务中包括分区的筛选条件。将分区映射至相应的 PostgreSQL 子表。 | 数据库管理员 | 
| 使用满载操作和更改数据捕获 (CDC) 运行 AWS DMS 任务。 | 确保将 `StopTaskCachedChangesApplied` 参数设置为 `true`，将 `StopTaskCachedChangesNotApplied` 参数设置为 `false`。 | 数据库管理员 | 

### 割接
<a name="cut-over"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止复制任务。 | 在停止任务之前，请确认源和目标是否同步。 | 数据库管理员 | 
| 在父表创建触发器。 | 由于父表将接收所有插入和更新命令，因此创建一个触发器，根据分区条件将这些命令路由到相应的子表。 | 数据库管理员 | 

## 相关的资源
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-resources"></a>
+ [AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)
+ [表分区 （PostgreSQL 文档）](https://www.postgresql.org/docs/10/ddl-partitioning.html)

## 附加信息
<a name="migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms-additional"></a>

尽管 PostgreSQL 版本 10 支持原生分区，但您可能决定在以下用例中使用继承分区：
+ 分区强制执行一条规则，即所有分区必须具有与父分区相同的列集，但表继承支持子分区具有额外的列。
+ 表继承支持多重继承。
+ 声明式分区仅支持列表与范围分区。通过表继承，您可按需要划分数据。但是，如果约束排除不能有效地修剪分区，查询性能将会受到影响。
+ 使用声明性分区时，某些运算需要比使用表继承时更强的锁。例如，在分区表中添加分区或从分区表中删除分区需要 `ACCESS EXCLUSIVE` 锁定父表，而 `SHARE UPDATE EXCLUSIVE` 锁足以进行常规继承。

当您使用单独作业分区时，如果存在任何 AWS DMS 验证问题，您还可以重新加载分区。为了获得更好的性能和复制控制，请在单独的复制实例上运行任务。