本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建者:Sai Krishna Namburu (AWS) 和 Sindhusha Paturu (AWS)
摘要
此模式描述了如何在 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 数据拆分为单独的行,然后填充目标表。
先决条件和限制
先决条件
Oracle 数据库表,具有间隔分区和具有 CLOB 数据类型的记录。
Aurora PostgreSQL-Compatible 或 Amazon RDS for PostgreSQL 数据库,其表结构与源表相似(列和数据类型相同)。
限制
CLOB 值不能超过 1 GB。
目标表中的每一行都必须有一个换行符字符标识符。
产品版本
Oracle 12c
Aurora PostgreSQL 11.6
架构
下图显示了包含 CLOB 数据的 Oracle 源表,以及 Aurora PostgreSQL-Compatible 版本 11.6 中的等效 PostgreSQL 表。

工具
Amazon Web Services
Amazon Aurora PostgreSQL 兼容版是一个完全托管的、与 ACID 兼容的关系数据库引擎,可帮助您建立、运行和扩展 PostgreSQL 部署。
Amazon Relational Database Service(Amazon RDS)for PostgreSQL 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展 PostgreSQL 关系数据库。
AWS Database Migration Service (AWS DMS) 可帮助您将数据存储迁移到 Amazon Web Services Cloud,或者在云和本地设置的组合之间迁移。
Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
其他工具
您可以使用以下客户端工具连接、访问和管理 Aurora PostgreSQL-Compatible 数据库和 Amazon RDS for PostgreSQL 数据库。(此模式中不使用这些工具。)
最佳实践
有关将数据库从 Oracle 迁移到 PostgreSQL 的最佳实践,请参阅 AWS Blog 文章将 Oracle 数据库迁移至 Amazon RDS PostgreSQL 或 Amazon Aurora PostgreSQL 的最佳实践:迁移过程和基础设施注意事项
有关配置 AWS DMS 任务以迁移大型二进制对象的最佳实践,请参阅 AWS DMS 文档中的迁移大型二进制对象 (LOBs)。
操作说明
Task | 描述 | 所需技能 |
---|---|---|
分析 CLOB 数据。 | 在 Oracle 源数据库中,分析 CLOB 数据以查看其是否包含列标题,这样您就可以确定将数据加载到目标表中的方法。 要分析输入数据,请使用以下查询。
| 开发人员 |
将 CLOB 数据加载到目标数据库。 | 将包含 CLOB 数据的表迁移到 Aurora 或 Amazon RDS 目标数据库中的临时(暂存)表。您可以使用 AWS DMS,也可以将数据作为 CSV 文件上传到 Amazon S3 存储桶。 有关使用 AWS DMS 完成此任务的信息,请参阅 AWS DMS 文档中的使用 Oracle 数据库作为源以及使用 PostgreSQL 作为目标。 有关使用 Amazon S3 完成此任务的信息,请参阅 AWS DMS 文档中的使用Amazon S3 作为目标。 | 迁移工程师、数据库管理员 |
验证目标 PostgreSQL 表。 | 在目标数据库中使用以下查询,根据源数据验证目标数据(包括标头)。
将结果与源数据库的查询结果(从第一步开始)进行比较。 | 开发人员 |
将 CLOB 数据拆分为单独的行。 | 运行其他信息部分中提供的自定义 PostgreSQL 代码,拆分 CLOB 数据并将其插入目标 PostgreSQL 表中的单独行中。 | 开发人员 |
Task | 描述 | 所需技能 |
---|---|---|
验证目标表中的数据。 | 使用以下查询验证插入到目标表中的数据。
| 开发人员 |
相关资源
其他信息
用于拆分 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 |