Migration d'applications à partir de bases de données MySQL vers Autonomous Database

Vous pouvez migrer des instructions SQL de MySQL vers Oracle SQL et les exécuter sur Autonomous Database.

Convertir des instructions MySQL en instructions SQL Oracle

Vous pouvez convertir des instructions SQL écrites dans MySQL en instructions SQL Oracle et exécuter les instructions traduites sur Autonomous Database.

Utilisez DBMS_CLOUD_MIGRATION.MIGRATE_SQL pour convertir une instruction MySQL en instruction SQL Oracle. Il existe des variantes de procédure et de fonction de DBMS_CLOUD_MIGRATION.MIGRATE_SQL.

Migration de l'instruction MySQL vers Oracle SQL avec la procédure MIGRATE_SQL

L'exemple suivant accepte l'instruction SQL écrite dans MySQL en tant qu'entrée, convertit l'instruction en instruction SQL Oracle, affecte l'instruction SQL traduite à output_sql_result et affiche le résultat :

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

Le paramètre original_sql indique l'instruction MySQL.

Le paramètre output_sql stocke le code SQL traduit.

Le paramètre source_db indique MySQL comme nom de base de données.

Pour plus d'informations, reportez-vous à Procédure et fonction MIGRATE_SQL.

Migration de l'instruction MySQL vers Oracle SQL avec la fonction MIGRATE_SQL

L'exemple suivant montre la fonction DBMS_CLOUD_MIGRATION.MIGRATE_SQL dans une instruction SELECT. L'entrée de la fonction est une instruction MySQL et la fonction renvoie l'instruction traduite dans 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);

Pour plus d'informations, reportez-vous à Procédure et fonction MIGRATE_SQL.

Remarques relatives à l'exécution de DBMS_CLOUD_MIGRATION.MIGRATE_SQL :

Exécution d'instructions MySQL dans Autonomous Database

Vous pouvez traduire et exécuter des instructions MySQL de manière interactive dans votre instance Autonomous Database.

Utilisez la procédure ENABLE_TRANSLATION pour activer la traduction en temps réel des instructions SQL écrites dans MySQL. Une fois la traduction activée dans une session, les instructions MySQL sont automatiquement traduites et exécutées en tant qu'instructions SQL Oracle, et vous pouvez voir les résultats.

Par exemple, après avoir activé la traduction en exécutant ENABLE_TRANSLATION, vous pouvez effectuer les opérations suivantes de manière interactive dans une session :
  • Créez les tables. Par exemple, créez les tables MOVIE et INVENTORY.

  • Insérer des données dans les tables.

  • Tables des requêtes.

  • Effectuez des opérations JOIN sur les tables. Par exemple, vous pouvez effectuer une jointure externe gauche sur des tables.

Pour activer la traduction avec MySQL et exécuter des commandes, procédez comme suit :

  1. Connectez-vous à votre instance Autonomous Database à l'aide d'un client SQL.

    Pour plus d'informations, reportez-vous à Connexion à Autonomous Database.

    Remarque

    DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION n'est pas pris en charge dans Database Actions et n'est pas pris en charge avec le service Oracle APEX.
  2. Exécutez DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION pour activer la traduction SQL en temps réel dans la session. Utilisez le paramètre MYSQL pour effectuer la traduction à partir de MySQL.
    BEGIN
     DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION('MYSQL');
    END;
    /

    Utilisez la requête suivante pour vérifier la langue de traduction SQL de votre session :

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

    Pour plus d'informations, reportez-vous à Procédure ENABLE_TRANSLATION.

  3. Entrez les instructions MySQL. Exemples :
    CREATE TABLE movie (film_id int, title varchar(255));
    
    Table MOVIE created.

    Cette opération traduit et exécute automatiquement l'instruction MySQL CREATE TABLE.

    Vous pouvez vérifier à l'aide de la commande DESC. Exemples :
    DESC movie;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    TITLE                 VARCHAR2(255)
    La table MOVIE est créée et les types de données de chacune des colonnes sont automatiquement convertis en types de données Oracle.

    Une erreur peut survenir lors de la conversion si l'instruction SQL d'entrée n'est pas prise en charge. Pour plus d'informations, reportez-vous à Limites relatives à la migration et à la traduction des instructions MySQL vers Oracle SQL.

  4. Insérez des données dans la table MOVIE. Exemples :
    INSERT INTO movie (film_id, title) VALUES (123, 'Tangled');
    
    1 row inserted.
    
    INSERT INTO movie (film_id, title) VALUES (234, 'Frozen');
    
    1 row inserted.

    Vérifiez l'insertion des données en interrogeant la table MOVIE. Exemples :

    SELECT * FROM movie;
    
    FILM_ID  TITLE
    –------- –--------
    123	 Tangled
    234	 Frozen
    
  5. Créez une table INVENTORY :
    CREATE TABLE inventory (film_id int, inventory_id int);
    
    Table INVENTORY created.
    Vous pouvez vérifier cette étape à l'aide de la commande DESC. Exemples :
    DESC inventory;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    INVENTORY_ID          NUMBER(38)
    La table INVENTORY est créée et les types de données de chacune des colonnes sont automatiquement convertis en types de données Oracle.
  6. Insérez des données dans la table INVENTORY. Exemples :
    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.

    Vérifiez l'insertion des données en interrogeant INVENTORY. Exemples :

    SELECT * FROM inventory;
    
    FILM_ID  INVENTORY_ID
    –------- –------------
    123	 223
    234	 334
  7. Effectuez une jointure externe gauche sur les tables MOVIE et 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
    

    Cet exemple effectue une opération LEFT OUTER JOIN sur les tables movie et inventory. Le mot-clé AS pour les alias de table dans la clause FROM n'est pas pris en charge dans Oracle SQL. La requête est d'abord convertie en code SQL Oracle, puis exécutée dans la session.

  8. Utilisez la procédure DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION pour désactiver la traduction en temps réel du langage SQL pour votre session.
    BEGIN
     DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION;
    END;
    /

    Cela renvoie une erreur si la traduction en langage SQL n'est pas activée pour votre session.

    Reportez-vous à Procédure DISABLE_TRANSLATION

Vous pouvez interroger la vue V$MAPPED_SQL pour répertorier les instructions MySQL traduites et mises en correspondance en mémoire avec les instructions SQL Oracle.

Exemples :

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';
Pour plus d'informations, reportez-vous à V$MAPPED_SQL.

Migrer des fichiers MySQL vers Oracle SQL

Vous pouvez migrer un fichier contenant des instructions MySQL vers un fichier contenant des instructions SQL Oracle.

La procédure DBMS_CLOUD_MIGRATION.MIGRATE_FILE convertit les instructions SQL dans un fichier MySQL dans Object Storage et génère un nouveau fichier contenant Oracle SQL.

Vous devez au préalable télécharger des fichiers MySQL avec une extension .sql vers un emplacement dans Object Storage. Les exemples suivants utilisent le fichier mysqltest.sql téléchargé vers Object Storage. Pour plus d'informations, reportez-vous à Mise des données dans le stockage d'objets.

Pour migrer des fichiers MySQL vers Oracle SQL, procédez comme suit :

  1. Connectez-vous à votre instance Autonomous Database.

    Pour plus d'informations, reportez-vous à Connexion à Autonomous Database.

  2. Configurez l'accès à Cloud Object Storage à l'aide d'un principal de ressource ou en créant un objet d'informations d'identification.

    Cette étape permet d'accéder au stockage d'objet cloud où placer les fichiers en cours de migration :

  3. Vous pouvez éventuellement répertorier les fichiers dans Object Storage. Exemples :
    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

    Si vous créez des informations d'identification à la place du principal de ressource, OCI$RESOURCE_PRINCIPAL, indiquez le nom des informations d'identification dans le paramètre credential_name.

    Pour plus d'informations, reportez-vous à Fonction LIST_OBJECTS.

  4. Exécutez DBMS_CLOUD_MIGRATION.MIGRATE_FILE pour migrer le fichier MySQL vers 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;
    /

    Le paramètre credential_name indique les informations d'identification permettant d'accéder à l'URI de stockage d'objet cloud. L'utilisateur qui exécute DBMS_CLOUD_MIGRATION.MIGRATE_FILE doit disposer du privilège EXECUTE pour l'objet d'informations d'identification utilisé pour accéder à l'URI Object Storage. Autrement dit, les informations d'identification que vous indiquez avec le paramètre credential_name. Si vous utilisez des informations d'identification au lieu d'un principal de ressource, indiquez le nom des informations d'identification dans le paramètre credential_name.

    Le paramètre location_uri indique l'URI du fichier source. Le format de l'URI dépend du service Cloud Object Storage que vous utilisez. Pour plus d'informations, reportez-vous à la section DBMS_CLOUD URI Formats.

    Le paramètre source_db indique MySQL comme langue de base de données. Utilisez la valeur MYSQL pour convertir les fichiers MySQL en instructions SQL Oracle.

    L'exécution de cette commande convertit le fichier MySQL mysqltest.sql en code SQL Oracle et génère un nouveau fichier nommé original_filename_oracle.sql.

    Pour cet exemple, l'exécution de DBMS_CLOUD_MIGRATION.MIGRATE_FILE avec le fichier d'entrée mysqltest.sql génère mysqltest_oracle.sql. Après l'étape de traduction, la procédure télécharge mysqltest_oracle.sql vers Object Storage.

    Vous pouvez éventuellement utiliser le paramètre target_uri pour indiquer l'emplacement de téléchargement du fichier traduit. La valeur par défaut de ce paramètre est NULL, ce qui signifie que le fichier traduit est téléchargé vers le même emplacement que celui indiqué dans le paramètre location_uri.

    Pour plus d'informations, reportez-vous à Procédure MIGRATE_FILE.

  5. Vérifiez que le fichier de sortie a été généré.
    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

    Si vous créez des informations d'identification à la place du principal de ressource, OCI$RESOURCE_PRINCIPAL, indiquez le nom des informations d'identification dans le paramètre credential_name.

    Pour plus d'informations, reportez-vous à Fonction LIST_OBJECTS.

Exécutez la requête suivante pour afficher le contenu du fichier 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;

Si vous créez des informations d'identification à la place du principal de ressource, OCI$RESOURCE_PRINCIPAL, indiquez le nom des informations d'identification dans le paramètre credential_name.

Pour plus d'informations, reportez-vous à Procédure et fonction GET_OBJECT.

Limites relatives à la migration et à la traduction des instructions MySQL vers Oracle SQL

Cette section récapitule les limites de migration des instructions SQL de MySQL vers Oracle SQL.

Lors de la migration de la variante de base de données MySQL vers Oracle SQL, tenez compte des restrictions suivantes :

  • Variables globales définies par l'utilisateur : les variables globales définies par l'utilisateur MySQL déclarées au format @var_name ne sont pas prises en charge lors de la conversion en SQL Oracle.

  • Identificateurs entre guillemets : les identificateurs MySQL qui sont entourés de backticks (`), tels que `var_name`, ne sont pas pris en charge lors de la conversion en SQL Oracle. Seuls les identificateurs sans guillemets ou placés entre guillemets doubles sont pris en charge.

  • Délimiteurs :
    • Pour les fonctions et les procédures, seuls les séparateurs $$ et // sont pris en charge.

    • Pour les instructions SQL, seul le délimiteur ; est pris en charge.

La liste suivante des fonctions MySQL n'est pas prise en charge :
  • 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)