Migración de aplicaciones de bases de datos MySQL a Autonomous Database

Puede migrar sentencias SQL de MySQL a Oracle SQL y ejecutar las sentencias en Autonomous Database.

Traducir sentencias MySQL a Oracle SQL

Puede traducir sentencias SQL escritas en MySQL a Oracle SQL y ejecutar las sentencias traducidas en Autonomous Database.

Utilice DBMS_CLOUD_MIGRATION.MIGRATE_SQL para convertir una sentencia MySQL en Oracle SQL. Hay variantes de procedimiento y función de DBMS_CLOUD_MIGRATION.MIGRATE_SQL.

Migrar la sentencia MySQL a Oracle SQL con el procedimiento MIGRATE_SQL

El siguiente ejemplo acepta la sentencia SQL escrita en MySQL como entrada, traduce la sentencia a Oracle SQL, asigna la sentencia SQL traducida a output_sql_result e imprime el resultado:

SET SERVEROUTPUT ON
   declare output_sql_result CLOB;
BEGIN
  DBMS_CLOUD_MIGRATION.MIGRATE_SQL(      
    original_sql => 'CREATE TABLE movie (movie_id INT, title VARCHAR(255));',
    output_sql   => output_sql_result,
    source_db    => 'MYSQL');
    DBMS_OUTPUT.PUT_LINE (output_sql_result);
END;        
/

OUTPUT
–-------------------------------------------------------------
CREATE TABLE movie (movie_id NUMBER(10), title VARCHAR2(255));

El parámetro original_sql especifica la sentencia MySQL.

El parámetro output_sql almacena el SQL traducido.

El parámetro source_db especifica MySQL como nombre de base de datos.

Consulte MIGRATE_SQL Procedimiento y función para obtener más información.

Migrar la sentencia MySQL a Oracle SQL con la función MIGRATE_SQL

En el siguiente ejemplo se muestra la función DBMS_CLOUD_MIGRATION.MIGRATE_SQL dentro de una sentencia SELECT. La entrada de función es una sentencia MySQL y la función devuelve la sentencia traducida en Oracle SQL:

SELECT DBMS_CLOUD_MIGRATION.MIGRATE_SQL(
     'CREATE TABLE movie (film_id INT, title VARCHAR(255));','MYSQL') AS output FROM DUAL;

OUTPUT
------------------------------------------------------------------------------
create table cars (brand VARCHAR2(255), model VARCHAR2(255);

Consulte MIGRATE_SQL Procedimiento y función para obtener más información.

Notas para ejecutar DBMS_CLOUD_MIGRATION.MIGRATE_SQL:

  • Puede que aparezca un error durante la conversión si la sentencia SQL de entrada no está soportada en Oracle SQL. Consulte Limitaciones para la migración y traducción de sentencias MySQL a Oracle SQL para obtener más información.

  • Los subprogramas DBMS_CLOUD_MIGRATION.MIGRATE_SQL solo aceptan una sentencia SQL como entrada. Por lo tanto, solo se puede traducir una única sentencia SQL por llamada.

Ejecución de sentencias MySQL en Autonomous Database

Puede traducir y ejecutar de forma interactiva sentencias MySQL en su instancia de Autonomous Database.

Utilice el procedimiento ENABLE_TRANSLATION para activar la traducción en tiempo real de sentencias SQL escritas en MySQL. Después de activar la traducción en una sesión, las sentencias MySQL se traducen y ejecutan automáticamente como sentencias SQL de Oracle, y puede ver los resultados.

Por ejemplo, después de activar la traducción mediante la ejecución de ENABLE_TRANSLATION, puede realizar de forma interactiva lo siguiente en una sesión:
  • Cree las tablas. Por ejemplo, cree las tablas MOVIE y INVENTORY.

  • Insertar Datos en las Tablas.

  • Tablas de consulta.

  • Realizar operaciones JOIN en tablas. Por ejemplo, puede realizar una unión externa izquierda en las tablas.

Para activar la traducción con MySQL y ejecutar comandos:

  1. Conéctese a Autonomous Database mediante un cliente SQL.

    Consulte Conexión a Autonomous Database para obtener más información.

    Nota

    DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION no está soportado en Database Actions y no está soportado con el servicio de Oracle APEX.
  2. Ejecute DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION para activar la traducción de SQL en tiempo real en la sesión. Utilice el parámetro MYSQL para traducir de MySQL.
    BEGIN
     DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION('MYSQL');
    END;
    /

    Utilice la siguiente consulta para verificar el idioma de traducción SQL de la sesión:

    SELECT SYS_CONTEXT('USERENV','SQL_TRANSLATION_PROFILE_NAME') FROM DUAL;

    Consulte Procedimiento ENABLE_TRANSLATION para obtener más información.

  3. Introduzca las sentencias MySQL. Por ejemplo:
    CREATE TABLE movie (film_id int, title varchar(255));
    
    Table MOVIE created.

    Esto traduce y ejecuta automáticamente la sentencia MySQL CREATE TABLE.

    Puede verificarlo con el comando DESC. Por ejemplo:
    DESC movie;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    TITLE                 VARCHAR2(255)
    Se crea la tabla MOVIE y los tipos de dato de cada una de las columnas se convierten automáticamente en tipos de dato de Oracle.

    Puede que se produzca un error durante la conversión si la sentencia SQL de entrada no está soportada. Consulte Limitaciones para la migración y traducción de sentencias MySQL a Oracle SQL para obtener más información.

  4. Inserte datos en la tabla MOVIE. Por ejemplo:
    INSERT INTO movie (film_id, title) VALUES (123, 'Tangled');
    
    1 row inserted.
    
    INSERT INTO movie (film_id, title) VALUES (234, 'Frozen');
    
    1 row inserted.

    Verifique la inserción de datos consultando la tabla MOVIE. Por ejemplo:

    SELECT * FROM movie;
    
    FILM_ID  TITLE
    –------- –--------
    123	 Tangled
    234	 Frozen
    
  5. Cree una tabla INVENTORY:
    CREATE TABLE inventory (film_id int, inventory_id int);
    
    Table INVENTORY created.
    Puede verificar este paso con el comando DESC. Por ejemplo:
    DESC inventory;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    INVENTORY_ID          NUMBER(38)
    Se crea la tabla INVENTORY y los tipos de dato de cada una de las columnas se convierten automáticamente en tipos de dato de Oracle.
  6. Inserte datos en la tabla INVENTORY. Por ejemplo:
    INSERT INTO inventory(film_id, inventory_id) VALUES (123, 223);
    
    1 row inserted.
    
    INSERT INTO inventory(film_id, inventory_id) VALUES (234, 334);
    
    1 row inserted.

    Verifique la inserción de datos consultando INVENTORY. Por ejemplo:

    SELECT * FROM inventory;
    
    FILM_ID  INVENTORY_ID
    –------- –------------
    123	 223
    234	 334
  7. Realice una unión externa izquierda en las tablas MOVIE y INVENTORY:
    SELECT m.film_id, m.title, inventory_id 
        FROM movie AS m LEFT JOIN inventory 
        ON inventory.film_id = m.film_id;
    
      FILM_ID  TITLE       INVENTORY_ID
    ---------- ---------- ------------
           234 Frozen      334
           123 Tangled     223
    

    En este ejemplo se realiza un LEFT OUTER JOIN en las tablas movie y inventory. La palabra clave AS para los alias de tabla en la cláusula FROM no está soportada en Oracle SQL. La consulta se convierte primero en Oracle SQL y, a continuación, se ejecuta en la sesión.

  8. Utilice el procedimiento DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION para desactivar la traducción del idioma SQL en tiempo real para la sesión.
    BEGIN
     DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION;
    END;
    /

    Esto devuelve un error si la traducción del idioma SQL no está activada para la sesión.

    Consulte Procedimiento DISABLE_TRANSLATION

Puede consultar la vista V$MAPPED_SQL para mostrar las sentencias MySQL traducidas y asignadas en memoria a sentencias SQL de Oracle.

Por ejemplo:

SELECT v.* 
    FROM v$mapped_sql v, dba_objects o
    WHERE v.sql_translation_profile_id = o.object_id
        AND o.object_name = 'MYSQL'
        AND o.object_type = 'TRANSLATION PROFILE';
Consulte V$MAPPED_SQL para obtener más información.

Migración de archivos MySQL a Oracle SQL

Puede migrar un archivo que contenga sentencias MySQL a un archivo que contenga sentencias SQL de Oracle.

El procedimiento DBMS_CLOUD_MIGRATION.MIGRATE_FILE traduce sentencias SQL en un archivo MySQL de Object Storage y genera un nuevo archivo que contiene Oracle SQL.

Como requisito, cargue uno o más archivos MySQL con una extensión .sql en una ubicación de Object Storage. En los siguientes ejemplos se utiliza el archivo mysqltest.sql que se carga en Object Storage. Consulte Colocación de datos en Object Storage para obtener más información.

Para migrar archivos MySQL a Oracle SQL:

  1. Conexión a la instancia de Autonomous Database.

    Consulte Conexión a Autonomous Database para obtener más información.

  2. Configure el acceso a Cloud Object Storage mediante una entidad de recurso o mediante la creación de un objeto de credencial.

    Este paso proporciona acceso al almacenamiento de objetos en la nube, donde puede colocar los archivos que va a migrar:

  3. También puede mostrar los archivos de Object Storage. Por ejemplo:
    VAR function_list CLOB;
    SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS
       (credential_name => 'OCI$RESOURCE_PRINCIPAL', location_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files');
    
    OBJECT_NAME
    ---------------------
    mysqltest.sql

    Como alternativa, si crea una credencial en lugar de la entidad de recurso, OCI$RESOURCE_PRINCIPAL, especifique el nombre de credencial en el parámetro credential_name.

    Consulte Función LIST_OBJECTS para obtener más información.

  4. Ejecute DBMS_CLOUD_MIGRATION.MIGRATE_FILE para migrar el archivo MySQL a Oracle SQL:
    BEGIN
     DBMS_CLOUD_MIGRATION.MIGRATE_FILE (
         credential_name => 'OCI$RESOURCE_PRINCIPAL',
         location_uri    => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files/mysqltest.sql',
         source_db       => 'MYSQL'
        );
    END;
    /

    El parámetro credential_name especifica la credencial para acceder al URI de Cloud Object Storage. El usuario que ejecuta DBMS_CLOUD_MIGRATION.MIGRATE_FILE debe tener el privilegio EXECUTE para el objeto de credencial utilizado para acceder al URI de Object Storage. Es decir, la credencial que especifique con el parámetro credential_name. Si utiliza una credencial en lugar de una entidad de recurso, especifique el nombre de la credencial en el parámetro credential_name.

    El parámetro location_uri especifica el URI del archivo de origen. El formato del URI depende del servicio de Cloud Object Storage que utilice. Consulte DBMS_CLOUD URI Formats para obtener más información.

    El parámetro source_db especifica MySQL como idioma de la base de datos. Utilice el valor MYSQL para convertir archivos MySQL en Oracle SQL.

    La ejecución de este comando convierte el archivo MySQL mysqltest.sql en Oracle SQL y genera un nuevo archivo con el nombre original_filename_oracle.sql.

    Para este ejemplo, la ejecución de DBMS_CLOUD_MIGRATION.MIGRATE_FILE con el archivo de entrada mysqltest.sql genera mysqltest_oracle.sql. Después del paso de traducción, el procedimiento carga mysqltest_oracle.sql en Object Storage.

    Opcionalmente, utilice el parámetro target_uri para especificar la ubicación en la que se carga el archivo traducido. El valor por defecto de este parámetro es NULL, lo que significa que el archivo traducido se carga en la misma ubicación que se especifica en el parámetro location_uri.

    Consulte Procedimiento MIGRATE_FILE para obtener más información.

  5. Verifique que se haya generado el archivo de salida.
    SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS (
        credential_name => 'OCI$RESOURCE_PRINCIPAL', location_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files');
    
    OBJECT_NAME
    ---------------------
    mysqltest.sql
    mysqltest_oracle.sql

    Como alternativa, si crea una credencial en lugar de la entidad de recurso, OCI$RESOURCE_PRINCIPAL, especifique el nombre de credencial en el parámetro credential_name.

    Consulte Función LIST_OBJECTS para obtener más información.

Ejecute la siguiente consulta para ver el contenido del archivo mysqltest_oracle.sql:

SELECT UTL_RAW.CAST_TO_VARCHAR2 (DBMS_CLOUD.GET_OBJECT(
   credential_name => 'OCI$RESOURCE_PRINCIPAL', 
   object_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files')) 
FROM dual;

UTL_RAW.CAST_TO_VARCHAR2(DBMS_CLOUD.GET_OBJECT(CREDENTIAL_NAME=>'CRED1',OBJECT_U
--------------------------------------------------------------------------------
DROP TABLE movie;
DROP TABLE inventory;
CREATE TABLE movie (film_id NUMBER(10), title VARCHAR2(255));
INSERT INTO movie (film_id, title) VALUES (123, 'Tangled');
INSERT INTO movie (film_id, title) VALUES (234, 'Frozen');
CREATE TABLE movie (film_id NUMBER(10), inventory_id NUMBER(10));
INSERT INTO movie (film_id, inventory_id) VALUES (123, 223);
INSERT INTO inventory (film_id, inventory_id) VALUES (234, 334);
SELECT * FROM movie;

Como alternativa, si crea una credencial en lugar de la entidad de recurso, OCI$RESOURCE_PRINCIPAL, especifique el nombre de credencial en el parámetro credential_name.

Consulte GET_OBJECT Procedimiento y función para obtener más información.

Limitaciones para la migración y traducción de sentencias MySQL a Oracle SQL

En esta sección se resumen las limitaciones para migrar sentencias SQL de MySQL a Oracle SQL.

Tenga en cuenta las siguientes restricciones al migrar del tipo de base de datos MySQL a Oracle SQL:

  • Variables globales definidas por el usuario: las variables globales definidas por el usuario MySQL declaradas con el formato @var_name no están soportadas al realizar la conversión a Oracle SQL.

  • Identificadores entre comillas: los identificadores MySQL que se incluyen con backticks (`), como `var_name`, no están soportados al realizar la conversión a Oracle SQL. Solo se admiten identificadores que no tengan comillas o estén entre comillas dobles.

  • Delimitadores:
    • Para funciones y procedimientos, solo están soportados los delimitadores $$ y //.

    • Para las sentencias SQL solo está soportado el delimitador ;.

No se admite la siguiente lista de funciones MySQL:
  • ADDTIME(datetime, time)

  • AES_DECRYPT(crypt_str, key_str)

  • AES_ENCRYPT(str, key_str)

  • BIN(num)

  • CONV(num, from_base, to_base)

  • CONVERT_TZ(datetime, from, to)

  • CRC32(exp)

  • DATE_ADD(date, interval)