Migrasikan fungsionalitas Oracle ROWID ke PostgreSQL di AWS - AWS Prescriptive Guidance

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

Migrasikan fungsionalitas Oracle ROWID ke PostgreSQL di AWS

Rakesh Raghav dan Ramesh Pathuri, Amazon Web Services

Ringkasan

Pola ini menjelaskan opsi untuk memigrasikan fungsionalitas ROWID pseudocolumn di Oracle Database ke database PostgreSQL di Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL, Amazon Aurora PostgreSQL Compatible Edition, atau Amazon Elastic Compute Cloud (Amazon). EC2

Dalam database Oracle, ROWID pseudocolumn adalah alamat fisik dari baris dalam tabel. Pseudocolumn ini digunakan untuk mengidentifikasi baris secara unik bahkan jika kunci utama tidak ada di atas meja. PostgreSQL memiliki pseudocolumn serupa yang ctid disebut, tetapi tidak dapat digunakan sebagai. ROWID Seperti yang dijelaskan dalam dokumentasi PostgreSQLctid, mungkin berubah jika diperbarui atau setelah setiap proses. VACUUM

Ada tiga cara Anda dapat membuat fungsionalitas ROWID pseudocolumn di PostgreSQL:

  • Gunakan kolom kunci primer bukan ROWID untuk mengidentifikasi baris dalam tabel.

  • Gunakan primary/unique kunci logis (yang mungkin merupakan kunci komposit) dalam tabel. 

  • Tambahkan kolom dengan nilai yang dihasilkan secara otomatis dan jadikan itu primary/unique kunci untuk meniruROWID.

Pola ini memandu Anda melalui ketiga implementasi dan menjelaskan kelebihan dan kekurangan dari setiap opsi.

Prasyarat dan batasan

Prasyarat

  • Akun AWS yang aktif

  • Keahlian pengkodean prosedural Language/PostgreSQL (PL/PGSQL)

  • Sumber Database Oracle

  • Kluster Amazon RDS for PostgreSQL atau Aurora PostgreSQL yang kompatibel, atau instance untuk meng-host database PostgreSQL EC2

Batasan

  • Pola ini menyediakan solusi untuk fungsionalitas tersebut. ROWID PostgreSQL tidak menyediakan yang setara dengan di Oracle Database. ROWID

Versi produk

  • PostgreSQL 11.9 atau yang lebih baru

Arsitektur

Tumpukan teknologi sumber

  • Oracle Database

Tumpukan teknologi target

  • Kompatibel dengan Aurora PostgreSQL, Amazon RDS for PostgreSQL, atau instance dengan database PostgreSQL EC2

Mengonversi Database Oracle ke PostgreSQL di AWS

Opsi implementasi

Ada tiga opsi untuk mengatasi kurangnya ROWID dukungan di PostgreSQL, tergantung pada apakah tabel Anda memiliki kunci primer atau indeks unik, kunci primer logis, atau atribut identitas. Pilihan Anda bergantung pada jadwal proyek Anda, fase migrasi Anda saat ini, dan dependensi pada aplikasi dan kode database.

Opsi

Deskripsi

Keuntungan

Kekurangan

Kunci primer atau indeks unik

Jika tabel Oracle Anda memiliki kunci utama, Anda dapat menggunakan atribut kunci ini untuk mengidentifikasi baris secara unik. 

  • Tidak ada ketergantungan pada fitur database berpemilik.

  • Dampak minimal pada kinerja, karena bidang kunci primer diindeks.

  • Memerlukan perubahan pada aplikasi dan kode database yang bergantung pada ROWID untuk beralih ke bidang kunci utama.

 

primary/unique Kunci logis

Jika tabel Oracle Anda memiliki kunci primer logis, Anda dapat menggunakan atribut kunci ini untuk mengidentifikasi baris secara unik. Kunci primer logis terdiri dari atribut atau sekumpulan atribut yang secara unik dapat mengidentifikasi baris, tetapi tidak diberlakukan pada database melalui kendala.

  • Tidak ada ketergantungan pada fitur database berpemilik.

  • Memerlukan perubahan pada aplikasi dan kode database yang bergantung pada ROWID untuk beralih ke bidang kunci utama.

  • Dampak signifikan pada kinerja jika atribut kunci primer logis tidak diindeks. Namun, Anda dapat menambahkan indeks unik untuk mencegah masalah kinerja.

Atribut identitas

jika tabel Oracle Anda tidak memiliki kunci utama, Anda dapat membuat bidang tambahan sebagaiGENERATED ALWAYS AS IDENTITY. Atribut ini menghasilkan nilai unik setiap kali data dimasukkan ke dalam tabel, sehingga dapat digunakan untuk mengidentifikasi secara unik baris untuk operasi Data Manipulation Language (DML/Data Manipulation Language).

  • Tidak ada ketergantungan pada fitur database berpemilik.

  • Database PostgreSQL mengisi atribut dan mempertahankan keunikannya.

  • Memerlukan perubahan pada aplikasi dan kode database yang bergantung pada ROWID untuk beralih ke atribut identitas.

  • Dampak signifikan pada kinerja jika bidang tambahan tidak diindeks. Namun, Anda dapat menambahkan indeks untuk mencegah masalah kinerja.

Alat

  • Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL membantu Anda mengatur, mengoperasikan, dan menskalakan database relasional PostgreSQL di AWS Cloud.

  • Amazon Aurora PostgreSQL Compatible Edition adalah mesin database relasional yang dikelola sepenuhnya dan sesuai dengan ACID yang membantu Anda mengatur, mengoperasikan, dan menskalakan penerapan PostgreSQL.

  • AWS Command Line Interface (AWS CLI) adalah alat sumber terbuka yang membantu Anda berinteraksi dengan layanan AWS melalui perintah di shell baris perintah Anda. Dalam pola ini, Anda dapat menggunakan AWS CLI untuk menjalankan perintah SQL melalui pgAdmin.

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

  • AWS Schema Conversion Tool (AWS SCT) mendukung migrasi database heterogen dengan secara otomatis mengonversi skema basis data sumber dan sebagian besar kode kustom ke format yang kompatibel dengan database target.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Identifikasi tabel Oracle yang menggunakan ROWID atribut.

Gunakan AWS Schema Conversion Tool (AWS SCT) untuk mengidentifikasi tabel Oracle yang memiliki fungsionalitas. ROWID Untuk informasi selengkapnya, lihat dokumentasi AWS SCT.

— atau —

Di Oracle, gunakan DBA_TAB_COLUMNS tampilan untuk mengidentifikasi tabel yang memiliki ROWID atribut. Bidang ini dapat digunakan untuk menyimpan karakter 10-byte alfanumerik. Tentukan penggunaan dan konversikan ini ke VARCHAR bidang jika sesuai.

DBA atau pengembang

Identifikasi kode yang mereferensikan tabel ini.

Gunakan AWS SCT untuk membuat laporan penilaian migrasi guna mengidentifikasi prosedur yang terpengaruhROWID. Untuk informasi selengkapnya, lihat dokumentasi AWS SCT.

— atau —

Dalam database sumber Oracle, gunakan bidang teks dba_source tabel untuk mengidentifikasi objek yang menggunakan ROWID fungsionalitas.

DBA atau pengembang
TugasDeskripsiKeterampilan yang dibutuhkan

Identifikasi tabel yang tidak memiliki kunci utama.

Dalam database sumber Oracle, gunakan DBA_CONSTRAINTS untuk mengidentifikasi tabel yang tidak memiliki kunci utama. Informasi ini akan membantu Anda menentukan strategi untuk setiap tabel. Misalnya:

select dt.* from dba_tables dt where not exists (select 1 from all_constraints ct where ct.owner = Dt.owner and ct.table_name = Dt.table_name and ct.constraint_type = 'P' ) and dt.owner = '{schema}'
DBA atau pengembang
TugasDeskripsiKeterampilan yang dibutuhkan

Terapkan perubahan untuk tabel yang memiliki kunci primer yang ditentukan atau logis.

Buat perubahan kode aplikasi dan database yang ditampilkan di bagian Informasi tambahan untuk menggunakan kunci primer unik atau kunci primer logis untuk mengidentifikasi baris dalam tabel Anda.

DBA atau pengembang

Tambahkan bidang tambahan ke tabel yang tidak memiliki kunci primer yang ditentukan atau logis.

Tambahkan atribut tipeGENERATED ALWAYS AS IDENTITY. Buat perubahan kode aplikasi dan database yang ditampilkan di bagian Informasi tambahan.

DBA atau pengembang

Tambahkan indeks jika perlu.

Tambahkan indeks ke bidang tambahan atau kunci primer logis untuk meningkatkan kinerja SQL.

DBA atau pengembang

Sumber daya terkait

Informasi tambahan

Bagian berikut memberikan contoh kode Oracle dan PostgreSQL untuk menggambarkan tiga pendekatan.

Skenario 1: Menggunakan kunci unik primer

Dalam contoh berikut, Anda membuat tabel testrowid_s1 dengan emp_id sebagai kunci utama.

Kode Oracle:

create table testrowid_s1 (emp_id integer, name varchar2(10), CONSTRAINT testrowid_pk PRIMARY KEY (emp_id)); INSERT INTO testrowid_s1(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s1(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s1(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s1(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 empname2 AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4 UPDATE testrowid_s1 SET name = 'Ramesh' WHERE rowid = 'AAAF3pAAAAAAAMOAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 Ramesh AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4

Kode PostgreSQL:

CREATE TABLE public.testrowid_s1 ( emp_id integer, name character varying, primary key (emp_id) ); insert into public.testrowid_s1 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s1 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh

Skenario 2: Menggunakan kunci primer logis

Dalam contoh berikut, Anda membuat tabel testrowid_s2 dengan emp_id sebagai kunci utama logis.

Kode Oracle:

create table testrowid_s2 (emp_id integer, name varchar2(10) ); INSERT INTO testrowid_s2(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s2(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s2(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s2(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 empname2 AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4 UPDATE testrowid_s2 SET name = 'Ramesh' WHERE rowid = 'AAAF3rAAAAAAAMeAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 Ramesh AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4

Kode PostgreSQL:

CREATE TABLE public.testrowid_s2 ( emp_id integer, name character varying ); insert into public.testrowid_s2 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s2 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh

Skenario 3: Menggunakan atribut identitas

Dalam contoh berikut, Anda membuat tabel testrowid_s3 tanpa kunci utama dan dengan menggunakan atribut identitas.

Kode Oracle:

create table testrowid_s3 (name varchar2(10)); INSERT INTO testrowid_s3(name) values ('empname1'); INSERT INTO testrowid_s3(name) values ('empname2'); INSERT INTO testrowid_s3(name) values ('empname3'); INSERT INTO testrowid_s3(name) values ('empname4'); commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB empname2 AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4 UPDATE testrowid_s3 SET name = 'Ramesh' WHERE rowid = 'AAAF3sAAAAAAAMmAAB' ; commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB Ramesh AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4

Kode PostgreSQL:

CREATE TABLE public.testrowid_s3 ( rowid_seq bigint generated always as identity, name character varying ); insert into public.testrowid_s3 (name) values ('empname1'),('empname2'),('empname3'),('empname4'); select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s3 set name = 'Ramesh' where rowid_seq = 2 ; select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh