

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

# 将 Oracle CLOB 值迁移到 AWS 上 PostgreSQL 中的单独的行
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws"></a>

*Sai Krishna Namburu 和 Sindhusha Paturu，Amazon Web Services*

## Summary
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-summary"></a>

此模式描述了如何在 Amazon Aurora PostgreSQL-Compatible Edition 和 Amazon Relational Database Service（Amazon RDS）for PostgreSQL 中将 Oracle 字符大型对象（CLOB）值拆分为单独的行。PostgreSQL 不支持 CLOB 数据类型。

在 Oracle 源数据库中标识具有间隔分区的表，并捕获表名、分区类型、分区间隔和其他元数据并将其加载到目标数据库中。您可以使用 AWS Database Migration Service（AWS DMS）将大小小于 1 GB 的 CLOB 数据作为文本加载到目标表中，也可以用 CSV 格式导出数据，将其加载到 Amazon Simple Storage Service（Amazon S3）存储桶中，然后将其迁移到目标 PostgreSQL 数据库。

迁移后，您可以使用此模式提供的自定义 PostgreSQL 代码，根据换行符标识符（`CHR(10)`）将 CLOB 数据拆分为单独的行，然后填充目标****表。 

## 先决条件和限制
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-prereqs"></a>

**先决条件**
+ Oracle 数据库表，具有间隔分区和具有 CLOB 数据类型的记录。
+ Aurora PostgreSQL-Compatible 或 Amazon RDS for PostgreSQL 数据库，其表结构与源表相似（列和数据类型相同）。

**限制**
+ CLOB 值不能超过 1 GB。
+ 目标表中的每一行都必须有一个换行符字符标识符。

**产品版本**
+ Oracle 12c
+ Aurora PostgreSQL 11.6

## 架构
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-architecture"></a>

下图显示了包含 CLOB 数据的 Oracle 源表，以及 Aurora PostgreSQL-Compatible 版本 11.6 中的等效 PostgreSQL 表。

![CLOB 源表和等效的 PostgreSQL 目标表。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/55806ee7-6a9f-4058-9a47-a07de68223ca/images/79b9d4b9-6f20-4db5-8ca8-2a599769a498.png)


## 工具
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora PostgreSQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是一个完全托管的、与 ACID 兼容的关系数据库引擎，可帮助您建立、运行和扩展 PostgreSQL 部署。
+ [Amazon Relational Database Service（Amazon RDS）for PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展 PostgreSQL 关系数据库。
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到 Amazon Web Services Cloud，或者在云和本地设置的组合之间迁移。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**其他工具**

您可以使用以下客户端工具连接、访问和管理 Aurora PostgreSQL-Compatible 数据库和 Amazon RDS for PostgreSQL 数据库。（此模式中不使用这些工具。）
+ [pgAdmin](https://www.pgadmin.org/) 是一种适用于 PostgreSQL 的开源管理工具。它提供了一个图形界面，可帮助您创建、维护和使用数据库对象。
+ [DBeaver](https://dbeaver.io/)是面向开发人员和数据库管理员的开源数据库工具。您可以使用该工具来操作、监控、分析、管理和迁移数据。

## 最佳实践
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-best-practices"></a>

有关将数据库从 Oracle 迁移到 PostgreSQL 的最佳实践，请参阅 AWS Blog 文章[将 Oracle 数据库迁移至 Amazon RDS PostgreSQL 或 Amazon Aurora PostgreSQL 的最佳实践：迁移过程和基础设施注意事项](https://aws.amazon.com/blogs/database/best-practices-for-migrating-an-oracle-database-to-amazon-rds-postgresql-or-amazon-aurora-postgresql-migration-process-and-infrastructure-considerations/)。

有关配置 AWS DMS 任务以迁移大型二进制对象的最佳实践，请参阅 AWS DMS 文档中的[迁移大型二进制对象 (LOBs)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_BestPractices.html#CHAP_BestPractices.LOBS)。

## 操作说明
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-epics"></a>

### 识别 CLOB 数据
<a name="identify-the-clob-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 分析 CLOB 数据。 | 在 Oracle 源数据库中，分析 CLOB 数据以查看其是否包含列标题，这样您就可以确定将数据加载到目标表中的方法。 <br />要分析输入数据，请使用以下查询。<br />`SELECT * FROM clobdata_or;  ` | 开发者版 | 
| 将 CLOB 数据加载到目标数据库。 | 将包含 CLOB 数据的表迁移到 Aurora 或 Amazon RDS 目标数据库中的临时（暂存）表。您可以使用 AWS DMS，也可以将数据作为 CSV 文件上传到 Amazon S3 存储桶。<br />有关使用 AWS DMS 完成此任务的信息，请参阅 AWS DMS 文档中的[使用 Oracle 数据库作为源](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html)以及[使用 PostgreSQL 作为目标](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)。<br />有关使用 Amazon S3 完成此任务的信息，请参阅 AWS DMS 文档中的[使用Amazon S3 作为目标](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html)。 | 迁移工程师、数据库管理员 | 
| 验证目标 PostgreSQL 表。 | 在目标数据库中使用以下查询，根据源数据验证目标数据（包括标头）。<pre>SELECT * FROM clobdata_pg;<br />SELECT * FROM clobdatatarget;</pre><br />将结果与源数据库的查询结果（从第一步开始）进行比较。 | 开发者版 | 
| 将 CLOB 数据拆分为单独的行。 | 运行[其他信息](#migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-additional)部分中提供的自定义 PostgreSQL 代码，拆分 CLOB 数据并将其插入目标 PostgreSQL 表中的单独行中。 | 开发者版 | 

### 验证数据。
<a name="validate-the-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证目标表中的数据。 | 使用以下查询验证插入到目标表中的数据。<pre>SELECT * FROM clobdata_pg;<br />SELECT * FROM clobdatatarget;</pre> | 开发者版 | 

## 相关资源
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-resources"></a>
+ [CLOB 数据类型](https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF0021)（Oracle 文档）
+ [数据类型](https://www.postgresql.org/docs/11/datatype.html)（PostgreSQL 文档）

## 附加信息
<a name="migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws-additional"></a>

**用于拆分 CLOB 数据的 PostgreSQL 函数**

```
do
$$
declare
totalstr varchar;
str1 varchar;
str2 varchar;
pos1 integer := 1;
pos2 integer ;
len integer;


begin
        select rawdata||chr(10) into totalstr from clobdata_pg;
        len :=  length(totalstr) ;
        raise notice 'Total length : %',len;
        raise notice 'totalstr : %',totalstr;
        raise notice 'Before while loop';


        while pos1 < len  loop


                  select position (chr(10) in totalstr) into pos2;
                 raise notice '1st position of new line : %',pos2;


                str1 := substring (totalstr,pos1,pos2-1);
                raise notice 'str1 : %',str1;


                   insert into clobdatatarget(data) values (str1);
                   totalstr := substring(totalstr,pos2+1,len);
                   raise notice 'new totalstr :%',totalstr;
                len :=  length(totalstr) ;


        end loop;
end
$$
LANGUAGE 'plpgsql' ;
```

**输入和输出示例**

在迁移数据之前，您可以使用以下示例试用 PostgreSQL 代码。

创建一个包含三行输入的 Oracle 数据库。

```
CREATE TABLE clobdata_or (
id INTEGER GENERATED ALWAYS AS IDENTITY,
rawdata clob  );


insert into clobdata_or(rawdata) values (to_clob('test line 1') || chr(10) || to_clob('test line 2') || chr(10) || to_clob('test line 3') || chr(10));
COMMIT;


SELECT * FROM clobdata_or;
```

这会显示以下输出。


|  |  | 
| --- |--- |
| id | rawdata | 
| 1 | 测试行 1 测试行 2 测试行 3 | 

将源数据加载到 PostgreSQL 暂存表（`clobdata_pg`）中进行处理。

```
SELECT * FROM clobdata_pg;

CREATE TEMP TABLE clobdatatarget (id1 SERIAL,data VARCHAR );

<Run the code in the additional information section.>

SELECT * FROM clobdatatarget;
```

这会显示以下输出。


|  |  | 
| --- |--- |
| id1 | 数据 | 
| 1 | 测试行 1 | 
| 2 | 测试行 2 | 
| 3 | 测试行 3 | 