다음을 사용하여 My SQL 또는 Amazon Aurora RDS SQL My를 위해 오라클에서 아마존으로 마이그레이션하기 AWS Schema Conversion Tool - AWS Schema Conversion Tool

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

다음을 사용하여 My SQL 또는 Amazon Aurora RDS SQL My를 위해 오라클에서 아마존으로 마이그레이션하기 AWS Schema Conversion Tool

변환된 내 SQL 코드에서 Oracle 데이터베이스 함수를 에뮬레이션하려면 Oracle to My 확장 팩을 사용하십시오. SQL AWS SCT확장 팩에 대한 자세한 내용은 다음과 함께 확장 팩 사용 AWS Schema Conversion Tool 섹션을 참조하세요.

대상 SQL 데이터베이스로서의 My 권한

SQL대상으로서 My에 필요한 권한은 다음과 같습니다.

  • CREATE켜짐* . *

  • ALTER아니오* . *

  • DROP아니오* . *

  • INDEX아니오* . *

  • REFERENCES아니오* . *

  • SELECT아니오* . *

  • CREATEVIEW아니오* . *

  • SHOWVIEW아니오* . *

  • TRIGGER아니오* . *

  • CREATEROUTINE아니오* . *

  • ALTERROUTINE아니오* . *

  • EXECUTE아니오* . *

  • CREATETEMPORARYTABLES아니오* . *

  • AWS_LAMBDA_ACCESS

  • INSERT, UPDATE 아니요 AWS _ ORACLE _EXT. *

  • INSERTUPDATE, 아니요 DELETE AWS _ ORACLE _ EXT _DATA. *

내 SQL 데이터베이스 버전 5.7 이하를 대상으로 사용하는 경우 _ _ 대신 INVOKE LAMBDA AWS *.* 권한을 부여하십시오. 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 My SQL 또는 Aurora My를 대상으로 사용하려면 lower_case_table_names 파라미터를 SQL 로 설정합니다. 1 이 값은 내 SQL 서버가 테이블, 인덱스, 트리거 및 데이터베이스와 같은 객체 이름의 식별자를 대소문자를 구분하지 않고 처리한다는 것을 의미합니다. 대상 인스턴스에서 이진 로깅을 활성화했다면 log_bin_trust_function_creators 파라미터를 1로 설정합니다. 이 경우 저장된 함수를 생성하기 위해 DETERMINISTIC, READS SQL DATA 또는 NO SQL 특성을 사용할 필요가 없습니다. 이들 파라미터를 구성하려면 새 DB 파라미터 그룹을 생성하거나 기존 DB 파라미터 그룹을 수정해야 합니다.

Oracle에서 My로의 변환 설정 SQL

Oracle에서 My로 SQL 변환 설정을 편집하려면 에서 AWS SCT설정을 선택한 다음 전환 설정을 선택합니다. 상단 목록에서 Oracle을 선택한 다음 Oracle — My를 선택합니다SQL. AWS SCT Oracle에서 My로 SQL 변환하는 데 사용할 수 있는 모든 설정을 표시합니다.

Oracle에서 My로 SQL 변환 설정에는 다음과 같은 옵션이 AWS SCT 포함됩니다.

  • 변환된 코드에서 작업 항목이 포함된 설명의 수를 제한합니다.

    선택한 심각도 이상의 작업 항목에 대해 변환된 코드에 주석 추가에서 작업 항목의 심각도를 선택합니다. AWS SCT 선택한 심각도 이상의 작업 항목에 대해 변환된 코드에 설명을 추가합니다.

    예를 들어, 변환된 코드의 설명 수를 최소화하려면 오류만을 선택합니다. 변환된 코드의 모든 작업 항목에 대한 설명을 포함하려면 모든 메시지를 선택합니다.

  • 원본 Oracle 데이터베이스에서 ROWID 유사 열을 사용할 수 있지만 My에서는 유사한 기능을 SQL 지원하지 않는다는 점을 해결하기 위해 이 문제를 해결하십시오. AWS SCT 변환된 코드의 ROWID 유사 열을 에뮬레이션할 수 있습니다. 이렇게 하려면 행 ID 생성?에서 Generate as identity를 선택합니다.

    소스 Oracle 코드에서 ROWID 의사 열을 사용하지 않는 경우 행 ID 생성?에서 Don't generate를 선택합니다. 이 경우, 변환된 코드는 더 빠르게 작동합니다.

  • My에서 지원하지 않는 매개 변수를 사용하는 TO_CHARTO_DATE, 및 TO_NUMBER 함수가 포함된 경우 소스 Oracle 코드를 사용하여 작업하기 위함입니다. SQL 기본적으로 AWS SCT 는 이러한 파라미터의 사용을 변환된 코드로 에뮬레이션합니다.

    소스 Oracle 코드에 Postgre가 SQL 지원하는 매개변수만 포함된 경우 기본 My, SQL TO_CHARTO_DATE, 및 TO_NUMBER 함수를 사용할 수 있습니다. 이 경우, 변환된 코드는 더 빠르게 작동합니다. 이러한 파라미터만 포함하려면 다음 값을 선택합니다.

    • TO_ CHAR () 함수는 Oracle 전용 형식 지정 문자열을 사용하지 않습니다.

    • TO_ DATE () 함수는 Oracle 전용 형식 지정 문자열을 사용하지 않습니다.

    • TO_ NUMBER () 함수는 Oracle 전용 형식 지정 문자열을 사용하지 않습니다.

  • 데이터베이스와 애플리케이션이 서로 다른 시간대에서 실행되는지 여부를 확인합니다. 기본적으로 AWS SCT 는 변환된 코드로 시간대를 에뮬레이션합니다. 하지만 데이터베이스와 애플리케이션이 동일한 시간대를 사용하는 경우에는 이 에뮬레이션이 필요하지 않습니다. 이 경우 Time zone on the client side matches the time zone on server를 선택합니다.

마이그레이션 고려 사항

Oracle을 RDS for My SQL 또는 Aurora SQL My로 변환할 때 명령문이 실행되는 순서를 변경하려면 GOTO 명령문과 레이블을 사용할 수 있습니다. SQL명령문 뒤에 오는 모든 PL/ GOTO 명령문은 건너뛰고 레이블에서 처리가 계속됩니다. GOTO 문과 레이블은 프로시저, 배치(batch), 명령문 블록 내 어디든 사용할 수 있습니다. 다음 GOTO 명령문을 사용할 수도 있습니다.

My는 GOTO 명세서를 사용하지 SQL 않아요. GOTO명령문이 포함된 코드를 AWS SCT 변환할 때 명령문은 BEGIN…END or LOOP…END LOOP 문을 사용하도록 변환됩니다.

다음 GOTO 표에서 명령문을 AWS SCT 변환하는 방법의 예를 찾을 수 있습니다.

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

오라클의 WITH 명세서를 My SQL 또는 Amazon Aurora RDS My용으로 변환 SQL

Oracle의 WITH 절 (subquery_factoring) 을 사용하여 하위 쿼리 블록에 이름 (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;