Migración de Oracle a Amazon RDS for My SQL o Amazon Aurora My SQL con el AWS Schema Conversion Tool - AWS Schema Conversion Tool

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Migración de Oracle a Amazon RDS for My SQL o Amazon Aurora My SQL con el AWS Schema Conversion Tool

Para emular las funciones de la base de datos Oracle en el SQL código My convertido, utilice el paquete de extensiones Oracle to My SQL incluido. AWS SCT Para obtener más información acerca de los paquetes de extensión , consulte Uso de paquetes de extensión con AWS Schema Conversion Tool.

Privilegios para My SQL como base de datos de destino

Los privilegios necesarios para My SQL como objetivo son los siguientes:

  • CREATEEN * . *

  • ALTERENCENDIDO* . *

  • DROPENCENDIDO* . *

  • INDEXENCENDIDO* . *

  • REFERENCESENCENDIDO* . *

  • SELECTENCENDIDO* . *

  • CREATEVIEWENCENDIDO* . *

  • SHOWVIEWENCENDIDO* . *

  • TRIGGERENCENDIDO* . *

  • CREATEROUTINEENCENDIDO* . *

  • ALTERROUTINEENCENDIDO* . *

  • EXECUTEENCENDIDO* . *

  • CREATETEMPORARYTABLESENCENDIDO* . *

  • AWS_LAMBDA_ACCESS

  • INSERT, UPDATE EL AWS _ ORACLE _EXT. *

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

Si utiliza como destino una versión 5.7 o inferior de Mi SQL base de datos, conceda el permiso INVOKE LAMBDA *.* en lugar de AWS _ LAMBDA _ACCESS. Para la versión 8.0 y superior de Mis SQL bases de datos, conceda el ACCESS permiso AWS _ LAMBDA _.

Puede usar el siguiente ejemplo de código para crear un usuario de base de datos y conceder los privilegios.

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

En el ejemplo anterior, sustituya user_name por el nombre de su usuario. A continuación, sustituya your_password con una contraseña segura.

Si utiliza como destino una versión 5.7 o inferior de Mi SQL base de datos, utilice GRANT INVOKE LAMBDA ON *.* TO 'user_name' en lugar deGRANT AWS_LAMBDA_ACCESS TO 'user_name'.

Para usar Amazon RDS for My SQL o Aurora My SQL como objetivo, defina el lower_case_table_names parámetro en1. Este valor significa que el SQL servidor My gestiona los identificadores de nombres de objetos como tablas, índices, activadores y bases de datos sin distinguir entre mayúsculas y minúsculas. Si ha activado el registro binario en la instancia de destino, establezca el parámetro log_bin_trust_function_creators en 1. En este caso, no es necesario utilizar las características DETERMINISTIC, READS SQL DATA o NO SQL para crear funciones almacenadas. Para configurar estos parámetros, cree un grupo de parámetros de base de datos nuevo o modifique uno existente.

Configuración de conversión de Oracle a My SQL

Para editar la configuración de SQL conversión de Oracle a My, seleccione Configuración en y AWS SCT, a continuación, elija Configuración de conversión. En la lista superior, seleccione Oracle y, a continuación, Oracle — My SQL. AWS SCT muestra todos los ajustes disponibles para la SQL conversión de Oracle a My.

La configuración de SQL conversión de Oracle a My AWS SCT incluye opciones para lo siguiente:

  • Limitar el número de comentarios con elementos de acción en el código convertido.

    En Añadir comentarios en el código convertido para los elementos de acción de la gravedad seleccionada o superior, seleccione la gravedad de los elementos de acción. AWS SCT añade comentarios en el código convertido para los elementos de acción de la gravedad seleccionada o superior.

    Por ejemplo, para minimizar el número de comentarios en el código convertido, seleccione Solo errores. Para incluir comentarios para todos los elementos de acción del código convertido, seleccione Todos los mensajes.

  • Para solucionar este problema, la base de datos Oracle de origen puede utilizar la ROWID pseudocolumna, pero My SQL no admite funciones similares. AWS SCT puede emular la ROWID pseudocolumna en el código convertido. Para ello, elija Generar como identidad en ¿Generar ID de fila?.

    Si el código fuente de Oracle no utiliza la pseudocolumna ROWID, seleccione No generar para generar en ¿Generar ID de fila? En este caso, el código convertido funciona más rápido.

  • Para trabajar con el código fuente de Oracle cuando incluye las TO_NUMBER funciones TO_CHARTO_DATE, y con parámetros que My SQL no admite. De forma predeterminada, AWS SCT simula el uso de estos parámetros en el código convertido.

    Si el código fuente de Oracle incluye solo los parámetros SQL compatibles con Postgre, puede utilizar las funciones My SQL TO_CHARTO_DATE, y TO_NUMBER nativas. En este caso, el código convertido funciona más rápido. Para incluir solo estos parámetros, seleccione los siguientes valores:

    • La función TO_ CHAR () no utiliza cadenas de formato específicas de Oracle

    • La función TO_ DATE () no utiliza cadenas de formato específicas de Oracle

    • La función TO_ NUMBER () no utiliza cadenas de formato específicas de Oracle

  • Determinar si la base de datos y las aplicaciones se ejecutan en zonas horarias diferentes. De forma predeterminada, AWS SCT simula las zonas horarias del código convertido. Sin embargo, no necesita esta simulación cuando la base de datos y las aplicaciones utilizan la misma zona horaria. En este caso, seleccione La zona horaria del cliente coincide con la zona horaria del servidor.

Consideraciones sobre la migración

Al convertir Oracle en RDS for My SQL o Aurora MySQL, para cambiar el orden en el que se ejecutan las sentencias, puede utilizar una GOTO sentencia y una etiqueta. SQLLas sentencias PL/ que siguen a una GOTO sentencia se omiten y el procesamiento continúa en la etiqueta. Puede usar las instrucciones GOTO y las etiquetas se pueden utilizar en cualquier lugar de un procedimiento, lote o bloque de instrucciones. También puede enumerar las declaraciones siguientesGOTO.

My SQL no usa GOTO declaraciones. Cuando AWS SCT convierte el código que contiene una GOTO sentencia, convierte la sentencia para usar una LOOP…END LOOP sentencia BEGIN…END o.

Puede encontrar ejemplos de cómo se AWS SCT convierten GOTO las sentencias en la siguiente tabla.

Instrucción de Oracle ¿Mi SQL declaración
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

Convertir el WITH estado de cuenta en Oracle RDS para My SQL o Amazon Aurora My SQL

La WITH cláusula (subquery_factoring) de Oracle se utiliza para asignar un nombre (query_name) a un bloque de subconsultas. A continuación, puede hacer referencia al bloque subquery en varios lugares de la consulta especificando el valor de query_name. Si un bloque de subconsultas no contiene enlaces o parámetros (local, procedimiento, función, paquete), AWS SCT convierte la cláusula en una vista o una tabla temporal.

El beneficio de convertir la cláusula en una tabla temporal es que las referencias repetidas a la subconsulta podrían ser más eficientes. La mayor eficiencia se debe a que los datos se recuperan fácilmente de la tabla temporal en lugar de que cada referencia tenga que solicitarlos. Puede emular esto mediante vistas adicionales o una tabla temporal. El nombre de la consulta utiliza el formato <procedure_name>$<subselect_alias>.

Puede encontrar ejemplos en la siguiente tabla.

Instrucción de Oracle Mi declaración 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;