View a markdown version of this page

Migrasikan paket Oracle SERIALLY_REUSABLE Pragma ke Amazon Aurora atau Amazon RDS for PostgreSQL - AWS Prescriptive Guidance

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

Migrasikan paket Oracle SERIALLY_REUSABLE Pragma ke Amazon Aurora atau Amazon RDS for PostgreSQL

Vinay Paladi, Amazon Web Services

Ringkasan

Pola ini menyediakan pendekatan langkah demi langkah untuk memigrasikan paket Oracle yang menggunakan Serially_REUSABLE Pragma ke Amazon Aurora PostgreSQL-Compatible Edition atau Amazon RDS for PostgreSQL aktif, sambil mempertahankan fungsionalitas aslinya. AWS

PRAGMA SERIALLY_REUSABLE menunjukkan bahwa status paket diperlukan hanya untuk durasi satu panggilan ke server (misalnya, blok PL/SQL anonim atau panggilan prosedur tersimpan melalui tautan database). Setelah panggilan ini, penyimpanan untuk variabel paket dapat digunakan kembali, mengurangi konsumsi memori.

PostgreSQL tidak secara native mendukung konsep SERIALLY_REUSABLE Pragma. Untuk mencapai fungsionalitas yang setara, pola ini menggunakan pendekatan fungsi pembungkus yang dikombinasikan dengan fitur AWS Database Migration Service (AWS DMS) Schema Conversion (AWS DMS SC) untuk memigrasikan struktur paket. Contoh skrip yang disediakan menunjukkan cara mempertahankan perilaku reset-on-each-call di PostgreSQL.

Untuk informasi selengkapnya, lihat SERIALLY_REUSABLE Pragma dalam dokumentasi Oracle.

Prasyarat dan batasan

  • Aktif Akun AWS

  • Akses ke layanan Konversi AWS DMS Skema

  • Database Amazon Aurora PostgreSQL-Compatible Edition atau Amazon RDS untuk database PostgreSQL

  • Database Oracle versi 10g atau yang lebih baru

Arsitektur

Tumpukan teknologi sumber

  • On-premises Basis data Oracle

Tumpukan teknologi target

Arsitektur migrasi

Migrasikan paket Oracle SERIALLY_REUSABLE Pragma ke Amazon Aurora atau Amazon RDS for PostgreSQL

Alat

Layanan AWS

Alat-alat lainnya

  • pgAdmin adalah alat manajemen sumber terbuka untuk PostgreSQL. Ini menyediakan antarmuka grafis yang membantu Anda membuat, memelihara, dan menggunakan objek database.

Praktik terbaik

  • Selalu gunakan reset_vars = 1 untuk panggilan tingkat atas dan reset_vars = 0 untuk sub-panggilan internal.

  • Simpan semua nilai default dalam $init fungsi sebagai sumber kebenaran tunggal.

  • Cocokkan nama variabel Oracle di PostgreSQL untuk ketertelusuran.

  • Validasi dengan membandingkan Oracle dengan output DBMS_OUTPUT PostgreSQL. RAISE NOTICE

  • Uji dalam sesi PostgreSQL terpisah untuk mengonfirmasi variabel yang disetel ulang antar panggilan.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Mengatur AWS DMS SC.

Konfigurasikan AWS DMS konektivitas ke database sumber. Untuk informasi selengkapnya, lihat Mengonversi skema database menggunakan Konversi Skema DMS.

DBA, Pengembang

Konversi skrip.

Gunakan AWS DMS SC untuk mengonversi paket Oracle dengan memilih database target sebagai Aurora PostgreSQL-Compatible.

DBA, Pengembang

Simpan file.sql.

Sebelum Anda menyimpan file.sql, ubah opsi Pengaturan Proyek di AWS DMS SC ke File tunggal per tahap. Ini mengkonfigurasi AWS DMS untuk memisahkan file.sql menjadi beberapa file.sql berdasarkan jenis objek.

DBA, Pengembang

Ubah kodenya.

Buka init fungsi yang dihasilkan oleh AWS DMS SC, dan ubah seperti yang ditunjukkan pada contoh di bagian Informasi tambahan. Ini akan menambahkan variabel untuk mencapai fungsionalitasreset_vars = 0.

DBA, Pengembang

Uji konversi.

Menyebarkan init fungsi ke database PostgreSQL-Compatible Aurora, dan menguji hasilnya.

DBA, Pengembang

Pemecahan masalah

IsuSolusi

Field tidak ada kesalahan saat mengakses variabel paket.

Pastikan bahwa kondisi $init fungsi menggunakan IF v_need_init atau reset_vars = 1 lebih bahwa variabel selalu dibuat pada akses pertama dalam sesi.

Variabel tidak mengatur ulang antara panggilan tingkat atas atau mengatur ulang secara tidak terduga selama sub-panggilan internal.

Gunakan reset_vars = 1 untuk panggilan tingkat atas langsung dan lulus reset_vars = 0 untuk panggilan fungsi-ke-fungsi internal.

Sumber daya terkait

Informasi tambahan

-------Source Oracle Code: CREATE OR REPLACE PACKAGE test_pkg_var IS PRAGMA SERIALLY_REUSABLE; PROCEDURE function_1(test_id NUMBER); PROCEDURE function_2(test_id NUMBER); END; / CREATE OR REPLACE PACKAGE BODY test_pkg_var IS PRAGMA SERIALLY_REUSABLE; v_char VARCHAR2(20) := 'DEFAULT_VALUE'; v_num NUMBER := 123; PROCEDURE function_2(test_id NUMBER) IS BEGIN dbms_output.put_line('function_2 => v_char=' || v_char || ', v_num=' || v_num); END; PROCEDURE function_1(test_id NUMBER) IS BEGIN dbms_output.put_line('function_1 => v_char=' || v_char || ', v_num=' || v_num); v_char := 'MODIFIED_VALUE'; dbms_output.put_line('function_1 => v_char after update=' || v_char); function_2(0); END; END test_pkg_var; / SET SERVEROUTPUT ON EXEC test_pkg_var.function_1(1); EXEC test_pkg_var.function_2(1); ------Target PostgreSQL Code: CREATE SCHEMA IF NOT EXISTS testoracle; CREATE OR REPLACE FUNCTION testoracle.test_pkg_var$init(reset_vars IN INTEGER DEFAULT 0) RETURNS void AS $BODY$ DECLARE v_need_init BOOLEAN; BEGIN v_need_init := aws_oracle_ext.packageinitialize(proutinename => 'testoracle.test_pkg_var'); IF v_need_init OR reset_vars = 1 THEN PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'DEFAULT_VALUE'::CHARACTER VARYING(20)); PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', pval => 123); END IF; END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_1(reset_vars INT DEFAULT 1) AS $BODY$ BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars); RAISE NOTICE 'function_1 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION); PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'MODIFIED_VALUE'::CHARACTER VARYING(20)); RAISE NOTICE 'function_1 => v_char after update=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)); CALL testoracle.test_pkg_var$function_2(0); END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_2(reset_vars INT DEFAULT 1) AS $BODY$ BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars); RAISE NOTICE 'function_2 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION); END; $BODY$ LANGUAGE plpgsql; CALL testoracle.test_pkg_var$function_1(1); -- loads defaults, sets v_char='MODIFIED_VALUE', function_2 sees 'MODIFIED_VALUE' CALL testoracle.test_pkg_var$function_2(1); -- new transcation: PRAGMA reset, sees 'DEFAULT_VALUE'