

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Cargar archivos BLOB en TEXT mediante la codificación de archivos en Aurora compatible con PostgreSQL
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible"></a>

*Bhanu Ganesh Gudivada y Jeevan Shetty, Amazon Web Services*

## Resumen
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible-summary"></a>

A menudo, durante la migración, hay casos en los que hay que procesar datos estructurados y no estructurados que se cargan desde archivos de un sistema de archivos local. Los datos también pueden estar en un juego de caracteres diferente del juego de caracteres de la base de datos.

Estos archivos contienen los siguientes tipos de datos:
+ **Metadatos** – Estos datos describen la estructura del archivo.
+ **Datos semiestructurados** – Son cadenas de texto en un formato específico, como JSON o XML. Es posible que pueda hacer afirmaciones sobre dichos datos, como "siempre empezará por '<' " o "no contiene caracteres de nueva línea".
+ **Texto completo** – Estos datos suelen contener todos los tipos de caracteres, incluyendo los caracteres de nueva línea y comillas. También puede consistir en caracteres multibyte en UTF-8.
+ **Datos binarios**: estos datos pueden contener bytes o combinaciones de bytes, incluidos valores nulos y end-of-file marcadores.

Cargar una combinación de estos tipos de datos puede ser complicado.

El patrón se puede utilizar con bases de datos Oracle locales, bases de datos Oracle que se encuentran en instancias de Amazon Elastic Compute Cloud (Amazon EC2) en la nube de Amazon Web Services (AWS) y Amazon Relational Database Service (Amazon RDS) para bases de datos Oracle. Por ejemplo, este patrón utiliza Amazon Aurora de edición compatible con PostgreSQL.

En la base de datos de Oracle, con la ayuda de un puntero `BFILE` (archivo binario), el paquete `DBMS_LOB` y las funciones del sistema Oracle, puede cargar desde un archivo y convertirlo a CLOB con codificación de caracteres. Como PostgreSQL no admite el tipo de datos BLOB al migrar a una base de datos de Amazon Aurora de edición compatible con PostgreSQL, estas funciones deben convertirse en scripts compatibles con PostgreSQL.

Este patrón proporciona dos enfoques para cargar un archivo en una base de datos de una sola columna en una base de datos de Amazon Aurora compatible con PostgreSQL:
+ Método 1: Usted importa datos de su bucket de Amazon Simple Storage Service (Amazon S3) utilizando la función `table_import_from_s3` de la extensión `aws_s3` con la opción de codificación.
+ Método 2: Usted codifica en formato hexadecimal fuera de la base de datos y, a continuación, decodifica para ver `TEXT` dentro de la base de datos.

Recomendamos usar el Método 1 porque Aurora, compatible con PostgreSQL, tiene una integración directa con la extensión `aws_s3`.

Este patrón utiliza el ejemplo de cargar un archivo plano que contiene una plantilla de correo electrónico, que tiene caracteres multibyte y formatos distintos, en una base de datos de Amazon Aurora compatible con PostgreSQL.

## Requisitos previos y limitaciones
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible-prereqs"></a>

**Requisitos previos **
+ Una cuenta de AWS activa
+ Una instancia de Amazon RDS o una instancia de Aurora compatible con PostgreSQL
+ Conocimientos básicos de SQL y del sistema de administración de base de datos relacional (RDBMS)
+ Un bucket de Amazon Simple Storage Service (Amazon S3)
+ Conocimiento de las funciones del sistema en Oracle y PostgreSQL
+ Paquete RPM HexDump -XXD-0.1.1 (incluido con Amazon Linux 2)
**nota**  
Se acerca el fin de la compatibilidad de Amazon Linux 2. Para obtener más información, consulte [Amazon Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/).

**Limitaciones**
+ Para el tipo de datos `TEXT`, la cadena de caracteres más larga posible que se puede almacenar es de aproximadamente 1 GB.

**Versiones de producto**
+ Aurora es compatible con las versiones de PostgreSQL que aparecen en las [actualizaciones de PostgreSQL de Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Updates.html).

## Arquitectura
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible-architecture"></a>

**Pila de tecnología de destino**
+ Aurora compatible con PostgreSQL

**Arquitectura de destino**

*Método 1: Uso de aws\$1s3.table\$1import\$1from\$1s3*

Desde un servidor en las instalaciones, se transfiere a Amazon S3 un archivo que contiene una plantilla de correo electrónico con caracteres multibyte y un formato personalizado. La función de base de datos personalizada que proporciona este patrón utiliza la función `aws_s3.table_import_from_s3` con `file_encoding` para cargar archivos en la base de datos y regresar los resultados de las consultas como tipo de datos `TEXT`.

![\[Proceso de cuatro pasos desde el servidor en las instalaciones hasta la salida TEXT de la base de datos Aurora.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/cbf63cac-dcea-4e18-ab4f-c4f6296f60e7/images/9c46b385-e8a0-4e50-b856-d522c44d79e3.png)


1. Los archivos se transfieren al bucket de S3 de almacenamiento temporal.

1. Los archivos se cargan en la base de datos Amazon Aurora compatible con PostgreSQL.

1. Mediante el cliente pgAdmin, la función `load_file_into_clob` personalizada se implementa en la base de datos Aurora.

1. La función personalizada usa internamente `table_import_from_s3` con file\$1encoding. El resultado de la función se obtiene utilizando `array_to_string` y `array_agg` como salida `TEXT`.

*Método 2: Codificar en hexadecimal fuera de la base de datos y decodificar para ver el TEXTO dentro de la base de datos*

Un archivo de un servidor en las instalaciones o de un sistema de archivos local se convierte en un volcado hexadecimal. A continuación, el archivo se importa a PostgreSQL como un campo `TEXT`.

![\[Proceso de tres pasos mediante un volcado hexadecimal.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/cbf63cac-dcea-4e18-ab4f-c4f6296f60e7/images/563038ca-f890-4874-85df-d0f82d99800a.png)


1. Convierta el archivo en un volcado hexadecimal en la línea de comandos mediante la opción `xxd -p`.

1. Cargue los archivos de volcado hexadecimales en una versión de Aurora compatible con PostgreSQL mediante la opción `\copy` y, a continuación, decodifique los archivos de volcado hexadecimales en binarios.

1. Codifique los datos binarios para regresarlos como `TEXT`.

## Tools (Herramientas)
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible-tools"></a>

**Servicios de AWS**
+ La [edición de Amazon Aurora compatible con PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) es un motor de base de datos relacional compatible con ACID, completamente administrado que le permite configurar, utilizar y escalar implementaciones de PostgreSQL.
+ La [interfaz de la línea de comandos de AWS (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante comandos en su intérprete de comandos de línea de comandos.

**Otras herramientas**
+ [pgAdmin4](https://www.pgadmin.org/) es una plataforma de administración y desarrollo de código abierto para PostgreSQL. pgAdmin4 se puede usar en Linux, Unix, mac OS y Windows para administrar PostgreSQL.  

## Epics
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible-epics"></a>

### Método 1: Importación de datos de Amazon S3 a Aurora compatible con PostgreSQL
<a name="approach-1-import-data-from-amazon-s3-to-aurora-postgresql-compatible"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Lance una EC2 instancia. | Para obtener instrucciones sobre cómo lanzar una instancia, consulte [Lanzar su instancia](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/LaunchingAndUsingInstances.html). | Administrador de base de datos | 
| Instale la herramienta pgAdmin del cliente PostgreSQL. | Descargue e instale [pgAdmin](https://www.pgadmin.org/download/). | Administrador de base de datos | 
| Cree una política de IAM. | Cree una de política AWS Identity and Access Management (IAM) denominada `aurora-s3-access-pol` que conceda acceso al bucket de S3 en el que se almacenarán los archivos. Use el siguiente código, sustituyendo `<bucket-name>` por el nombre de su bucket de S3.<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": [<br />                "s3:GetObject",<br />                "s3:AbortMultipartUpload",<br />                "s3:DeleteObject",<br />                "s3:ListMultipartUploadParts",<br />                "s3:PutObject",<br />                "s3:ListBucket"<br />            ],<br />            "Resource": [<br />                "arn:aws:s3:::<bucket-name>/*",<br />                "arn:aws:s3:::<bucket-name>"<br />            ]<br />        }<br />    ]<br />}</pre> | Administrador de base de datos | 
| Cree un rol de IAM para la importación de objetos de Amazon S3 a Aurora compatible con PostgreSQL. | Usa el siguiente código para crear un rol de IAM denominado `aurora-s3-import-role` con la relación de [AssumeRole](https://docs.amazonaws.cn/en_us/STS/latest/APIReference/API_AssumeRole.html)confianza. `AssumeRole`permite a Aurora acceder a otros servicios de AWS en su nombre.<pre>{<br />  "Version": "2012-10-17",		 	 	 <br />  "Statement": [<br />    {<br />      "Effect": "Allow","Principal": {<br />        "Service": "rds.amazonaws.com"<br />      },"Action": "sts:AssumeRole"<br />    }<br />  ]<br />}<br /></pre> | Administrador de base de datos | 
| Asocie el rol de IAM al clúster. | Para asociar el rol de IAM al clúster de base de datos compatible con Aurora PostgreSQL, ejecute el siguiente comando de la CLI de AWS. Cambie `<Account-ID>` al ID de la cuenta de AWS que aloja la base de datos Aurora compatible con PostgreSQL. Esto permite que la base de datos Aurora compatible con PostgreSQL acceda al bucket de S3.<pre>aws rds add-role-to-db-cluster --db-cluster-identifier aurora-postgres-cl<br />--feature-name s3Import --role-arn arn:aws:iam::<Account-ID>:role/aurora-s3-import-role</pre> | Administrador de base de datos | 
| Cargue el ejemplo en Amazon S3. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible.html) | Administrador de base de datos, propietario de la aplicación | 
| Implemente la función personalizada. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible.html) | Administrador de base de datos, propietario de la aplicación | 
| Ejecute la función personalizada para importar los datos en la base de datos. | Ejecute el siguiente comando SQL y sustituya los elementos entre paréntesis angulares por los valores adecuados.<pre>select load_file_into_clob('aws-s3-import-test'::text,'us-west-1'::text,'employee.salary.event.notification.email.vm'::text);</pre>Sustituya los elementos entre paréntesis angulares por los valores adecuados, como se muestra en el siguiente ejemplo, antes de ejecutar el comando.<pre>Select load_file_into_clob('aws-s3-import-test'::text,'us-west-1'::text,'employee.salary.event.notification.email.vm'::text);</pre>El comando carga el archivo desde Amazon S3 y regresa el resultado como `TEXT`. | Administrador de base de datos, propietario de la aplicación | 

### Método 2: Convertir el archivo de plantilla en un volcado hexadecimal en un sistema Linux local
<a name="approach-2-convert-the-template-file-into-a-hex-dump-in-a-local-linux-system"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Convierta el archivo de plantilla en un volcado hexadecimal. | La utilidad Hexdump muestra el contenido de los archivos binarios en formato hexadecimal, decimal, octal o ASCII. El comando `hexdump` forma parte del paquete `util-linux` y viene preinstalado en las distribuciones de Linux. El paquete RPM Hexdump también forma parte de Amazon Linux 2. (: Amazon Linux 2 está a punto de finalizar el soporte. Para obtener más información, consulte [Amazon Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/).)Para convertir el contenido del archivo en un volcado hexadecimal, ejecute el siguiente comando del intérprete de comandos.<pre>xxd -p </path/file.vm> | tr -d '\n' > </path/file.hex></pre>Sustituya la ruta y el archivo por los valores adecuados, como se muestra en el siguiente ejemplo.<pre>xxd -p employee.salary.event.notification.email.vm | tr -d '\n' > employee.salary.event.notification.email.vm.hex</pre> | Administrador de base de datos | 
| Cargue el archivo hexdump en el esquema de la base de datos. | Utilice los siguientes comandos para cargar el archivo hexdump en la base de datos Aurora compatible con PostgreSQL.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible.html) | Administrador de base de datos | 

## Recursos relacionados
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible-resources"></a>

**Referencias**
+ [Utilizar una base de datos PostgreSQL como objetivo para el servicio de migración de bases de datos de AWS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)
+ [Manual de migración de la base de datos de Oracle 19c a Amazon Aurora con compatibilidad con PostgreSQL (12.4)](https://d1.awsstatic.com/whitepapers/Migration/oracle-database-amazon-aurora-postgresql-migration-playbook-12.4.pdf)
+ [Crear políticas de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)
+ [Asociación de un rol de IAM con un clúster de base de datos Amazon Aurora MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.html)
+ [pgAdmin](https://www.pgadmin.org/)

**Tutoriales**
+ [Introducción a Amazon RDS](https://aws.amazon.com/rds/getting-started/)
+ [Migración de Oracle a Amazon Aurora](https://aws.amazon.com/getting-started/projects/migrate-oracle-to-amazon-aurora/)

## Información adicional
<a name="load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible-additional"></a>

**Función personalizada load\$1file\$1into\$1clob**

```
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;
END;
$BODY$;
```

**Plantilla de correo electrónico**

```
######################################################################################
##                                                                                    ##
##    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}.

*******

johndoeMaster Sourcing Intelligence est une plateforme de soumission en ligne pour les equipements, les materiaux et les services.

Si vous avez des difficultes ou des questions, envoyez un courriel a support@johndoeMaster.com pour obtenir de l'aide.
```