添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
在 Aurora BLOB Postgre 中使用文件编码将文件加载到TEXT中-兼容 SQL - AWS Prescriptive Guidance

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

在 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 Postgre SQL-兼容

目标架构

方法 1 — 使用 aws_s3.table_import_from_s3

将包含多字节字符和自定义格式的电子邮件模板文件从本地服务器传输至 Amazon S3。本文提供的自定义数据库函数使用带 file_encoding aws_s3.table_import_from_s3 函数将文件加载至数据库,并将查询结果以 TEXT 数据类型的形式返回。

从本地服务器到 Aurora 数据库TEXT输出的过程分为四步。
  1. 文件将传输至 Staging S3 存储桶。

  2. 文件已上传到SQL兼容 Amazon Aurora Postgre 的数据库。

  3. 使用 pgAdmin 客户端,将自定义函数 load_file_into_clob 部署到 Aurora 数据库。

  4. 自定义函数内部 table_import_from_s3 与 file_encoding 一起使用。该函数的输出是通过使用 array_to_string array_agg 作为 TEXT 输出获得。

方法 2 — 在数据库外部编码为十六进制,然后解码以在数据库内部查看 TEXT

来自本地服务器或本地文件系统的文件将转换至十六进制转储。然后,该文件将SQL作为 TEXT 字段导入 Postgre。

使用十六进制转储的三步过程。
  1. 使用 xxd -p 选项在命令行中将文件转换为十六进制转储。

  2. 使用 \copy 选项将十六进制转储文件上传到 Aurora Postgre SQL-Compatible 中,然后将十六进制转储文件解码为二进制。

  3. 编码二进制数据,以返回为 TEXT

工具

AWS服务

其他工具

  • pgAdmin4 是 Postg SQL re 的开源管理和开发平台。pgAdmin4 可以在 Linux、Unix、Mac OS 和 Windows 上用来管理 Postgre。SQL

操作说明

任务 描述 所需技能

启动 EC2 实例。

有关启动实例的说明,请参阅 启动实例

DBA

安装 Postgre SQL 客户端 pgAdmin 工具。

下载并安装 pgAdmin

DBA

创建IAM策略。

创建名 aurora-s3-access-pol 为的 Id AWS entity and Access Management (IAM) 策略,该策略授予对存储文件的 S3 存储桶的访问权限。请使用以下代码,将 <bucket-name> 替换为您的 S3 存储桶名称。

{ "Version": "2012-10-17", "Statement": [ "Effect": "Allow", "Action": [ "s3:GetObject", "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:PutObject", "s3:ListBucket" "Resource": [ "arn:aws:s3:::<bucket-name>/*", "arn:aws:s3:::<bucket-name>" }
DBA

创建IAM角色用于将对象从 Amazon S3 导入到 Aurora Postgre SQL-Compatible。

使用以下代码创建名为 AssumeRole 信任 aurora-s3-import-role 关系的IAM角色。 AssumeRole 允许 Aurora 代表您访问其他AWS服务。

{ "Version": "2012-10-17", "Statement": [ "Effect": "Allow","Principal": { "Service": "rds.amazonaws.com" },"Action": "sts:AssumeRole"
DBA

将IAM角色与群集关联。

要将该IAM角色与SQL兼容 Aurora Postgre 的数据库集群相关联,请运行以下AWSCLI命令。更改 <Account-ID> 为托管 Aurora Postgre SQL 兼容数据库的AWS账户的 ID。这使SQL兼容 Aurora Postgre 的数据库能够访问 S3 存储桶。

aws rds add-role-to-db-cluster --db-cluster-identifier aurora-postgres-cl --feature-name s3Import --role-arn arn:aws:iam::<Account-ID>:role/aurora-s3-import-role
DBA

将示例上传到 Amazon S3。

  1. 在此模式的 其他信息 部分,将电子邮件模板代码复制到名为 salary.event.notification.email.vm 的文件中。

  2. 将文件上传到 S3 存储桶。

DBA,应用程序所有者

部署自定义函数。

  1. 在 “ 其他信息 ” 部分,将自定义函数 load_file_into_clob SQL文件内容复制到临时表中。

  2. 登录SQL兼容 Aurora Postgre 的数据库,然后使用客户端将其部署到数据库架构中 pgAdmin 。

应用程序所有者,DBA

运行可将数据导入数据库的自定义函数。

运行以下SQL命令,将尖括号中的项目替换为相应的值。

select load_file_into_clob('aws-s3-import-test'::text,'us-west-1'::text,'employee.salary.event.notification.email.vm'::text);

运行命令之前,请将尖括号中的项目替换为相应的值,如以下示例所示。

Select load_file_into_clob('aws-s3-import-test'::text,'us-west-1'::text,'employee.salary.event.notification.email.vm'::text);

该命令从 Amazon S3 加载文件并将输出返回为 TEXT

应用程序所有者,DBA
任务 描述 所需技能

将模板文件转换至十六进制转储。

Hexdump 实用程序以十六进制、十进制、八进制或的形式显示二进制文件的内容。ASCII该 hexdump 命令是 util-linux 软件包的一部分,已预先安装在 Linux 发行版中。Hexdump RPM 软件包也是亚马逊 Linux 2 的一部分。( 注意 :亚马逊 Linux 2 的支持已接近终止。 欲了解更多信息,请参阅 亚马逊 Linux 2 FAQs .)

要将文件内容转换至十六进制转储,请运行以下 Shell 命令。

xxd -p </path/file.vm> | tr -d '\n' > </path/file.hex>

将路径和文件替换为相应的值,如以下示例所示。

xxd -p employee.salary.event.notification.email.vm | tr -d '\n' > employee.salary.event.notification.email.vm.hex
DBA

将十六进制转储文件加载至数据库架构。

使用以下命令将十六进制转储文件加载到 Aurora Postgre 兼容数据库SQL中。

  1. 登录 Aurora Postgre SQL 数据库,然后创建一个名 email_template_hex 为的新表。

    CREATE TABLE email_template_hex(hex_data TEXT);
  2. 使用以下命令,将文件从本地文件系统加载至数据库架构。

    \copy email_template_hex FROM '/path/file.hex';

    将路径替换为本地文件系统位置。

    \copy email_template_hex FROM '/tmp/employee.salary.event.notification.email.vm.hex';
  3. 再创建一个名为 email_template_bytea 的表。

    CREATE TABLE email_template_bytea(hex_data bytea);
  4. 将数据从 email_template_hex 插入至 email_template_bytea

    INSERT INTO email_template_bytea (hex_data) (SELECT decode(hex_data, 'hex') FROM email_template_hex limit 1);
  5. 要将十六进制字节码作为 TEXT 数据返回,请运行以下命令。

    SELECT encode(hex_data::bytea, 'escape') FROM email_template_bytea;
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}.