Migración de Oracle a Amazon RDS para MySQL o Amazon Aurora MySQL con 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 para MySQL o Amazon Aurora MySQL con AWS Schema Conversion Tool

Para simular las funciones de la base de datos de Oracle en código MySQL convertido, utilice el paquete de extensión de Oracle a MySQL en 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 MySQL como base de datos de destino

Los privilegios necesarios para MySQL como destino se enumeran a continuación:

  • 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

  • INSERTAR, ACTUALIZAR EN AWS_ORACLE _EXT. *

  • INSERTAR, ACTUALIZAR Y ELIMINAR EN AWS_ORACLE _EXT_DATA. *

Si utiliza como destino una base de datos MySQL 5.7 o inferior, conceda el permiso INVOKE LAMBDA *.* en lugar de _ACCESS. AWS_LAMBDA Para las bases de datos MySQL versión 8.0 y superiores, conceda el AWS_LAMBDA_ACCESS permiso.

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, user_name sustitúyalo por el nombre de tu usuario. A continuación, your_password sustitúyala por una contraseña segura.

Si utiliza como destino una base de datos MySQL 5.7 o anterior, utilice GRANT INVOKE LAMBDA ON *.* TO 'user_name' en lugar de GRANT AWS_LAMBDA_ACCESS TO 'user_name'.

Para usar Amazon RDS para MySQL o Aurora MySQL como destino, establezca el parámetro lower_case_table_names en 1. Este valor significa que el servidor MySQL gestiona los identificadores de nombres de objetos como tablas, índices, disparadores 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 MySQL

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

La configuración de conversión de Oracle a MySQL 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, selecciona 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 solucionarlo, su base de datos Oracle de origen puede utilizar la ROWID pseudocolumna, pero MySQL no admite una funcionalidad similar. 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.

  • Trabajar con el código fuente de Oracle cuando incluye las funciones TO_CHAR, TO_DATE y TO_NUMBER con parámetros que MySQL 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 compatibles con PostgreSQL, puede utilizar funciones TO_CHAR, TO_DATE y TO_NUMBER de MySQL 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 a RDS para MySQL o Aurora MySQL, para cambiar el orden en que se ejecutan las sentencias, puede utilizar una instrucción GOTO y una etiqueta. Todas las instrucciones PL/SQL que van detrás de una instrucción GOTO 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 anidar las instrucciones GOTO.

MySQL no utiliza instrucciones GOTO. Cuando AWS SCT convierte el código que contiene una GOTO sentencia, convierte la sentencia para usar una sentencia BEGIN…END orLOOP…END LOOP.

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

Instrucción de Oracle Instrucción de MySQL
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 la instrucción WITH en Oracle a Amazon RDS para MySQL o Amazon Aurora MySQL

Puede utilizar la cláusula WITH (subquery_factoring) en Oracle para asignar un nombre (query_name) a un bloque subquery. 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 ni 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 Instrucción de MySQL
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;