

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

# 使用 PostgreSQL 从 Oracle 迁移到亚马逊 RDS 或亚马逊 Aurora PostgreSQL AWS Schema Conversion Tool
<a name="CHAP_Source.Oracle.ToPostgreSQL"></a>

将 Oracle 数据库转换为适用于 PostgreSQL 的 RDS 或 Amazon Aurora PostgreSQL 时，请注意以下几点。

**Topics**
+ [将 PostgreSQL 用作目标数据库的权限](#CHAP_Source.Oracle.ToPostgreSQL.ConfigureTarget)
+ [Oracle 到 PostgreSQL 的转换设置](#CHAP_Source.Oracle.ToPostgreSQL.ConversionSettings)
+ [转换 Oracle 序列](#CHAP_Source.Oracle.ToPostgreSQL.ConvertSequences)
+ [转换 Oracle ROWID](#CHAP_Source.Oracle.ToPostgreSQL.ConvertRowID)
+ [转换 Oracle 动态 SQL](#CHAP_Source.Oracle.ToPostgreSQL.DynamicSQL)
+ [转换 Oracle 分区](#CHAP_Source.Oracle.ToPostgreSQL.PG10Partitioning)

将 Oracle 系统对象转换为 PostgreSQL 时 AWS SCT ，执行如下表所示的转换。


| Oracle 系统对象 | 说明 | 转换的 PostgreSQL 对象 | 
| --- | --- | --- | 
| V\$1VERSION  | 在 Oracle 数据库中显示核心库组件的版本号 | aws\$1oracle\$1ext.v\$1version | 
| V\$1INSTANCE | 显示当前实例状态的视图。 | aws\$1oracle\$1ext.v\$1instance | 

你可以使用 AWS SCT 将 Oracle SQL\$1Plus 文件转换为 psql，psql 是基于终端的 PostgreSQL 前端。有关更多信息，请参阅 [使用转换应用程序 SQL AWS SCT](CHAP_Converting.App.md)。

## 将 PostgreSQL 用作目标数据库的权限
<a name="CHAP_Source.Oracle.ToPostgreSQL.ConfigureTarget"></a>

要使用 PostgreSQL 作为目标 AWS SCT ，需要权限。`CREATE ON DATABASE`请确保为每个目标 PostgreSQL 数据库授予此权限。

要使用转换后的公共同义词，请将数据库的默认搜索路径更改为 `"$user", public_synonyms, public`。

您可以使用以下代码示例创建数据库用户并授予权限。

```
CREATE ROLE user_name LOGIN PASSWORD 'your_password';
GRANT CREATE ON DATABASE db_name TO user_name;
ALTER DATABASE db_name SET SEARCH_PATH = "$user", public_synonyms, public;
```

在前面的示例中，*user\$1name*使用您的用户名替换。然后，*db\$1name*替换为目标数据库的名称。最后，*your\$1password*替换为安全密码。

要使用适用于 PostgreSQL 的 Amazon RDS 作为目标 AWS SCT ，需要权限。`rds_superuser`

在 PostgreSQL 中，只有架构所有者或 `superuser` 才能删除架构。即使架构的所有者并不拥有架构的某些对象，该所有者也可以删除该架构及其包含的所有对象。

当你使用不同的用户转换不同的架构并将其应用到目标数据库时，当无法删除架构时，你 AWS SCT 可能会收到一条错误消息。要避免出现此错误消息，请使用 `superuser` 角色。

## Oracle 到 PostgreSQL 的转换设置
<a name="CHAP_Source.Oracle.ToPostgreSQL.ConversionSettings"></a>

**要编辑 Oracle 到 PostgreSQL 的转换设置，**请选择** AWS SCT中的设置，然后选择转换设置。**从上面的列表中选择 **Oracle，然后选择 Oracle** **— PostgreSQL**。 AWS SCT 显示了 Oracle 到 PostgreSQL 转换的所有可用设置。

中的 Oracle 到 PostgreSQL 的转换设置包括以下 AWS SCT 各项的选项：
+ 限制转换后的代码中操作项的注释数量。

  对于在**转换后的代码中为所选严重性及更高的措施项添加注释**，请选择措施项的严重性。 AWS SCT 在转换后的代码中为选定严重性及更高的措施项添加注释。

  例如，要最大限度地减少转换后的代码中的注释数量，请选择**仅错误**。要在转换后的代码中包含所有操作项的注释，请选择**所有消息**。
+  AWS SCT 允许在 PostgreSQL 上将 Oracle 实例化视图转换为表或实例化视图。对于**实体化视图转换为**，请选择如何转换源实体化视图。
+ 在源 Oracle 代码中包含带有 PostgreSQL 不支持的参数的 `TO_CHAR`、`TO_DATE` 和 `TO_NUMBER` 函数时使用该代码。默认情况下， AWS SCT 会在转换后的代码中模拟这些参数的用法。

  当源 Oracle 代码仅包含 PostgreSQL 支持的参数时，可以使用原生 PostgreSQL `TO_CHAR`、`TO_DATE` 和 `TO_NUMBER` 函数。在这种情况下，转换后的代码运行更快。要仅包含这些参数，请选择以下值：
  + **函数 TO\$1CHAR() 不使用 Oracle 特定的格式化字符串**
  + **函数 TO\$1DATE() 不使用 Oracle 特定的格式化字符串**
  + **函数 TO\$1NUMBER() 不使用 Oracle 特定的格式化字符串**
+ 要解决源 Oracle 数据库在 `NUMBER` 数据类型的主键列或外键列中仅存储整数值的问题， AWS SCT 可以将这些列转换为 `BIGINT` 数据类型。这种方法可提高转换后的代码的性能。要采用这种方法，请选择**将 NUMBER 主/外键列转换为 BIGINT 列**。请确保源在这些列中不包含浮点值，以避免数据丢失。
+ 跳过源代码中已停用的触发器和约束。为此，请选择**忽略禁用的触发器和约束**。
+ 用于转换 AWS SCT 被称为动态 SQL 的字符串变量。数据库代码可以更改这些字符串变量的值。要确保 AWS SCT 始终转换此字符串变量的最新值，请选择 “**转换在调用例程中创建的动态 SQL 代码**”。
+ 解决 PostgreSQL 版本 10 及更早版本不支持过程的问题。如果你或你的用户不熟悉 PostgreSQL 中的过程的使用，可以将 Oracle 过程转换为 PostgreSQL AWS SCT 函数。为此，请选择**将过程转换为函数**。
+ 查看有关已发生操作项的更多信息。为此，您可以通过选择**添加异常，提高迁移问题块严重性级别**向扩展包中添加特定函数。然后，选择引发用户定义的异常的严重性级别。
+ 使用可能包含自动生成名称的约束的源 Oracle 数据库。如果源代码使用这些名称，请确保选择**使用源的原始名称转换系统生成的约束名称**。如果源代码使用这些约束，但未使用其名称，请清除此选项以提高转换速度。
+ 解决数据库和应用程序在不同的时区运行的问题。默认情况下，在转换后的代码中 AWS SCT 模拟时区。但是，当数据库和应用程序使用相同的时区时，您不需要这种模拟。在这种情况下，选择**客户端时区与服务器端时区相匹配**。
+ 解决源数据库和目标数据库在不同的时区运行的问题。如果是这样，模拟 `SYSDATE` 内置 Oracle 函数的函数会返回与源函数不同的值。要确保源函数和目标函数返回的值相同，请选择**为 SYSDATE 模拟设置默认时区**。
+ 在转换后的代码中使用 orafce 扩展中的函数。为此，在**使用 orafce 实施**中，选择要使用的函数。有关 orace 的更多信息，请参阅 [or](https://github.com/orafce/orafce) ace on。 GitHub

## 转换 Oracle 序列
<a name="CHAP_Source.Oracle.ToPostgreSQL.ConvertSequences"></a>

AWS SCT 将序列从 Oracle 转换为 PostgreSQL。如果您使用序列维护完整性约束，请确保迁移序列的新值不会与现有值重叠。

**使用源数据库中的最后一个值填充转换后的序列**

1. 以 Oracle 为源代码打开您的 AWS SCT 项目。

1. 选择**设置**，然后选择**转换设置**。

1. 从上面的列表中选择 **Oracle**，然后选择 **Oracle – PostgreSQL**。 AWS SCT 显示了 Oracle 到 PostgreSQL 转换的所有可用设置。

1. 选择**使用源端生成的最后一个值填充转换后的序列**。

1. 选择**确定**以保存设置并关闭**转换设置**对话框。

## 转换 Oracle ROWID
<a name="CHAP_Source.Oracle.ToPostgreSQL.ConvertRowID"></a>

 在 Oracle 数据库中，ROWID 伪列包含表行的地址。ROWID 伪列是 Oracle 所独有的，因此在 PostgreSQ AWS SCT L 上将 ROWID 伪列转换为数据列。通过使用此转换，您可以保留 ROWID 信息。

转换 ROWID 伪列时， AWS SCT 可以创建数据类型的数据列。`bigint`如果不存在主键，则将 ROWID 列 AWS SCT 设置为主键。如果存在主键，则使用唯一约束 AWS SCT 设置 ROWID 列。

如果您的源数据库代码包含使用 ROWID 的操作（您无法使用数字数据类型运行这些操作），则 AWS SCT 可以使用该数据类型创建`character varying`数据列。

**为项目的 Oracle ROWID 创建数据列**

1. 以 Oracle 为源代码打开您的 AWS SCT 项目。

1. 选择**设置**，然后选择**转换设置**。

1. 从上面的列表中选择 **Oracle**，然后选择 **Oracle – PostgreSQL**。 AWS SCT 显示了 Oracle 到 PostgreSQL 转换的所有可用设置。

1. 对于**生成行 ID**，执行以下操作之一：
   + 选择**生成为身份**以创建数字数据列。
   + 选择**生成为字符域类型**以创建字符数据列。

1. 选择**确定**以保存设置并关闭**转换设置**对话框。

## 转换 Oracle 动态 SQL
<a name="CHAP_Source.Oracle.ToPostgreSQL.DynamicSQL"></a>

 Oracle 提供了两种实施动态 SQL 的方法：使用 EXECUTE IMMEDIATE 语句或在 DBMS\$1SQL 包中调用过程。如果您的源 Oracle 数据库包含带有动态 SQL 的对象，请使用 AWS SCT 将 Oracle 动态 SQL 语句转换为 PostgreSQL。

**将 Oracle 动态 SQL 转换为 PostgreSQL**

1. 以 Oracle 为源代码打开您的 AWS SCT 项目。

1. 在 Oracle 源树视图中选择使用动态 SQL 的数据库对象。

1. 打开该对象的上下文 (右键单击) 菜单，然后选择 **转换架构**，并同意替换对象（如果存在）。以下屏幕截图显示了使用动态 SQL 的 Oracle 过程下面的已转换过程。  
![\[Dynamic SQL 转换\]](http://docs.aws.amazon.com/zh_cn/SchemaConversionTool/latest/userguide/images/dynamicsql1.png)

## 转换 Oracle 分区
<a name="CHAP_Source.Oracle.ToPostgreSQL.PG10Partitioning"></a>

AWS SCT 目前支持以下分区方法：
+ Range
+ 列表
+ 多列范围
+ 哈希
+ 复合（列表-列表、范围-列表、列表-范围、列表-哈希、范围-哈希、哈希-哈希）