Anwendungen von MySQL-Datenbanken zu Autonomous Database migrieren

Sie können SQL-Anweisungen von MySQL zu Oracle SQL migrieren und die Anweisungen in Autonomous Database ausführen.

MySQL-Anweisungen in Oracle SQL übersetzen

Sie können SQL-Anweisungen, die in MySQL geschrieben wurden, in Oracle SQL übersetzen und die übersetzten Anweisungen in Autonomous Database ausführen.

Mit DBMS_CLOUD_MIGRATION.MIGRATE_SQL können Sie eine MySQL-Anweisung in Oracle SQL übersetzen. Es gibt Prozedur- und Funktionsvarianten von DBMS_CLOUD_MIGRATION.MIGRATE_SQL.

MySQL-Anweisung mit der Prozedur MIGRATE_SQL in Oracle SQL migrieren

Im folgenden Beispiel wird die in MySQL geschriebene SQL-Anweisung als Eingabe akzeptiert, die Anweisung in Oracle SQL übersetzt, die übersetzte SQL-Anweisung output_sql_result zugewiesen und das Ergebnis ausgegeben:

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

Der Parameter original_sql gibt die MySQL-Anweisung an.

Der Parameter output_sql speichert die übersetzte SQL.

Der Parameter source_db gibt MySQL als Datenbanknamen an.

Weitere Informationen finden Sie unter MIGRATE_SQL Prozedur und Funktion.

MySQL-Anweisung mit der Funktion MIGRATE_SQL in Oracle SQL migrieren

Das folgende Beispiel zeigt die Funktion DBMS_CLOUD_MIGRATION.MIGRATE_SQL innerhalb einer SELECT-Anweisung. Die Funktionseingabe ist eine MySQL-Anweisung, und die Funktion gibt die übersetzte Anweisung in Oracle SQL zurück:

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

Weitere Informationen finden Sie unter MIGRATE_SQL Prozedur und Funktion.

Hinweise zur Ausführung von DBMS_CLOUD_MIGRATION.MIGRATE_SQL:

MySQL-Anweisungen in Autonomous Database ausführen

Sie können MySQL-Anweisungen interaktiv in Autonomous Database übersetzen und ausführen.

Verwenden Sie die Prozedur ENABLE_TRANSLATION, um die Echtzeitübersetzung von SQL-Anweisungen zu aktivieren, die in MySQL geschrieben sind. Nachdem Sie die Übersetzung in einer Session aktiviert haben, werden MySQL-Anweisungen automatisch übersetzt und als Oracle SQL-Anweisungen ausgeführt. Die Ergebnisse werden angezeigt.

Beispiel: Nachdem Sie die Übersetzung aktiviert haben, indem Sie ENABLE_TRANSLATION ausführen, können Sie in einer Session interaktiv Folgendes ausführen:
  • Tabellen erstellen Beispiel: Erstellen Sie die Tabellen MOVIE und INVENTORY.

  • Daten in Tabellen einfügen

  • Abfragetabellen

  • JOIN-Vorgänge für Tabellen ausführen Beispiel: Sie können einen linken Outer Join für Tabellen ausführen.

So aktivieren Sie die Übersetzung mit MySQL und führen Befehle aus:

  1. Stellen Sie mit einem SQL-Client eine Verbindung zu Ihrer Autonomous Database her.

    Weitere Informationen finden Sie unter Verbindung zu Autonomous Database herstellen.

    Hinweis

    DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION wird in Database Actions nicht unterstützt und nicht mit dem Oracle APEX-Service unterstützt.
  2. Führen Sie DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION aus, um die Echtzeit-SQL-Übersetzung in der Session zu aktivieren. Verwenden Sie den Parameter MYSQL, um aus MySQL zu übersetzen.
    BEGIN
     DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION('MYSQL');
    END;
    /

    Verwenden Sie die folgende Abfrage, um die SQL-Übersetzungssprache für Ihre Session zu prüfen:

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

    Weitere Informationen finden Sie unter Prozedur ENABLE_TRANSLATION.

  3. Geben Sie MySQL-Anweisungen ein. Beispiel:
    CREATE TABLE movie (film_id int, title varchar(255));
    
    Table MOVIE created.

    Dadurch wird die Anweisung MySQL CREATE TABLE automatisch übersetzt und ausgeführt.

    Sie können die Prüfung mit dem Befehl DESC durchführen. Beispiel:
    DESC movie;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    TITLE                 VARCHAR2(255)
    Die Tabelle MOVIE wird erstellt, und die Datentypen jeder Spalte werden automatisch in Oracle-Datentypen konvertiert.

    Bei der Übersetzung kann es zu einem Fehler kommen, wenn die eingegebene SQL-Anweisung nicht unterstützt wird. Weitere Informationen finden Sie unter Einschränkungen bei der Migration und Übersetzung von MySQL-Anweisungen in Oracle SQL.

  4. Fügen Sie Daten in die Tabelle MOVIE ein. Beispiel:
    INSERT INTO movie (film_id, title) VALUES (123, 'Tangled');
    
    1 row inserted.
    
    INSERT INTO movie (film_id, title) VALUES (234, 'Frozen');
    
    1 row inserted.

    Prüfen Sie die Dateneinfügung, indem Sie die Tabelle MOVIE abfragen. Beispiel:

    SELECT * FROM movie;
    
    FILM_ID  TITLE
    –------- –--------
    123	 Tangled
    234	 Frozen
    
  5. Erstellen Sie eine INVENTORY-Tabelle:
    CREATE TABLE inventory (film_id int, inventory_id int);
    
    Table INVENTORY created.
    Sie können diesen Schritt mit dem Befehl DESC prüfen. Beispiel:
    DESC inventory;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    INVENTORY_ID          NUMBER(38)
    Die Tabelle INVENTORY wird erstellt, und die Datentypen jeder Spalte werden automatisch in Oracle-Datentypen konvertiert.
  6. Fügen Sie Daten in die Tabelle INVENTORY ein. Beispiel:
    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.

    Prüfen Sie die Dateneinfügung, indem Sie INVENTORY abfragen. Beispiel:

    SELECT * FROM inventory;
    
    FILM_ID  INVENTORY_ID
    –------- –------------
    123	 223
    234	 334
  7. Führen Sie einen linken Outer Join für die Tabellen MOVIE und INVENTORY aus:
    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
    

    In diesem Beispiel wird eine LEFT OUTER JOIN für die Tabellen movie und inventory ausgeführt. Das Schlüsselwort AS für Tabellenaliasnamen in der FROM-Klausel wird in Oracle SQL nicht unterstützt. Die Abfrage wird zuerst in Oracle SQL übersetzt und dann in der Session ausgeführt.

  8. Verwenden Sie die Prozedur DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION, um die Echtzeit-SQL-Sprachübersetzung für Ihre Session zu deaktivieren.
    BEGIN
     DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION;
    END;
    /

    Dies gibt einen Fehler zurück, wenn die Übersetzung der SQL-Sprache für Ihre Session nicht aktiviert ist.

    Siehe Prozedur DISABLE_TRANSLATION

Sie können die View V$MAPPED_SQL abfragen, um die MySQL-Anweisungen aufzulisten, die übersetzt und Oracle SQL-Anweisungen im Speicher zugeordnet werden.

Beispiel:

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';
Weitere Informationen finden Sie unter V$MAPPED_SQL.

MySQL-Dateien zu Oracle SQL migrieren

Sie können eine Datei mit MySQL-Anweisungen in eine Datei mit Oracle SQL-Anweisungen migrieren.

Die Prozedur DBMS_CLOUD_MIGRATION.MIGRATE_FILE übersetzt SQL-Anweisungen in eine Datei MySQL in Object Storage und generiert eine neue Datei mit Oracle SQL.

Als Voraussetzung müssen Sie mindestens eine MySQL-Datei mit der Erweiterung .sql in einen Speicherort in Object Storage hochladen. In den folgenden Beispielen wird die Datei mysqltest.sql verwendet, die in Object Storage hochgeladen wird. Weitere Informationen finden Sie unter Daten in Objektspeicher einfügen.

So migrieren Sie MySQL-Dateien zu Oracle SQL:

  1. Verbinden Sie sich mit Ihrer Autonomous Database-Instanz.

    Weitere Informationen finden Sie unter Verbindung zu Autonomous Database herstellen.

  2. Konfigurieren Sie den Zugriff auf Cloud Object Storage mit einem Resource Principal oder durch Erstellen eines Zugangsdatenobjekts.

    Dieser Schritt bietet Zugriff auf den Cloud Object Storage, in dem Sie die zu migrierenden Dateien ablegen:

  3. Optional können Sie die Dateien in Object Storage auflisten. Beispiel:
    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

    Wenn Sie alternativ Zugangsdaten anstelle des Resource Principals OCI$RESOURCE_PRINCIPAL erstellen, geben Sie den Zugangsdatennamen im Parameter credential_name an.

    Weitere Informationen finden Sie unter Funktion LIST_OBJECTS.

  4. Führen Sie DBMS_CLOUD_MIGRATION.MIGRATE_FILE aus, um die Datei MySQL in Oracle SQL zu migrieren:
    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;
    /

    Der Parameter credential_name gibt die Zugangsdaten für den Zugriff auf die Cloud-Objektspeicher-URI an. Der Benutzer, der DBMS_CLOUD_MIGRATION.MIGRATE_FILE ausführt, muss die Berechtigung EXECUTE für das Zugangsdatenobjekt haben, das für den Zugriff auf die Object Storage-URI verwendet wird. Das heißt, die Zugangsdaten, die Sie mit dem Parameter credential_name angeben. Wenn Sie Zugangsdaten anstelle eines Resource Principals verwenden, geben Sie den Zugangsdatennamen im Parameter credential_name an.

    Der Parameter location_uri gibt die Quelldatei-URI an. Das Format der URI hängt vom verwendeten Cloud-Objektspeichersystem ab. Weitere Informationen finden Sie unter DBMS_CLOUD URI-Formate.

    Der Parameter source_db gibt MySQL als Datenbanksprache an. Verwenden Sie den Wert MYSQL, um MySQL-Dateien in Oracle SQL zu übersetzen.

    Wenn Sie diesen Befehl ausführen, wird die Datei MySQL mysqltest.sql in Oracle SQL übersetzt und eine neue Datei mit dem Namen original_filename_oracle.sql generiert.

    In diesem Beispiel generiert die Ausführung von DBMS_CLOUD_MIGRATION.MIGRATE_FILE mit der Eingabedatei mysqltest.sql mysqltest_oracle.sql. Nach dem Übersetzungsschritt lädt die Prozedur mysqltest_oracle.sql in Object Storage hoch.

    Verwenden Sie optional den Parameter target_uri, um den Speicherort anzugeben, in den die übersetzte Datei hochgeladen wird. Der Standardwert für diesen Parameter ist NULL. Das bedeutet, dass die übersetzte Datei an denselben Speicherort hochgeladen wird, wie im Parameter location_uri angegeben.

    Weitere Informationen finden Sie unter Prozedur MIGRATE_FILE.

  5. Prüfen Sie, ob die Ausgabedatei generiert wurde.
    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

    Wenn Sie alternativ Zugangsdaten anstelle des Resource Principals OCI$RESOURCE_PRINCIPAL erstellen, geben Sie den Zugangsdatennamen im Parameter credential_name an.

    Weitere Informationen finden Sie unter Funktion LIST_OBJECTS.

Führen Sie die folgende Abfrage aus, um den Inhalt der Datei mysqltest_oracle.sql anzuzeigen:

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;

Wenn Sie alternativ Zugangsdaten anstelle des Resource Principals OCI$RESOURCE_PRINCIPAL erstellen, geben Sie den Zugangsdatennamen im Parameter credential_name an.

Weitere Informationen finden Sie unter GET_OBJECT Prozedur und Funktion.

Einschränkungen bei Migration und Übersetzung von MySQL-Anweisungen in Oracle SQL

In diesem Abschnitt werden die Einschränkungen für die Migration von SQL-Anweisungen von MySQL zu Oracle SQL zusammengefasst.

Beachten Sie die folgenden Einschränkungen bei der Migration von MySQL-Datenbankaroma zu Oracle SQL:

  • Benutzerdefinierte globale Variablen: Benutzerdefinierte globale Variablen vom Typ MySQL, die im Format @var_name deklariert werden, werden bei der Übersetzung in Oracle SQL nicht unterstützt.

  • Bezeichner in Anführungszeichen: MySQL-Bezeichner, die mit Backticks (`) eingeschlossen sind, wie `var_name`, werden bei der Übersetzung in Oracle SQL nicht unterstützt. Es werden nur Bezeichner unterstützt, die keine Anführungszeichen enthalten oder in doppelte Anführungszeichen gesetzt sind.

  • Trennzeichen:
    • Für Funktionen und Prozeduren werden nur $$- und //-Trennzeichen unterstützt.

    • Für SQL-Anweisungen wird nur das Trennzeichen ; unterstützt.

Die folgende Liste von MySQL-Funktionen wird nicht unterstützt:
  • 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)