Bermigrasi dari Oracle ke Amazon RDS untuk My SQL atau Amazon SQL Aurora My dengan AWS Schema Conversion Tool - AWS Schema Conversion Tool

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

Bermigrasi dari Oracle ke Amazon RDS untuk My SQL atau Amazon SQL Aurora My dengan AWS Schema Conversion Tool

Untuk meniru fungsi database Oracle dalam SQL kode Saya yang dikonversi, gunakan paket SQL ekstensi Oracle to My di. AWS SCT Untuk informasi selengkapnya tentang paket ekstensi, lihatMenggunakan paket ekstensi dengan AWS Schema Conversion Tool.

Hak istimewa untuk My SQL sebagai database target

Hak istimewa yang diperlukan untuk My SQL sebagai target adalah sebagai berikut:

  • CREATEPADA * . *

  • ALTERPADA * . *

  • DROPPADA * . *

  • INDEXPADA * . *

  • REFERENCESPADA * . *

  • SELECTPADA * . *

  • CREATEVIEWPADA * . *

  • SHOWVIEWPADA * . *

  • TRIGGERPADA * . *

  • CREATEROUTINEPADA * . *

  • ALTERROUTINEPADA * . *

  • EXECUTEPADA * . *

  • CREATETEMPORARYTABLESPADA * . *

  • AWS_LAMBDA_ACCESS

  • INSERT, UPDATE PADA AWS _ ORACLE _EXT. *

  • INSERT,UPDATE, DELETE PADA AWS _ ORACLE _ EXT _DATA. *

Jika Anda menggunakan SQL database Saya versi 5.7 atau lebih rendah sebagai target, berikan izin INVOKE LAMBDA *.* alih-alih _ _. AWS LAMBDA ACCESS Untuk SQL database Saya versi 8.0 dan yang lebih tinggi, berikan izin AWS _ LAMBDA _ACCESS.

Anda dapat menggunakan contoh kode berikut untuk membuat pengguna database dan memberikan hak istimewa.

CREATE USER 'user_name' IDENTIFIED BY 'your_password'; GRANT CREATE ON *.* TO 'user_name'; GRANT ALTER ON *.* TO 'user_name'; GRANT DROP ON *.* TO 'user_name'; GRANT INDEX ON *.* TO 'user_name'; GRANT REFERENCES ON *.* TO 'user_name'; GRANT SELECT ON *.* TO 'user_name'; GRANT CREATE VIEW ON *.* TO 'user_name'; GRANT SHOW VIEW ON *.* TO 'user_name'; GRANT TRIGGER ON *.* TO 'user_name'; GRANT CREATE ROUTINE ON *.* TO 'user_name'; GRANT ALTER ROUTINE ON *.* TO 'user_name'; GRANT EXECUTE ON *.* TO 'user_name'; GRANT CREATE TEMPORARY TABLES ON *.* TO 'user_name'; GRANT AWS_LAMBDA_ACCESS TO 'user_name'; GRANT INSERT, UPDATE ON AWS_ORACLE_EXT.* TO 'user_name'; GRANT INSERT, UPDATE, DELETE ON AWS_ORACLE_EXT_DATA.* TO 'user_name';

Pada contoh sebelumnya, ganti user_name dengan nama pengguna Anda. Kemudian, ganti your_password dengan kata sandi yang aman.

Jika Anda menggunakan SQL database Saya versi 5.7 atau lebih rendah sebagai target, maka gunakan GRANT INVOKE LAMBDA ON *.* TO 'user_name' sebagai gantinya. GRANT AWS_LAMBDA_ACCESS TO 'user_name'

Untuk menggunakan Amazon RDS untuk My SQL atau Aurora My SQL sebagai target, tetapkan lower_case_table_names parameternya ke. 1 Nilai ini berarti bahwa SQL server Saya menangani pengidentifikasi nama objek seperti tabel, indeks, pemicu, dan database sebagai tidak peka huruf besar/kecil. Jika Anda telah mengaktifkan logging biner dalam instance target Anda, maka atur log_bin_trust_function_creators parameternya ke1. Dalam hal ini, Anda tidak perlu menggunakanDETERMINISTIC, READS SQL DATA atau NO SQL karakteristik untuk membuat fungsi yang disimpan. Untuk mengonfigurasi parameter ini, buat grup parameter DB baru atau modifikasi grup parameter DB yang ada.

Oracle ke pengaturan SQL konversi Saya

Untuk mengedit Oracle ke pengaturan SQL konversi saya, pilih Pengaturan di AWS SCT, lalu pilih Pengaturan konversi. Dari daftar atas, pilih Oracle, lalu pilih Oracle — My. SQL AWS SCT menampilkan semua pengaturan yang tersedia untuk Oracle ke SQL konversi Saya.

Pengaturan SQL konversi Oracle ke My AWS SCT termasuk opsi untuk yang berikut:

  • Untuk membatasi jumlah komentar dengan item tindakan dalam kode yang dikonversi.

    Untuk Tambahkan komentar di kode yang dikonversi untuk item tindakan dengan tingkat keparahan yang dipilih dan lebih tinggi, pilih tingkat keparahan item tindakan. AWS SCT menambahkan komentar dalam kode yang dikonversi untuk item tindakan dengan tingkat keparahan yang dipilih dan lebih tinggi.

    Misalnya, untuk meminimalkan jumlah komentar dalam kode yang dikonversi, pilih Error only. Untuk menyertakan komentar untuk semua item tindakan dalam kode yang dikonversi, pilih Semua pesan.

  • Untuk mengatasi bahwa database Oracle sumber Anda dapat menggunakan ROWID pseudocolumn tetapi My SQL tidak mendukung fungsionalitas serupa. AWS SCT dapat meniru ROWID pseudocolumn dalam kode yang dikonversi. Untuk melakukannya, pilih Hasilkan sebagai identitas untuk Hasilkan ID baris? .

    Jika kode Oracle sumber Anda tidak menggunakan ROWID pseudocolumn, pilih Don't generate for Generate row ID? Dalam hal ini, kode yang dikonversi bekerja lebih cepat.

  • Untuk bekerja dengan kode Oracle sumber Anda ketika menyertakanTO_CHAR,TO_DATE, dan TO_NUMBER fungsi dengan parameter yang SQL tidak didukung oleh My. Secara default, AWS SCT mengemulasi penggunaan parameter ini dalam kode yang dikonversi.

    Ketika kode Oracle sumber Anda hanya menyertakan parameter yang SQL didukung Postgre, Anda dapat menggunakan My, SQL TO_CHARTO_DATE, dan fungsi asli. TO_NUMBER Dalam hal ini, kode yang dikonversi bekerja lebih cepat. Untuk memasukkan hanya parameter ini, pilih nilai berikut:

    • Fungsi TO_ CHAR () tidak menggunakan string pemformatan khusus Oracle

    • Fungsi TO_ DATE () tidak menggunakan string pemformatan khusus Oracle

    • Fungsi TO_ NUMBER () tidak menggunakan string pemformatan khusus Oracle

  • Untuk menambahkan apakah database dan aplikasi Anda berjalan di zona waktu yang berbeda. Secara default, AWS SCT mengemulasi zona waktu dalam kode yang dikonversi. Namun, Anda tidak memerlukan emulasi ini ketika database dan aplikasi Anda menggunakan zona waktu yang sama. Dalam hal ini, pilih Zona waktu di sisi klien cocok dengan zona waktu di server.

Pertimbangan migrasi

Saat Anda mengonversi Oracle menjadi My SQL atau Aurora SQL My, untuk mengubah urutan pernyataan berjalan, Anda dapat menggunakan GOTO pernyataan dan label. RDS Setiap SQL pernyataan PL/yang mengikuti GOTO pernyataan dilewati, dan pemrosesan berlanjut pada label. Anda dapat menggunakan GOTO pernyataan dan label di mana saja dalam blok prosedur, batch, atau pernyataan. Anda juga bisa GOTO pernyataan berikutnya.

Saya SQL tidak menggunakan GOTO pernyataan. Ketika AWS SCT mengkonversi kode yang berisi GOTO pernyataan, itu mengubah pernyataan untuk menggunakan pernyataan BEGIN…END atauLOOP…END LOOP.

Anda dapat menemukan contoh bagaimana AWS SCT mengkonversi GOTO pernyataan dalam tabel berikut.

Pernyataan Oracle SQLPernyataan saya
BEGIN .... statement1; .... GOTO label1; statement2; .... label1: Statement3; .... END
BEGIN label1: BEGIN .... statement1; .... LEAVE label1; statement2; .... END; Statement3; .... END
BEGIN .... statement1; .... label1: statement2; .... GOTO label1; statement3; .... statement4; .... END
BEGIN .... statement1; .... label1: LOOP statement2; .... ITERATE label1; LEAVE label1; END LOOP; statement3; .... statement4; .... END
BEGIN .... statement1; .... label1: statement2; .... statement3; .... statement4; .... END
BEGIN .... statement1; .... label1: BEGIN statement2; .... statement3; .... statement4; .... END; END

Mengonversi WITH pernyataan di Oracle menjadi RDS untuk My SQL atau Amazon Aurora My SQL

Anda menggunakan WITH klausa (subquery_factoring) di Oracle untuk menetapkan nama (query_name) ke blok subquery. Anda kemudian dapat mereferensikan blok subquery beberapa tempat dalam kueri dengan menentukan query_name. Jika blok subquery tidak berisi link atau parameter (lokal, prosedur, fungsi, paket), kemudian AWS SCT mengkonversi klausa ke tampilan atau tabel sementara.

Keuntungan dari mengkonversi klausa ke tabel sementara adalah bahwa referensi berulang ke subquery mungkin lebih efisien. Efisiensi yang lebih besar adalah karena data mudah diambil dari tabel sementara daripada diminta oleh setiap referensi. Anda dapat meniru ini dengan menggunakan tampilan tambahan atau tabel sementara. Nama tampilan menggunakan format<procedure_name>$<subselect_alias>.

Anda dapat menemukan contoh dalam tabel berikut.

Pernyataan Oracle SQLPernyataan saya
CREATE PROCEDURE TEST_ORA_PG.P_WITH_SELECT_VARIABLE_01 (p_state IN NUMBER) AS l_dept_id NUMBER := 1; BEGIN FOR cur IN (WITH dept_empl(id, name, surname, lastname, state, dept_id) AS ( SELECT id, name, surname, lastname, state, dept_id FROM test_ora_pg.dept_employees WHERE state = p_state AND dept_id = l_dept_id) SELECT id,state FROM dept_empl ORDER BY id) LOOP NULL; END LOOP;
CREATE PROCEDURE test_ora_pg.P_WITH_SELECT_VARIABLE_01(IN par_P_STATE DOUBLE) BEGIN DECLARE var_l_dept_id DOUBLE DEFAULT 1; DECLARE var$id VARCHAR (8000); DECLARE var$state VARCHAR (8000); DECLARE done INT DEFAULT FALSE; DECLARE cur CURSOR FOR SELECT ID, STATE FROM (SELECT ID, NAME, SURNAME, LASTNAME, STATE, DEPT_ID FROM TEST_ORA_PG.DEPT_EMPLOYEES WHERE STATE = par_p_state AND DEPT_ID = var_l_dept_id) AS dept_empl ORDER BY ID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE; OPEN cur; read_label: LOOP FETCH cur INTO var$id, var$state; IF done THEN LEAVE read_label; END IF; BEGIN END; END LOOP; CLOSE cur; END;
CREATE PROCEDURE TEST_ORA_PG.P_WITH_SELECT_REGULAR_MULT_01 AS BEGIN FOR cur IN ( WITH dept_empl AS ( SELECT id, name, surname, lastname, state, dept_id FROM test_ora_pg.dept_employees WHERE state = 1), dept AS (SELECT id deptid, parent_id, name deptname FROM test_ora_pg.department ) SELECT dept_empl.*,dept.* FROM dept_empl, dept WHERE dept_empl.dept_id = dept.deptid ) LOOP NULL; END LOOP;
CREATE VIEW TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept_empl `(id, name, surname, lastname, state, dept_id) AS (SELECT id, name, surname, lastname, state, dept_id FROM test_ora_pg.dept_employees WHERE state = 1); CREATE VIEW TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept `(deptid, parent_id,deptname) AS (SELECT id deptid, parent_id, name deptname FROM test_ora_pg.department); CREATE PROCEDURE test_ora_pg.P_WITH_SELECT_REGULAR_MULT_01() BEGIN DECLARE var$ID DOUBLE; DECLARE var$NAME VARCHAR (30); DECLARE var$SURNAME VARCHAR (30); DECLARE var$LASTNAME VARCHAR (30); DECLARE var$STATE DOUBLE; DECLARE var$DEPT_ID DOUBLE; DECLARE var$deptid DOUBLE; DECLARE var$PARENT_ID DOUBLE; DECLARE var$deptname VARCHAR (200); DECLARE done INT DEFAULT FALSE; DECLARE cur CURSOR FOR SELECT dept_empl.*, dept.* FROM TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept_empl ` AS dept_empl, TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept ` AS dept WHERE dept_empl.DEPT_ID = dept.DEPTID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE; OPEN cur; read_label: LOOP FETCH cur INTO var$ID, var$NAME, var$SURNAME, var$LASTNAME, var$STATE, var$DEPT_ID, var$deptid, var$PARENT_ID, var$deptname; IF done THEN LEAVE read_label; END IF; BEGIN END; END LOOP; CLOSE cur; END; call test_ora_pg.P_WITH_SELECT_REGULAR_MULT_01()
CREATE PROCEDURE TEST_ORA_PG.P_WITH_SELECT_VAR_CROSS_02(p_state IN NUMBER) AS l_dept_id NUMBER := 10; BEGIN FOR cur IN ( WITH emp AS (SELECT id, name, surname, lastname, state, dept_id FROM test_ora_pg.dept_employees WHERE dept_id > 10 ), active_emp AS ( SELECT id FROM emp WHERE emp.state = p_state ) SELECT * FROM active_emp ) LOOP NULL; END LOOP; END;
CREATE VIEW TEST_ORA_PG.`P_WITH_SELECT_VAR_CROSS_01$emp `(id, name, surname, lastname, state, dept_id) AS (SELECT id, name, surname, lastname, state, dept_id FROM TEST_ORA_PG.DEPT_EMPLOYEES WHERE DEPT_ID > 10); CREATE PROCEDURE test_ora_pg.P_WITH_SELECT_VAR_CROSS_02(IN par_P_STATE DOUBLE) BEGIN DECLARE var_l_dept_id DOUBLE DEFAULT 10; DECLARE var$ID DOUBLE; DECLARE done INT DEFAULT FALSE; DECLARE cur CURSOR FOR SELECT * FROM (SELECT ID FROM TEST_ORA_PG. `P_WITH_SELECT_VAR_CROSS_01$emp` AS emp WHERE emp.STATE = par_p_state) AS active_emp; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE; OPEN cur; read_label: LOOP FETCH cur INTO var$ID; IF done THEN LEAVE read_label; END IF; BEGIN END; END LOOP; CLOSE cur; END;