Muat file BLOB ke TEXT dengan menggunakan pengkodean file di Aurora PostgreSQL yang kompatibel - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Muat file BLOB ke TEXT dengan menggunakan pengkodean file di Aurora PostgreSQL yang kompatibel

Bhanu Ganesh Gudivada dan Jeevan Shetty, Amazon Web Services

Ringkasan

Seringkali selama migrasi, ada kasus di mana Anda harus memproses data tidak terstruktur dan terstruktur yang dimuat dari file pada sistem file lokal. Data mungkin juga berada dalam kumpulan karakter yang berbeda dari kumpulan karakter database.

File-file ini menyimpan jenis data berikut:

  • Metadata — Data ini menjelaskan struktur file.

  • Data semi-terstruktur — Ini adalah string tekstual dalam format tertentu, seperti JSON atau XHTML. Anda mungkin dapat membuat pernyataan tentang data tersebut, seperti “akan selalu dimulai dengan '<'” atau “tidak mengandung karakter baris baru.”

  • Teks lengkap — Data ini biasanya berisi semua jenis karakter, termasuk karakter baris baru dan kutipan. Mungkin juga terdiri dari karakter multibyte di UTF-8.

  • Data biner — Data ini mungkin berisi byte atau kombinasi byte termasuk, nol dan penanda. end-of-file

Memuat campuran jenis data ini bisa menjadi tantangan.

Pola ini dapat digunakan dengan database Oracle lokal, database Oracle yang ada di instans Amazon Elastic Compute Cloud (Amazon) di Amazon Web Services (AWS EC2) Cloud, dan Amazon Relational Database Service (Amazon RDS) untuk database Oracle. Sebagai contoh, pola ini menggunakan Amazon Aurora PostgreSQL Compatible Edition.

Di Oracle Database, dengan bantuan pointer BFILE (file biner), DBMS_LOB paket, dan fungsi sistem Oracle, Anda dapat memuat dari file dan mengkonversi ke CLOB dengan pengkodean karakter. Karena PostgreSQL tidak mendukung tipe data BLOB saat bermigrasi ke database Amazon Aurora PostgreSQL Edisi yang kompatibel dengan PostgreSQL, fungsi ini harus dikonversi ke skrip yang kompatibel dengan PostgreSQL.

Pola ini menyediakan dua pendekatan untuk memuat file ke dalam kolom database tunggal dalam database yang kompatibel dengan Amazon Aurora PostgreSQL:

  • Pendekatan 1 - Anda mengimpor data dari bucket Amazon Simple Storage Service (Amazon S3) Simple Storage S3) dengan menggunakan table_import_from_s3 fungsi ekstensi dengan aws_s3 opsi encode.

  • Pendekatan 2 — Anda menyandikan heksadesimal di luar database, dan kemudian Anda memecahkan kode untuk melihat di dalam database. TEXT

Sebaiknya gunakan Pendekatan 1 karena Aurora PostgreSQL kompatibel memiliki integrasi langsung dengan ekstensi. aws_s3

Pola ini menggunakan contoh memuat file datar yang berisi template email, yang memiliki karakter multibyte dan format berbeda, ke dalam database Amazon Aurora PostgreSQL yang kompatibel.

Prasyarat dan batasan

Prasyarat

  • Akun AWS yang aktif

  • Instans Amazon RDS atau instans yang kompatibel dengan Aurora PostgreSQL

  • Pemahaman dasar SQL dan Relational Database Management System (RDBMS)

  • Bucket Amazon Simple Storage Service (Amazon S3).

  • Pengetahuan tentang fungsi sistem di Oracle dan PostgreSQL

  • RPM Package HexDump -XXD-0.1.1 (disertakan dengan Amazon Linux 2)

    catatan

    Amazon Linux 2 mendekati akhir dukungan. Untuk informasi selengkapnya, lihat Amazon Linux 2 FAQs.

Batasan

  • Untuk tipe TEXT data, string karakter terpanjang yang dapat disimpan adalah sekitar 1 GB.

Versi produk

Arsitektur

Tumpukan teknologi target

  • Kompatibel dengan Aurora PostgreSQL

Arsitektur target

Pendekatan 1 - Menggunakan aws_s3.table_import_from_s3

Dari server lokal, file yang berisi templat email dengan karakter multibyte dan pemformatan kustom ditransfer ke Amazon S3. Fungsi database kustom yang disediakan oleh pola ini menggunakan aws_s3.table_import_from_s3 fungsi dengan file_encoding untuk memuat file ke dalam database dan mengembalikan hasil query sebagai tipe TEXT data.

Proses empat langkah dari server lokal ke output TEXT dari database Aurora.
  1. File ditransfer ke bucket S3 pementasan.

  2. File diunggah ke database yang kompatibel dengan Amazon Aurora PostgreSQL.

  3. Menggunakan klien pgAdmin, load_file_into_clob fungsi kustom diterapkan ke database Aurora.

  4. Fungsi kustom digunakan secara internal table_import_from_s3 dengan file_encoding. Output dari fungsi diperoleh dengan menggunakan array_to_string dan array_agg sebagai TEXT output.

Pendekatan 2 - Pengkodean ke heksadesimal di luar database dan decoding untuk melihat TEXT di dalam database

File dari server lokal atau sistem file lokal diubah menjadi hex dump. Kemudian file tersebut diimpor ke PostgreSQL sebagai bidang. TEXT

Proses tiga langkah menggunakan Hex dump.
  1. Konversi file ke hex dump di baris perintah dengan menggunakan opsi. xxd -p

  2. Unggah file hex dump ke Aurora PostgreSQL yang kompatibel dengan menggunakan \copy opsi, dan kemudian memecahkan kode file hex dump ke biner.

  3. Mengkodekan data biner untuk kembali sebagaiTEXT.

Alat

Layanan AWS

Alat lainnya

  • pGADmin4 adalah platform administrasi dan pengembangan open source untuk PostgreSQL. pGADmin4 dapat digunakan di Linux, Unix, mac OS, dan Windows untuk mengelola PostgreSQL. 

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Luncurkan sebuah EC2 instance.

Untuk petunjuk tentang meluncurkan instance, lihat Meluncurkan instance Anda.

DBA

Instal alat pgAdmin klien PostgreSQL.

Unduh dan instal pgAdmin.

DBA

Buat kebijakan IAM.

Buat kebijakan AWS Identity and Access Management (IAM) bernama aurora-s3-access-pol yang memberikan akses ke bucket S3 tempat file akan disimpan. Gunakan kode berikut, ganti <bucket-name> dengan nama bucket S3 Anda.

{ "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

Buat peran IAM untuk impor objek dari Amazon S3 ke Aurora PostgreSQL yang kompatibel.

Gunakan kode berikut untuk membuat peran IAM bernama aurora-s3-import-role dengan hubungan AssumeRolekepercayaan. AssumeRolememungkinkan Aurora mengakses layanan AWS lainnya atas nama Anda.

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

Kaitkan peran IAM ke cluster.

Untuk mengaitkan peran IAM dengan cluster database yang kompatibel dengan Aurora PostgreSQL, jalankan perintah AWS CLI berikut. Ubah <Account-ID> ke ID akun AWS yang menghosting database yang kompatibel dengan Aurora PostgreSQL. Ini memungkinkan database yang kompatibel dengan Aurora PostgreSQL untuk mengakses bucket 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

Unggah contoh ke Amazon S3.

  1. Di bagian Informasi tambahan dari pola ini, salin kode template email ke dalam file bernamasalary.event.notification.email.vm.

  2. Unggah ke file ke bucket S3.

DBA, Pemilik aplikasi

Menyebarkan fungsi kustom.

  1. Dari bagian Informasi tambahan, salin fungsi kustom konten file load_file_into_clob SQL ke dalam tabel sementara.

  2. Masuk ke database Aurora PostgreSQL yang kompatibel dan terapkan ke dalam skema database dengan menggunakan klien pgAdmin.

Pemilik aplikasi, DBA

Jalankan fungsi kustom untuk mengimpor data ke dalam database.

Jalankan perintah SQL berikut, ganti item dalam kurung sudut dengan nilai yang sesuai.

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

Ganti item dalam kurung sudut dengan nilai yang sesuai, seperti yang ditunjukkan pada contoh berikut, sebelum menjalankan perintah.

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

Perintah memuat file dari Amazon S3 dan mengembalikan output sebagai file. TEXT

Pemilik aplikasi, DBA
TugasDeskripsiKeterampilan yang dibutuhkan

Ubah file template menjadi hex dump.

catatan

Utilitas Hexdump menampilkan isi file biner dalam heksadesimal, desimal, oktal, atau ASCII. hexdumpPerintah adalah bagian dari util-linux paket dan sudah diinstal sebelumnya di distribusi Linux. Paket Hexdump RPM adalah bagian dari Amazon Linux 2 juga. (: Amazon Linux 2 mendekati akhir dukungan. Untuk informasi selengkapnya, lihat Amazon Linux 2 FAQs.)

Untuk mengonversi isi file menjadi hex dump, jalankan perintah shell berikut.

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

Ganti path dan file dengan nilai yang sesuai, seperti yang ditunjukkan pada contoh berikut.

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

Muat file hexdump ke dalam skema database.

Gunakan perintah berikut untuk memuat file hexdump ke dalam database Aurora PostgreSQL yang kompatibel.

  1. Masuk ke database Aurora PostgreSQL, dan buat tabel baru yang disebut. email_template_hex

    CREATE TABLE email_template_hex(hex_data TEXT);
  2. Muat file dari sistem file lokal ke dalam skema DB dengan menggunakan perintah berikut.

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

    Ganti path dengan lokasi pada sistem file lokal Anda.

    \copy email_template_hex FROM '/tmp/employee.salary.event.notification.email.vm.hex';
  3. Buat satu tabel lagi yang disebutemail_template_bytea.

    CREATE TABLE email_template_bytea(hex_data bytea);
  4. Masukkan data dari email_template_hex ke dalamemail_template_bytea.

    INSERT INTO email_template_bytea (hex_data) (SELECT decode(hex_data, 'hex') FROM email_template_hex limit 1);
  5. Untuk mengembalikan kode hex bytea sebagai TEXT data, jalankan perintah berikut.

    SELECT encode(hex_data::bytea, 'escape') FROM email_template_bytea;
DBA

Sumber daya terkait

Referensi

Tutorial

Informasi tambahan

load_file_into_clob fungsi kustom

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$;

Template email

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