本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Aurora BLOB Postgre 中使用文件编码将文件加载到TEXT中-兼容 SQL
由 Bhanu Ganesh Gudivada (AWS) 和 Jeevan Shetty () 创作 AWS
环境: 生产 |
来源: 本地 Oracle 数据库 |
目标: Aurora Postgre SQL-兼容 |
R 类型: 重构 |
工作负载: Oracle;开源 |
技术: 迁移;数据库 |
AWS服务: 亚马逊 Aurora |
Summary
通常,在迁移过程中,您必须处理从本地文件系统上的文件加载的、非结构化和结构化数据。数据也可采用与数据库字符集不同的字符集。
这些文件包含以下类型数据:
-
元数据 - 此数据描述了文件结构。
-
半结构化数据 -这些是特定格式的文本字符串,例如JSON或。XML你可以对此类数据做出断言,例如将始终以“<”开头” 或不包含任何换行符”。
-
全文 - 此数据通常包含所有类型的字符,包括换行符和引号字符。它也可能由 UTF -8 中的多字节字符组成。
-
二进制数据 -此数据可能包含字节或字节组合,包括空值和 end-of-file标记。
混合加载这些类型的数据,可能是一项挑战。
该模式可用于本地 Oracle 数据库、亚马逊弹性计算云 (AmazonEC2) 实例上的亚马逊云服务 (AWS) 云上的 Oracle 数据库和适用于 Oracle 数据库的亚马逊关系数据库服务 (亚马逊RDS)。例如,这种模式使用的是亚马逊 Aurora Postgre SQL 兼容版。
在 Oracle 数据库中,借助
BFILE
(二进制文件)指针、
DBMS_LOB
软件包和 Oracle 系统函数,您可以从文件加载并转换为CLOB使用字符编码。由于 Postgre 在迁移到亚马逊 Aurora Postgre SQL 兼容版数据库时SQL不支持该BLOB数据类型,因此必须将这些函数转换为兼容 Post SQL gre 的脚本。
此模式提供了两种将文件加载到SQL兼容 Amazon Aurora Postgre 的数据库中的单个数据库列的方法:
-
方法 1 — 您通过使用带有编码选项的扩展
table_import_from_s3
aws_s3
函数,从 Amazon Simple Storage Service (Amazon S3) 存储桶导入数据。 -
方法 2 — 在数据库外部编码为十六进制,然后解码以在数据库内部查看
TEXT
。
我们建议使用方法 1,因为 Aurora Postgre SQL-Compatible 已与扩展程序直接集成。
aws_s3
此模式使用将包含电子邮件模板的平面文件加载到兼容 Amazon Aurora Postgr SQL e 的数据库中的示例,该模板具有多字节字符和不同的格式。
先决条件和限制
先决条件
-
一个活跃的AWS账户
-
亚马逊RDS实例或兼容 Aurora Postgre SQL 的实例
-
对关系数据库管理系统的基本了解 (RDBMS) SQL
-
Amazon Simple Storage Service (Amazon S3) 存储桶。
-
了解 Oracle 和 Postgre 中的系统功能 SQL
-
RPMPack HexDump ag XXD e--0.1.1(包含在亚马逊 Linux 2 中)
注意 :亚马逊 Linux 2 的支持已接近终止。有关更多信息,请参阅 亚马逊 Linux 2 FAQs
限制
-
对于
TEXT
数据类型,可以存储的最长字符串约为 1 GB。
产品版本
-
Aurora 支持 亚马逊 Aurora Postgre 更新中列出的 Postgre SQL SQL 版本。
架构
目标技术堆栈
-
Aurora Postgre SQL-兼容
目标架构
方法 1 — 使用 aws_s3.table_import_from_s3
将包含多字节字符和自定义格式的电子邮件模板文件从本地服务器传输至 Amazon S3。本文提供的自定义数据库函数使用带
file_encoding
的
aws_s3.table_import_from_s3
函数将文件加载至数据库,并将查询结果以
TEXT
数据类型的形式返回。

-
文件将传输至 Staging S3 存储桶。
-
文件已上传到SQL兼容 Amazon Aurora Postgre 的数据库。
-
使用 pgAdmin 客户端,将自定义函数
load_file_into_clob
部署到 Aurora 数据库。 -
自定义函数内部
table_import_from_s3
与 file_encoding 一起使用。该函数的输出是通过使用array_to_string
和array_agg
作为TEXT
输出获得。
方法 2 — 在数据库外部编码为十六进制,然后解码以在数据库内部查看 TEXT
来自本地服务器或本地文件系统的文件将转换至十六进制转储。然后,该文件将SQL作为
TEXT
字段导入 Postgre。

-
使用
xxd -p
选项在命令行中将文件转换为十六进制转储。 -
使用
\copy
选项将十六进制转储文件上传到 Aurora Postgre SQL-Compatible 中,然后将十六进制转储文件解码为二进制。 -
编码二进制数据,以返回为
TEXT
。
工具
AWS服务
-
Amazon Aurora Postgre SQL 兼容版是一款 完全托管、ACID兼容的关系数据库引擎,可帮助您设置、操作和扩展 Postgre 部署。SQL
-
AWSCommand Line Interface (AWSCLI) 是一个开源工具,可帮助您通过命令行外壳中的命令与AWS服务进行交互。
其他工具
-
pgAdmin4
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
启动 EC2 实例。 |
有关启动实例的说明,请参阅 启动实例 。 |
DBA |
安装 Postgre SQL 客户端 pgAdmin 工具。 |
下载并安装
pgAdmin
|
DBA |
创建IAM策略。 |
创建名
|
DBA |
创建IAM角色用于将对象从 Amazon S3 导入到 Aurora Postgre SQL-Compatible。 |
使用以下代码创建名为
AssumeRole
|
DBA |
将IAM角色与群集关联。 |
要将该IAM角色与SQL兼容 Aurora Postgre 的数据库集群相关联,请运行以下AWSCLI命令。更改
|
DBA |
将示例上传到 Amazon S3。 |
|
DBA,应用程序所有者 |
部署自定义函数。 |
|
应用程序所有者,DBA |
运行可将数据导入数据库的自定义函数。 |
运行以下SQL命令,将尖括号中的项目替换为相应的值。
运行命令之前,请将尖括号中的项目替换为相应的值,如以下示例所示。
该命令从 Amazon S3 加载文件并将输出返回为
|
应用程序所有者,DBA |
任务 | 描述 | 所需技能 |
---|---|---|
将模板文件转换至十六进制转储。 |
Hexdump 实用程序以十六进制、十进制、八进制或的形式显示二进制文件的内容。ASCII该
要将文件内容转换至十六进制转储,请运行以下 Shell 命令。
将路径和文件替换为相应的值,如以下示例所示。
|
DBA |
将十六进制转储文件加载至数据库架构。 |
使用以下命令将十六进制转储文件加载到 Aurora Postgre 兼容数据库SQL中。
|
DBA |
相关资源
参考
教程
其他信息
load_file_into_clob custom function
CREATE OR REPLACE FUNCTION load_file_into_clob( s3_bucket_name text, s3_bucket_region text, file_name text, file_delimiter character DEFAULT '&'::bpchar, file_encoding text DEFAULT 'UTF8'::text) RETURNS text LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ DECLARE blob_data BYTEA; clob_data TEXT; l_table_name CHARACTER VARYING(50) := 'file_upload_hex'; l_column_name CHARACTER VARYING(50) := 'template'; l_return_text TEXT; l_option_text CHARACTER VARYING(150); l_sql_stmt CHARACTER VARYING(500); BEGIN EXECUTE format ('CREATE TEMPORARY TABLE %I (%I text, id_serial serial)', l_table_name, l_column_name); l_sql_stmt := 'select ''(format text, delimiter ''''' || file_delimiter || ''''', encoding ''''' || file_encoding || ''''')'' '; EXECUTE FORMAT(l_sql_stmt) INTO l_option_text; EXECUTE FORMAT('SELECT aws_s3.table_import_from_s3($1,$2,$6, aws_commons.create_s3_uri($3,$4,$5))') INTO l_return_text USING l_table_name, l_column_name, s3_bucket_name, file_name,s3_bucket_region,l_option_text; EXECUTE format('select array_to_string(array_agg(%I order by id_serial),E''\n'') from %I', l_column_name, l_table_name) INTO clob_data; drop table file_upload_hex; RETURN clob_data; $BODY$;
电子邮件模板
###################################################################################### ## ## ## johndoe Template Type: email ## ## File: johndoe.salary.event.notification.email.vm ## ## Author: Aimée Étienne Date 1/10/2021 ## ## Purpose: Email template used by EmplmanagerEJB to inform a johndoe they ## ## have been given access to a salary event ## ## Template Attributes: ## ## invitedUser - PersonDetails object for the invited user ## ## salaryEvent - OfferDetails object for the event the user was given access ## ## buyercollege - CompDetails object for the college owning the salary event ## ## salaryCoordinator - PersonDetails of the salary coordinator for the event ## ## idp - Identity Provider of the email recipient ## ## httpWebRoot - HTTP address of the server ## ## ## ###################################################################################### $!invitedUser.firstname $!invitedUser.lastname, Ce courriel confirme que vous avez ete invite par $!salaryCoordinator.firstname $!salaryCoordinator.lastname de $buyercollege.collegeName a participer a l'evenement "$salaryEvent.offeringtitle" sur johndoeMaster Sourcing Intelligence. Votre nom d'utilisateur est $!invitedUser.username Veuillez suivre le lien ci-dessous pour acceder a l'evenement. ${httpWebRoot}/myDashboard.do?idp=$!{idp} Si vous avez oublie votre mot de passe, utilisez le lien "Mot de passe oublie" situe sur l'ecran de connexion et entrez votre nom d'utilisateur ci-dessus. Si vous avez des questions ou des preoccupations, nous vous invitons a communiquer avec le coordonnateur de l'evenement $!salaryCoordinator.firstname $!salaryCoordinator.lastname au ${salaryCoordinator.workphone}.