Migrar Aplicativos de Bancos de Dados MySQL para o Autonomous Database

Você pode migrar instruções SQL de MySQL para o Oracle SQL e executar as instruções no Autonomous Database.

Traduzir Instruções MySQL para Oracle SQL

Você pode traduzir instruções SQL gravadas em MySQL para o Oracle SQL e executar as instruções traduzidas no Autonomous Database.

Use DBMS_CLOUD_MIGRATION.MIGRATE_SQL para traduzir uma instrução MySQL para o Oracle SQL. Há variantes de procedimento e função de DBMS_CLOUD_MIGRATION.MIGRATE_SQL.

Migrar a Instrução MySQL para o Oracle SQL com o Procedimento MIGRATE_SQL

O exemplo a seguir aceita a instrução SQL gravada em MySQL como entrada, traduz a instrução para o Oracle SQL, designa a instrução SQL traduzida para output_sql_result e imprime o 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));

O parâmetro original_sql especifica a instrução MySQL.

O parâmetro output_sql armazena o SQL traduzido.

O parâmetro source_db especifica MySQL como o nome do banco de dados.

Consulte MIGRATE_SQL Procedimento e Função para obter mais informações.

Migrar a Instrução MySQL para o Oracle SQL com a Função MIGRATE_SQL

O exemplo a seguir mostra a função DBMS_CLOUD_MIGRATION.MIGRATE_SQL em uma instrução SELECT. A entrada da função é uma instrução MySQL e a função retorna a instrução traduzida no 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 Procedimento e Função para obter mais informações.

Observações para executar DBMS_CLOUD_MIGRATION.MIGRATE_SQL:

  • Você poderá encontrar um erro durante a conversão se a instrução SQL de entrada não for suportada no Oracle SQL. Consulte Limitações para Migração e Tradução de Instruções MySQL para o Oracle SQL para obter mais informações.

  • Os subprogramas DBMS_CLOUD_MIGRATION.MIGRATE_SQL aceitam apenas uma instrução SQL como entrada. Portanto, somente uma instrução SQL pode ser traduzida por chamada.

Executar Instruções MySQL no Autonomous Database

Você pode traduzir e executar interativamente instruções MySQL no seu Autonomous Database.

Use o procedimento ENABLE_TRANSLATION para ativar a tradução em tempo real de instruções SQL gravadas em MySQL. Depois de ativar a tradução em uma sessão, as instruções MySQL são traduzidas automaticamente e executadas como instruções Oracle SQL, e você pode ver os resultados.

Por exemplo, depois de ativar a tradução executando ENABLE_TRANSLATION, você poderá fazer interativamente o seguinte em uma sessão:
  • Crie as tabelas. Por exemplo, crie as tabelas MOVIE e INVENTORY.

  • inserir dados em tabelas.

  • Tabelas de consulta.

  • Executar operações JOIN em tabelas. Por exemplo, é possível fazer uma junção externa esquerda em tabelas.

Para ativar a tradução com MySQL e executar comandos:

  1. Conecte-se ao seu Autonomous Database usando um cliente SQL.

    Consulte Estabelecer Conexão com o Autonomous Database para obter mais informações.

    Observação

    DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION não é suportado no Database Actions e não é suportado com o Oracle APEX Service.
  2. Execute DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION para ativar a conversão de SQL em tempo real em sua sessão. Use o parâmetro MYSQL para traduzir de MySQL.
    BEGIN
     DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION('MYSQL');
    END;
    /

    Use a consulta a seguir para verificar a linguagem de tradução SQL da sua sessão:

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

    Consulte Procedimento ENABLE_TRANSLATION para obter mais informações.

  3. Informe instruções MySQL. Por exemplo:
    CREATE TABLE movie (film_id int, title varchar(255));
    
    Table MOVIE created.

    Isso traduz e executa automaticamente a instrução MySQL CREATE TABLE.

    Você pode verificar usando o comando DESC. Por exemplo:
    DESC movie;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    TITLE                 VARCHAR2(255)
    A tabela MOVIE é criada e os tipos de dados de cada coluna são convertidos automaticamente em tipos de dados Oracle.

    Você poderá encontrar um erro durante a conversão se a instrução SQL de entrada não for suportada. Consulte Limitações para Migração e Tradução de Instruções MySQL para o Oracle SQL para obter mais informações.

  4. Insira dados na tabela MOVIE. Por exemplo:
    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 a inserção de dados consultando a tabela MOVIE. Por exemplo:

    SELECT * FROM movie;
    
    FILM_ID  TITLE
    –------- –--------
    123	 Tangled
    234	 Frozen
    
  5. Crie uma tabela INVENTORY:
    CREATE TABLE inventory (film_id int, inventory_id int);
    
    Table INVENTORY created.
    Você pode verificar essa etapa com o comando DESC. Por exemplo:
    DESC inventory;
    
    Name        Null?     Type          
    -------     -----     ------------- 
    FILM_ID               NUMBER(38)    
    INVENTORY_ID          NUMBER(38)
    A tabela INVENTORY é criada e os tipos de dados de cada coluna são convertidos automaticamente em tipos de dados Oracle.
  6. Insira dados na tabela INVENTORY. Por exemplo:
    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 a inserção de dados consultando INVENTORY. Por exemplo:

    SELECT * FROM inventory;
    
    FILM_ID  INVENTORY_ID
    –------- –------------
    123	 223
    234	 334
  7. Execute uma junção externa esquerda nas tabelas MOVIE e 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
    

    Este exemplo executa um LEFT OUTER JOIN nas tabelas movie e inventory. A palavra-chave AS para aliases de tabela na cláusula FROM não é suportada no Oracle SQL. A consulta é primeiro traduzida para o Oracle SQL e, em seguida, executada na sua sessão.

  8. Use o procedimento DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION para desativar a tradução de linguagem SQL em tempo real para sua sessão.
    BEGIN
     DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION;
    END;
    /

    Isso retornará um erro se a tradução do idioma SQL não estiver ativada para sua sessão.

    Consulte DISABLE_TRANSLATION Procedimento

Você pode consultar a view V$MAPPED_SQL para listar as instruções MySQL traduzidas e mapeadas na memória para instruções SQL do Oracle.

Por exemplo:

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 obter mais informações.

Migrar Arquivos MySQL para o Oracle SQL

Você pode migrar um arquivo contendo instruções MySQL para um arquivo contendo instruções Oracle SQL.

O procedimento DBMS_CLOUD_MIGRATION.MIGRATE_FILE traduz instruções SQL em um arquivo MySQL no Object Storage e gera um novo arquivo contendo o Oracle SQL.

Como pré-requisito, faça upload de um ou mais arquivos MySQL com uma extensão .sql para um local no Object Storage. Os exemplos a seguir usam o arquivo mysqltest.sql submetido a upload para o Object Storage. Consulte Colocar dados no armazenamento de objetos para obter mais informações.

Para migrar arquivos MySQL para o Oracle SQL:

  1. Conecte-se à sua instância do Autonomous Database.

    Consulte Estabelecer Conexão com o Autonomous Database para obter mais informações.

  2. Configure o acesso ao Cloud Object Storage usando um controlador de recursos ou criando um objeto de credencial.

    Esta etapa fornece acesso ao Cloud Object Storage no qual você coloca os arquivos que está migrando:

  3. Opcionalmente, você pode listar os arquivos no Object Storage. Por exemplo:
    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, se você criar uma credencial em vez do controlador de recursos, OCI$RESOURCE_PRINCIPAL, especifique o nome da credencial no parâmetro credential_name.

    Consulte Função LIST_OBJECTS para obter mais informações.

  4. Execute DBMS_CLOUD_MIGRATION.MIGRATE_FILE para migrar o arquivo MySQL para o 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;
    /

    O parâmetro credential_name especifica a credencial para acessar o URI do Cloud Object Storage. O usuário que executa DBMS_CLOUD_MIGRATION.MIGRATE_FILE deve ter o privilégio EXECUTE para o objeto de credencial usado para acessar o URI do Object Storage. Ou seja, a credencial especificada com o parâmetro credential_name. Se você usar uma credencial em vez de um controlador de recursos, especifique o nome da credencial no parâmetro credential_name.

    O parâmetro location_uri especifica o URI do arquivo de origem. O formato do URI depende do serviço Cloud Object Storage que você está usando. Consulte DBMS_CLOUD Formatos de URI para obter mais informações.

    O parâmetro source_db especifica MySQL como idioma do banco de dados. Use o valor MYSQL para traduzir arquivos MySQL para o Oracle SQL.

    A execução desse comando traduz o arquivo MySQL mysqltest.sql para o Oracle SQL e gera um novo arquivo com o nome original_filename_oracle.sql.

    Para este exemplo, a execução de DBMS_CLOUD_MIGRATION.MIGRATE_FILE com o arquivo de entrada mysqltest.sql gera mysqltest_oracle.sql. Após a etapa de tradução, o procedimento faz upload de mysqltest_oracle.sql para o Object Storage.

    Opcionalmente, use o parâmetro target_uri para especificar o local em que o upload do arquivo traduzido é feito. O valor padrão desse parâmetro é NULL, o que significa que o upload do arquivo traduzido é feito na mesma localização especificada no parâmetro location_uri.

    Consulte Procedimento MIGRATE_FILE para obter mais informações.

  5. Verifique se o arquivo de saída foi gerado.
    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, se você criar uma credencial em vez do controlador de recursos, OCI$RESOURCE_PRINCIPAL, especifique o nome da credencial no parâmetro credential_name.

    Consulte Função LIST_OBJECTS para obter mais informações.

Execute a consulta a seguir para exibir o conteúdo do arquivo 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, se você criar uma credencial em vez do controlador de recursos, OCI$RESOURCE_PRINCIPAL, especifique o nome da credencial no parâmetro credential_name.

Consulte GET_OBJECT Procedimento e Função para obter mais informações.

Limitações para Migração e Tradução de Instruções MySQL para Oracle SQL

Esta seção resume as limitações para migrar instruções SQL de MySQL para o Oracle SQL.

Observe as seguintes restrições ao migrar do sabor do banco de dados MySQL para o Oracle SQL:

  • Variáveis Globais Definidas pelo Usuário: MySQL variáveis globais definidas pelo usuário declaradas usando o formato @var_name não são suportadas durante a conversão para o Oracle SQL.

  • Identificadores com aspas: os identificadores MySQL que estão entre os backticks (`), como `var_name`, não são suportados durante a tradução para o Oracle SQL. Só há suporte para identificadores sem aspas ou entre aspas duplas.

  • Delimitadores:
    • Para funções e procedimentos, somente os delimitadores $$ e // são suportados.

    • Para instruções SQL, somente o delimitador ; é suportado.

A seguinte lista de funções MySQL não é suportada:
  • 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)