を使用した Oracle から Amazon RDS for MySQL または Amazon Aurora My SQLへの移行 AWS Schema Conversion Tool - AWS Schema Conversion Tool

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

を使用した Oracle から Amazon RDS for MySQL または Amazon Aurora My SQLへの移行 AWS Schema Conversion Tool

変換したマイSQLコードで Oracle データベース関数をエミュレートするには、 で Oracle からマイSQLへの拡張パックを使用します AWS SCT。拡張機能の詳細については、「での拡張パックの使用 AWS Schema Conversion Tool」を参照してください。

ターゲットデータベースとしての MySQL の権限

ターゲットとしての MySQL に必要な権限は次のとおりです。

  • CREATE ON *.*

  • ALTER ON *.*

  • DROP ON *.*

  • INDEX ON *.*

  • REFERENCES ON *.*

  • SELECT ON *.*

  • CREATE VIEW ON *.*

  • SHOW VIEW ON *.*

  • TRIGGER ON *.*

  • CREATE ROUTINE ON *.*

  • ALTER ROUTINE ON *.*

  • EXECUTE ON *.*

  • CREATE TEMPORARY TABLES ON *.*

  • AWS_LAMBDA_ACCESS

  • INSERT、UPDATEON AWS_ORACLE_EXT.*

  • INSERT、UPDATE、DELETEON AWS_ORACLE_EXTDATA.*

マイSQLデータベースバージョン 5.7 以前をターゲットとして使用する場合は、AWS_LAMBDA_ の代わりに INVOKE LAMBDA *.* アクセス許可を付与しますACCESS。マイSQLデータベースバージョン 8.0 以降では、AWS_LAMBDA_ACCESS アクセス許可を付与します。

次のコード例を使用してデータベースユーザーを作成し、権限を付与できます。

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

前の例では、user_name ユーザーの名前を入力します。次に、your_password 安全なパスワードを使用します。

マイSQLデータベースバージョン 5.7 以前をターゲットとして使用する場合は、 GRANT INVOKE LAMBDA ON *.* TO 'user_name'の代わりに を使用しますGRANT AWS_LAMBDA_ACCESS TO 'user_name'

Amazon RDS for MySQL または Aurora MySQL をターゲットとして使用するには、 lower_case_table_namesパラメータを に設定します1。この値は、My SQLサーバーがテーブル、インデックス、トリガー、データベースなどのオブジェクト名の識別子を大文字と小文字を区別しないものとして処理することを意味します。ターゲットインスタンスでバイナリログを有効にしている場合は、log_bin_trust_function_creators パラメータを 1 と設定します。この場合、ストアド関数を作成するのに、DETERMINISTIC 特性、READS SQL DATA 特性、NO SQL 特性を使用する必要はありません。これらのパラメータを設定するには、新しい DB パラメータグループを作成するか、既存の DB パラメータグループを変更します。

Oracle から My SQLへの変換設定

Oracle から MySQL への変換設定を編集するには、「」で「設定」を選択し AWS SCT、「変換設定」を選択します。上部のリストから Oracle を選択し、Oracle を選択します。Oracle から My SQLへのSQL変換に使用できるすべての設定 AWS SCT が表示されます。

の Oracle から My SQLへの変換設定 AWS SCT には、次のオプションが含まれています。

  • 変換されたコード内のアクション項目に関するコメントの数を制限する。

    選択した重要度以上のアクション項目の変換されたコードにコメントを追加する で、アクション項目の重要度を選択します。選択した重要度以上のアクション項目の変換されたコードにコメント AWS SCT を追加します。

    たとえば、変換したコード内のコメントの数を最小限に抑えるには、[エラーのみ] を選択します。変換したコードのすべてのアクション項目にコメントを含めるには、[すべてのメッセージ] を選択します。

  • ソース Oracle データベースがROWID擬似列を使用できるが、MySQL は同様の機能をサポートしていないことに対処するため。 は変換されたコードでROWID擬似列をエミュレート AWS SCT できます。そのためには、[行 ID を生成しますか] で [ID として生成] を選択します。

    Oracle のソースコードで ROWID 疑似列を使用していない場合は、[行 ID を生成しますか] で [生成しない] を選択します。この場合、変換されたコードの処理が速くなります。

  • MySQL がサポートしていないパラメータを持つ TO_CHARTO_DATE、および TO_NUMBER関数が含まれている場合にソース Oracle コードを操作するには。デフォルトでは、 AWS SCT は変換後のコードでこれらのパラメータの使用法をエミュレートします。

    ソース Oracle コードに PostgreSQL がサポートするパラメータのみが含まれている場合は、ネイティブの MySQL TO_CHARTO_DATE、および TO_NUMBER関数を使用できます。この場合、変換されたコードの処理が速くなります。これらのパラメータのみを含めるには、以下の値を選択します。

    • 関数 TO_CHAR() は Oracle 固有のフォーマット文字列を使用しません

    • 関数 TO_DATE() は Oracle 固有のフォーマット文字列を使用しません

    • 関数 TO_NUMBER() は Oracle 固有のフォーマット文字列を使用しません

  • データベースとアプリケーションが異なるタイムゾーンで実行されているかどうかを調べる。デフォルトでは、 AWS SCT は変換されたコードのタイムゾーンをエミュレートします。ただし、データベースとアプリケーションが同じタイムゾーンを使用している場合は、このエミュレーションは必要ありません。この場合、[クライアント側のタイムゾーンをサーバーのタイムゾーンと一致させる] を選択してください。

移行に関する考慮事項

Oracle を RDS for MySQL または Aurora My に変換するとSQL、ステートメントの実行順序を変更するには、GOTOステートメントとラベルを使用できます。ステートメントに従う PL/SQL GOTO ステートメントはスキップされ、処理はラベルで続行されます。GOTO ステートメントとラベルは、プロシージャ、バッチ、またはステートメント ブロック内のどこでも使用できます。次のGOTOステートメントも実行できます。

はSQL GOTOステートメントを使用しません。がステートメントを含むコードを AWS SCT 変換するとGOTO、 ステートメントは BEGIN…ENDまたは LOOP…END LOOPステートメントを使用するように変換されます。

がステートメントを AWS SCT 変換する方法の例を次の表GOTOに示します。

Oracle ステートメント マイSQLステートメント
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

Oracle の WITHステートメントを RDS for MySQL または Amazon Aurora My に変換するSQL

Oracle の WITH句 (subquery_factoring) を使用して、サブクエリブロックに名前 (query_name) を割り当てます。サブクエリブロックをクエリの複数の場所で参照するには、query_name を指定します。サブクエリブロックにリンクまたはパラメータ (ローカル、プロシージャ、関数、パッケージ) が含まれていない場合、 は 句をビューまたは一時テーブル AWS SCT に変換します。

句を一時テーブルに変換する利点は、サブクエリへの繰り返し参照がより効率的であることです。各参照によって要求されるのではなく、一時テーブルからデータが簡単に取得されるために効率が向上します。追加のビューまたは一時テーブルを使用して、これをエミュレートできます。ビュー名には <procedure_name>$<subselect_alias> の形式が使用されます。

次の表で例を確認できます。

Oracle ステートメント マイSQLステートメント
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;