

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 MySQL atau Amazon Aurora dengan AWS Schema Conversion Tool
<a name="CHAP_Source.Oracle.ToMySQL"></a>

Untuk meniru fungsi database Oracle dalam kode MySQL Anda yang dikonversi, gunakan paket ekstensi Oracle ke MySQL. AWS SCT Untuk informasi selengkapnya tentang paket ekstensi, lihat[Menggunakan paket ekstensi dengan AWS Schema Conversion Tool](CHAP_ExtensionPack.md). 

**Topics**
+ [Hak istimewa untuk MySQL sebagai basis data target](#CHAP_Source.Oracle.ToMySQL.ConfigureTarget)
+ [Pengaturan konversi Oracle ke MySQL](#CHAP_Source.Oracle.ToMySQL.ConversionSettings)
+ [Pertimbangan migrasi](#CHAP_Source.Oracle.ToMySQL.MigrationConsiderations)
+ [Mengonversi pernyataan WITH di Oracle ke RDS untuk MySQL atau Amazon Aurora MySQL](#CHAP_Source.Oracle.ToMySQL.With)

## Hak istimewa untuk MySQL sebagai basis data target
<a name="CHAP_Source.Oracle.ToMySQL.ConfigureTarget"></a>

Hak istimewa yang diperlukan untuk MySQL sebagai target adalah sebagai berikut:
+ BUAT DI \$1 . \$1
+ UBAH PADA \$1 . \$1
+ JATUHKAN\$1 . \$1
+ INDEKS PADA\$1 . \$1
+ REFERENSI PADA\$1 . \$1
+ PILIH PADA \$1 . \$1
+ BUAT TAMPILAN DI \$1 . \$1
+ TAMPILKAN TAMPILAN DI \$1 . \$1
+ PEMICU PADA \$1 . \$1
+ BUAT RUTINITAS DI \$1 . \$1
+ MENGUBAH RUTINITAS PADA \$1 . \$1
+ MENGEKSEKUSI PADA \$1 . \$1
+ BUAT TABEL SEMENTARA DI \$1 . \$1
+ AWS\$1LAMBDA\$1AKSES
+ SISIPKAN, PERBARUI PADA AWS\$1ORACLE \$1EXT. \$1
+ SISIPKAN, PERBARUI, HAPUS PADA AWS\$1ORACLE \$1EXT\$1DATA. \$1

Jika Anda menggunakan database MySQL versi 5.7 atau lebih rendah sebagai target, maka berikan izin INVOKE LAMBDA \$1.\$1 alih-alih \$1ACCESS. AWS\$1LAMBDA Untuk database MySQL versi 8.0 dan yang lebih tinggi, berikan izin. AWS\$1LAMBDA\$1ACCESS 

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\$1name* dengan nama pengguna Anda. Kemudian, ganti *your\$1password* dengan kata sandi yang aman.

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

Untuk menggunakan Amazon RDS for MySQL atau Aurora MySQL sebagai target, tetapkan parameter ke. `lower_case_table_names` `1` Nilai ini berarti bahwa server MySQL menangani pengidentifikasi nama objek seperti tabel, indeks, pemicu, dan database sebagai case insensitive. Jika Anda telah mengaktifkan logging biner dalam instance target Anda, maka atur `log_bin_trust_function_creators` parameternya ke`1`. Dalam hal ini, Anda tidak perlu menggunakan`DETERMINISTIC`, `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.

## Pengaturan konversi Oracle ke MySQL
<a name="CHAP_Source.Oracle.ToMySQL.ConversionSettings"></a>

**Untuk mengedit pengaturan konversi Oracle ke MySQL, pilih Pengaturan AWS SCT di, **lalu pilih** Pengaturan konversi.** Dari daftar atas, pilih **Oracle**, dan kemudian pilih **Oracle - MySQL**. AWS SCT menampilkan semua pengaturan yang tersedia untuk konversi Oracle ke MySQL.

Pengaturan konversi Oracle ke MySQL AWS SCT di menyertakan 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 MySQL 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 menyertakan`TO_CHAR`,`TO_DATE`, dan `TO_NUMBER` fungsi dengan parameter yang MySQL tidak mendukung. Secara default, AWS SCT mengemulasi penggunaan parameter ini dalam kode yang dikonversi.

  Ketika kode Oracle sumber Anda hanya menyertakan parameter yang didukung PostgreSQL, Anda dapat menggunakan MySQL asli,, dan fungsi. `TO_CHAR` `TO_DATE` `TO_NUMBER` Dalam hal ini, kode yang dikonversi bekerja lebih cepat. Untuk memasukkan hanya parameter ini, pilih nilai berikut:
  + **Fungsi TO\$1CHAR () tidak menggunakan string pemformatan khusus Oracle**
  + **Fungsi TO\$1DATE () tidak menggunakan string pemformatan khusus Oracle**
  + **Fungsi TO\$1NUMBER () 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
<a name="CHAP_Source.Oracle.ToMySQL.MigrationConsiderations"></a>

Saat Anda mengonversi Oracle ke RDS untuk MySQL atau Aurora MySQL, untuk mengubah urutan pernyataan berjalan, Anda dapat menggunakan pernyataan dan label. `GOTO` Setiap pernyataan PL/SQL 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 dapat melanjutkan pernyataan GOTO.

MySQL tidak menggunakan pernyataan. `GOTO` Ketika AWS SCT mengkonversi kode yang berisi `GOTO` pernyataan, itu mengubah pernyataan untuk menggunakan pernyataan `BEGIN…END` atau`LOOP…END LOOP`. 

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


| Pernyataan Oracle | Pernyataan MySQL | 
| --- | --- | 
|  <pre>BEGIN<br />   ....<br />   statement1;<br />   ....<br />   GOTO label1;<br />   statement2;<br />   ....<br />   label1:<br />   Statement3;<br />   ....<br />END<br /></pre>  |  <pre>BEGIN<br /> label1:<br /> BEGIN<br />   ....<br />   statement1;<br />   ....<br />   LEAVE label1;<br />   statement2;<br />   ....<br /> END;<br />   Statement3;<br />   ....<br />END<br /></pre>  | 
|  <pre>BEGIN<br />   ....<br />   statement1;<br />   ....<br />   label1:<br />   statement2;<br />   ....<br />   GOTO label1;<br />   statement3;<br />   ....<br />   statement4;<br />   ....<br />END<br /></pre>  |  <pre>BEGIN<br />   ....<br />   statement1;<br />   ....<br />   label1:<br />   LOOP<br />    statement2;<br />    ....<br />    ITERATE label1;<br />    LEAVE label1;<br />   END LOOP; <br />    statement3;<br />    ....<br />    statement4;<br />    ....<br />END<br /></pre>  | 
|  <pre>BEGIN<br />   ....<br />   statement1;<br />   ....<br />   label1:<br />   statement2;<br />   ....<br />   statement3;<br />   ....<br />   statement4;<br />   ....<br />END<br /></pre>  |  <pre>BEGIN<br />   ....<br />   statement1;<br />   ....<br />   label1:<br />   BEGIN<br />    statement2;<br />    ....    <br />    statement3;<br />    ....<br />    statement4;<br />    ....    <br />   END; <br />END<br /></pre>  | 

## Mengonversi pernyataan WITH di Oracle ke RDS untuk MySQL atau Amazon Aurora MySQL
<a name="CHAP_Source.Oracle.ToMySQL.With"></a>

Anda menggunakan klausa WITH (subquery\$1factoring) di Oracle untuk menetapkan nama (query\$1name) ke blok subquery. Anda kemudian dapat mereferensikan blok subquery beberapa tempat dalam kueri dengan menentukan query\$1name. 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 | Pernyataan MySQL | 
| --- | --- | 
|  <pre>CREATE PROCEDURE <br /> TEST_ORA_PG.P_WITH_SELECT_VARIABLE_01<br />     (p_state IN NUMBER)<br />AS<br />  l_dept_id NUMBER := 1; <br />BEGIN<br />FOR cur IN  <br />           (WITH dept_empl(id, name, surname, <br />              lastname, state, dept_id)<br />              AS<br />                  (<br />                    SELECT id, name, surname,  <br />                     lastname, state, dept_id <br />                      FROM test_ora_pg.dept_employees<br />                     WHERE state = p_state AND <br />                       dept_id = l_dept_id)<br />            SELECT id,state   <br />              FROM dept_empl<br />            ORDER BY id)  LOOP<br />  NULL;<br />END LOOP;<br /></pre>  |  <pre>CREATE PROCEDURE test_ora_pg.P_WITH_SELECT_VARIABLE_01(IN par_P_STATE DOUBLE)<br />BEGIN<br />    DECLARE var_l_dept_id DOUBLE DEFAULT 1;<br />    DECLARE var$id VARCHAR (8000);<br />    DECLARE var$state VARCHAR (8000);<br />    DECLARE done INT DEFAULT FALSE;<br />    DECLARE cur CURSOR FOR SELECT<br />        ID, STATE<br />        FROM (SELECT<br />            ID, NAME, SURNAME, LASTNAME, STATE, DEPT_ID<br />            FROM TEST_ORA_PG.DEPT_EMPLOYEES<br />            WHERE STATE = par_p_state AND DEPT_ID = var_l_dept_id) AS dept_empl<br />        ORDER BY ID;<br />    DECLARE CONTINUE HANDLER FOR NOT FOUND<br />        SET done := TRUE;<br />    OPEN cur;<br /><br />    read_label:<br />    LOOP<br />        FETCH cur INTO var$id, var$state;<br /><br />        IF done THEN<br />            LEAVE read_label;<br />        END IF;<br /><br />        BEGIN<br />        END;<br />    END LOOP;<br />    CLOSE cur;<br />END;<br /></pre>  | 
|  <pre>CREATE PROCEDURE <br /> TEST_ORA_PG.P_WITH_SELECT_REGULAR_MULT_01<br />AS    <br />BEGIN<br /><br /> FOR cur IN  (<br />               WITH dept_empl AS<br />                   (<br />                        SELECT id, name, surname, <br />                         lastname, state, dept_id <br />                          FROM test_ora_pg.dept_employees<br />                         WHERE state = 1),<br />                    dept AS <br />                   (SELECT id deptid, parent_id, <br />                      name deptname<br />                      FROM test_ora_pg.department                <br />                   )<br />                SELECT dept_empl.*,dept.*          <br />                 FROM dept_empl, dept<br />                 WHERE dept_empl.dept_id = dept.deptid<br />              ) LOOP<br />              NULL;<br />            END LOOP;<br /></pre>  |  <pre>CREATE VIEW TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept_empl<br /> `(id, name, surname, lastname, state, dept_id)<br />AS<br />(SELECT id, name, surname, lastname, state, dept_id <br />   FROM test_ora_pg.dept_employees<br />  WHERE state = 1);<br />  <br />CREATE VIEW TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept<br /> `(deptid, parent_id,deptname)<br />AS<br />(SELECT id deptid, parent_id, name deptname<br />   FROM test_ora_pg.department);  <br /><br /><br />CREATE PROCEDURE test_ora_pg.P_WITH_SELECT_REGULAR_MULT_01()<br />BEGIN<br />    DECLARE var$ID DOUBLE;<br />    DECLARE var$NAME VARCHAR (30);<br />    DECLARE var$SURNAME VARCHAR (30);<br />    DECLARE var$LASTNAME VARCHAR (30);<br />    DECLARE var$STATE DOUBLE;<br />    DECLARE var$DEPT_ID DOUBLE;<br />    DECLARE var$deptid DOUBLE;<br />    DECLARE var$PARENT_ID DOUBLE;<br />    DECLARE var$deptname VARCHAR (200);<br />    DECLARE done INT DEFAULT FALSE;<br />    DECLARE cur CURSOR FOR SELECT<br />        dept_empl.*, dept.*<br />        FROM TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept_empl<br />          ` AS dept_empl,<br />             TEST_ORA_PG.`P_WITH_SELECT_REGULAR_MULT_01$dept<br />          ` AS dept<br />        WHERE dept_empl.DEPT_ID = dept.DEPTID;<br />    DECLARE CONTINUE HANDLER FOR NOT FOUND<br />        SET done := TRUE;<br />    OPEN cur;<br /><br />    read_label:<br />    LOOP<br />    FETCH cur INTO var$ID, var$NAME, var$SURNAME, <br />     var$LASTNAME, var$STATE, var$DEPT_ID, var$deptid, <br />     var$PARENT_ID, var$deptname;<br /><br />        IF done THEN<br />            LEAVE read_label;<br />        END IF;<br /><br />        BEGIN<br />        END;<br />    END LOOP;<br />    CLOSE cur;<br />END;<br /><br />call test_ora_pg.P_WITH_SELECT_REGULAR_MULT_01()<br /></pre>  | 
|  <pre>CREATE PROCEDURE <br />  TEST_ORA_PG.P_WITH_SELECT_VAR_CROSS_02(p_state IN NUMBER)<br />AS    <br />   l_dept_id NUMBER := 10;<br />BEGIN<br /> FOR cur IN  (<br />               WITH emp AS              <br />                    (SELECT id, name, surname, <br />                      lastname, state, dept_id <br />                       FROM test_ora_pg.dept_employees<br />                      WHERE dept_id > 10                 <br />                    ),<br />                    active_emp AS<br />                    (<br />                      SELECT id<br />                        FROM emp<br />                       WHERE emp.state = p_state <br />                    )<br />                    <br />                SELECT *          <br />                  FROM active_emp                 <br />              ) LOOP<br />         NULL;<br />  END LOOP;<br />  <br />END;<br /></pre>  |  <pre>CREATE VIEW TEST_ORA_PG.`P_WITH_SELECT_VAR_CROSS_01$emp<br />    `(id, name, surname, lastname, state, dept_id)<br />AS<br />(SELECT<br />       id, name, surname, lastname, <br />       state, dept_id<br />  FROM TEST_ORA_PG.DEPT_EMPLOYEES<br />  WHERE DEPT_ID > 10);<br /><br /><br />CREATE PROCEDURE <br />   test_ora_pg.P_WITH_SELECT_VAR_CROSS_02(IN par_P_STATE DOUBLE)<br />BEGIN<br />    DECLARE var_l_dept_id DOUBLE DEFAULT 10;<br />    DECLARE var$ID DOUBLE;<br />    DECLARE done INT DEFAULT FALSE;<br />    DECLARE cur CURSOR FOR SELECT *<br />                             FROM (SELECT<br />                                      ID<br />                                     FROM <br />                             TEST_ORA_PG.<br />                              `P_WITH_SELECT_VAR_CROSS_01$emp` AS emp<br />                                   WHERE emp.STATE = par_p_state) <br />                                    AS active_emp;<br />    DECLARE CONTINUE HANDLER FOR NOT FOUND<br />        SET done := TRUE;<br />    OPEN cur;<br /><br />    read_label:<br />    LOOP<br />        FETCH cur INTO var$ID;<br /><br />        IF done THEN<br />            LEAVE read_label;<br />        END IF;<br /><br />        BEGIN<br />        END;<br />    END LOOP;<br />    CLOSE cur;<br />END;<br /></pre>  | 