Pular para o conteúdo
Início do IntoSQL

Converta Oracle para MySQL

Solte o arquivo .sql que o Database Export do SQL Developer ou o SQLcl escreve, com suas tabelas e instruções Insert, e baixe um script do MySQL com as mesmas tabelas, chaves, índices e dados. Cada valor que o MySQL não aceita como está, e cada objeto que ele não traz, aparece no relatório.

Seu arquivo
sqlshop_2024_oracle.sqlArquivo de exemplo, 9,3 kB
Seu banco de dados

18 linhas convertidas, nenhuma correção, nenhuma rejeitada

Mostrar

Tabelas em shop_2024_oracle.sqlDump do Oracle · gerado por SQL Developer · utf-8

  • customers8 linhas
    7 colunas
    idbigint not null
    namevarchar(100) not null
    emailvarchar(150) not null
    countrychar(2) not null
    is_activesmallint not null
    signed_updatetime
    created_atdatetime not null
  • orders10 linhas
    9 colunas
    idbigint not null
    customer_idbigint not null
    invoicebigint
    statusvarchar(10) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime not null
    shipped_atdatetime
    notevarchar(255)
-- Written by IntoSQL from a Oracle dump. Load it with: mysql --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';

CREATE TABLE `customers` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `email` varchar(150) NOT NULL,
  `country` char(2) NOT NULL DEFAULT 'US',
  `is_active` smallint NOT NULL DEFAULT 1,
  `signed_up` datetime,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `customers_email_uk` (`email`),
  CONSTRAINT `check1` CHECK (`is_active` IN (0, 1))
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';

CREATE TABLE `orders` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `customer_id` bigint NOT NULL,
  `invoice` bigint,
  `status` varchar(10) NOT NULL DEFAULT 'pending',
  `total` decimal(10,2) NOT NULL,
  `items` int NOT NULL DEFAULT 1,
  `ordered_at` datetime NOT NULL,
  `shipped_at` datetime,
  `note` varchar(255),
  PRIMARY KEY (`id`),
  KEY `orders_status_date_ix` (`status`,`ordered_at`),
  CONSTRAINT `check1` CHECK (`status` IN ('pending', 'paid', 'shipped', 'cancelled')),
  CONSTRAINT `orders_customer_fk` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15 00:00:00','2023-01-15 10:24:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03 00:00:00','2023-02-03 08:11:42.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (3,'José Peña','jose@example.es','ES',0,'2023-03-21 00:00:00','2023-03-21 19:05:17.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (4,'李雷','lilei@example.cn','CN',1,'2023-05-09 00:00:00','2023-05-09 02:40:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (5,'Noah O\'Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02 00:00:00','2024-01-02 09:30:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29 00:00:00','2024-02-29 23:59:59.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12 00:00:00','2024-04-12 12:12:12.000000');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (1,1,1000,'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (2,2,1001,'paid',54,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (3,1,1002,'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (4,4,1003,'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (5,5,1004,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (6,6,1005,'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (7,8,1006,'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL);
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (8,2,1007,'paid',19.99,1,'2024-03-12 08:00:00',NULL,'Paid at the counter');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (9,3,1008,'shipped',64,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded');
INSERT INTO `orders` (`id`,`customer_id`,`invoice`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`) VALUES (10,7,1009,'paid',1499,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf');

SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;

Correções

Nada precisou de correção.

Para revisar

  • 1 sequência não foi criada; o MySQL não tem sequências. Guarde o próximo valor em uma tabela se a sua aplicação precisar.
  • O valor padrão de "invoice" em orders não pode ser escrito para o MySQL (a sequence), então a coluna fica sem valor padrão. Adicione o valor padrão manualmente se novas linhas precisarem dele.

Seu arquivo é convertido neste computador e nunca é enviado.

Outros exemplos:

O que muda do Oracle para o MySQL

Cada linha é uma regra que o conversor aplica, com a linha do relatório que ele escreve quando a regra muda algo nos seus dados.

  • BOOLEAN (23ai)

    tinyint(1)

    O MySQL não tem coluna booleana, então TRUE e FALSE são 1 e 0.

  • VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG

    varchar(n) até 1024 caracteres, tipos text acima disso

    Os tamanhos contam caracteres, quer o Oracle contasse bytes ou caracteres, então todo valor cabe.

  • NUMBER, NUMBER(p,s), FLOAT(b)

    decimal(p,s), ou bigint

    NUMBER mantém cada dígito; um NUMBER sem precisão cujos valores são todos números inteiros de até 18 dígitos vira um inteiro de 64 bits, e uma escala negativa comporta outros tantos dígitos antes do ponto.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    varchar(100) com o texto do Oracle, como +01-06

    O TIME do MySQL guarda durações de até 838 horas, e não tem anos nem meses; o texto mantém cada parte.

    Linha do relatório: type_replaced

  • DATE, TIMESTAMP(p)

    datetime(p)

    O DATE do Oracle guarda uma hora até o segundo, então é uma data e hora. Uma exportação em uma sessão americana ou alemã escreve as datas sem a hora nem o século (DD-MON-RR); exporte em uma sessão ISO (SYYYY-MM-DD HH24:MI:SS) para mantê-las.

  • TIMESTAMP(7) to TIMESTAMP(9)

    seis dígitos de segundo, o sétimo cortado

    O MySQL guarda microssegundos; o sétimo dígito (100 nanossegundos) é cortado, nunca arredondado, então nenhum valor passa para o segundo ou o dia seguinte.

    Linha do relatório: fraction_cut

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetime(p) em UTC

    O TIMESTAMP do MySQL só vai até 2038, então os instantes são guardados como datetime em UTC, o mesmo instante qualquer que seja o fuso que cada valor tinha.

    Linha do relatório: moments_as_utc

  • JSON (21c), and CLOB holding JSON

    json

    Os mesmos valores JSON; um NULL do SQL que a exportação escreveu como 'null' continua NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) e tipos blob

    Bytes continuam bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    text

    Os tipos próprios do Oracle não têm equivalente; seus valores mantêm o texto, incluindo os valores ROWID, embora fora do Oracle não signifiquem nada.

    Linha do relatório: type_replaced

  • collations that ignore case (BINARY_CI)

    comparação exata (utf8mb4_bin)

    As tabelas usam utf8mb4_bin para que as chaves únicas separem o que o Oracle separava; colunas que ignoravam maiúsculas perdem isso. As regras de acentos mudam entre versões, então nenhuma collation _ci corresponde à do Oracle em todas.

    Linha do relatório: case_insensitive_collation

  • identity columns, and a sequence a BEFORE INSERT trigger assigns

    AUTO_INCREMENT, continuando depois do maior id

    Os ids copiados carregam como estão, e o contador continua depois do maior deles. Uma coluna que um gatilho preenche a partir de uma sequência (o jeito de antes do 12c) também é de identidade.

  • identity columns the target can't count

    um inteiro simples

    O MySQL conta uma coluna por tabela, no início de uma chave; qualquer outra mantém seus valores sem contador.

    Linha do relatório: counter_dropped

  • CREATE SEQUENCE

    não criada

    A exportação escreve até onde uma sequência chegou como o seu START WITH, então ela continua dali.

    Linha do relatório: sequence_not_converted

  • virtual columns (GENERATED ALWAYS AS ... VIRTUAL)

    colunas geradas, STORED quando PERSISTED, VIRTUAL nos outros casos

    O MySQL as calcula com a mesma fórmula; os valores que a exportação escreveu para elas ficam de fora.

  • virtual columns with functions IntoSQL doesn't write, and the || operator

    uma coluna simples

    Uma fórmula que não pode ser escrita para o MySQL deixa uma coluna simples e uma linha no relatório; os valores que a exportação escreveu para colunas virtuais ficam de fora, e o MySQL não tem nenhum para calcular.

    Linha do relatório: generated_not_translated

  • defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)

    sem valor padrão

    Um valor padrão que não pode ser escrito fica de fora e é informado.

    Linha do relatório: default_not_translated

  • CHECK constraints

    traduzidos

    O MySQL 5.7 os mantém sem verificar; as outras versões os testam à medida que cada linha carrega.

  • CHECK constraints with functions IntoSQL doesn't write

    não criado

    Um CHECK que não pode ser escrito fica de fora e é informado.

    Linha do relatório: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    não criado

    O Oracle não aplica esses CHECKs às linhas que já existiam, então as linhas podem violá-los.

    Linha do relatório: check_not_enforced

  • function-based, bitmap and domain indexes

    não criado

    O IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga.

    Linha do relatório: index_skipped

  • foreign keys

    chaves estrangeiras, carregadas com FOREIGN_KEY_CHECKS=0

    As linhas carregam em qualquer ordem, e as chaves verificam as linhas novas depois.

  • foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones

    não criada

    Uma chave não pode apontar para uma tabela que não existe, e uma que o Oracle não verifica pode ter linhas sem pai.

    Linha do relatório: foreign_key_skipped

  • partitioned tables

    uma tabela com as linhas de todas as partições

    As linhas são as mesmas; particione a tabela de novo no MySQL se precisar.

    Linha do relatório: partitions_dropped

  • several schemas in one export

    um banco de dados, tabelas com o nome do schema na frente

    Os schemas do MySQL são bancos de dados, que uma exportação carregada em um único banco não pode criar; uma exportação de um só schema mantém os nomes das suas tabelas.

    Linha do relatório: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL removido

    Uma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.

    Linha do relatório: not_null_relaxed

  • views, synonyms, types, packages, procedures, functions and other triggers

    listados no relatório

    O código deles é escrito em PL/SQL, então eles são listados para você recriá-los.

    Linha do relatório: not_converted_objects

  • exports without CREATE TABLE (data only)

    tipos lidos dos valores

    Uma exportação só de dados tem apenas linhas, então os tipos vêm dos valores.

    Linha do relatório: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Um conversor que não executa um banco de dados não consegue avaliá-las; to_date, to_timestamp, TO_CLOB, HEXTORAW e as outras que as exportações escrevem são lidas.

    Linha do relatório: expression_value

  • types IntoSQL doesn't know, and object types

    longtext

    O texto aceita qualquer valor; mude o tipo depois da carga.

    Linha do relatório: unknown_type

  • dates before year 1 and time zones given as region names

    NULL

    O MySQL guarda os anos de 1000 a 9999, e o Oracle vai até o ano 1. Esses valores viram NULL e o relatório os conta.

    Linha do relatório: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Os tipos de ponto flutuante do MySQL não têm NaN nem infinito, então esses valores viram NULL e o relatório os conta.

    Linha do relatório: invalid_value_null

  • NUL characters in text

    mantido

    O valor é copiado com o caractere NUL escapado.

  • text that isn't valid in its encoding

    os bytes inválidos como o caractere de substituição

    O script é UTF-8 e todo valor precisa ser texto válido.

    Linha do relatório: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiado como está

    O script contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.

    Linha do relatório: mojibake_suspected

No OracleNo MySQLLinha do relatório
BOOLEAN (23ai)tinyint(1)O MySQL não tem coluna booleana, então TRUE e FALSE são 1 e 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGvarchar(n) até 1024 caracteres, tipos text acima dissoOs tamanhos contam caracteres, quer o Oracle contasse bytes ou caracteres, então todo valor cabe.
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s), ou bigintNUMBER mantém cada dígito; um NUMBER sem precisão cujos valores são todos números inteiros de até 18 dígitos vira um inteiro de 64 bits, e uma escala negativa comporta outros tantos dígitos antes do ponto.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDvarchar(100) com o texto do Oracle, como +01-06O TIME do MySQL guarda durações de até 838 horas, e não tem anos nem meses; o texto mantém cada parte.type_replaced
DATE, TIMESTAMP(p)datetime(p)O DATE do Oracle guarda uma hora até o segundo, então é uma data e hora. Uma exportação em uma sessão americana ou alemã escreve as datas sem a hora nem o século (DD-MON-RR); exporte em uma sessão ISO (SYYYY-MM-DD HH24:MI:SS) para mantê-las.
TIMESTAMP(7) to TIMESTAMP(9)seis dígitos de segundo, o sétimo cortadoO MySQL guarda microssegundos; o sétimo dígito (100 nanossegundos) é cortado, nunca arredondado, então nenhum valor passa para o segundo ou o dia seguinte.fraction_cut
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetime(p) em UTCO TIMESTAMP do MySQL só vai até 2038, então os instantes são guardados como datetime em UTC, o mesmo instante qualquer que seja o fuso que cada valor tinha.moments_as_utc
JSON (21c), and CLOB holding JSONjsonOs mesmos valores JSON; um NULL do SQL que a exportação escreveu como 'null' continua NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) e tipos blobBytes continuam bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYtextOs tipos próprios do Oracle não têm equivalente; seus valores mantêm o texto, incluindo os valores ROWID, embora fora do Oracle não signifiquem nada.type_replaced
collations that ignore case (BINARY_CI)comparação exata (utf8mb4_bin)As tabelas usam utf8mb4_bin para que as chaves únicas separem o que o Oracle separava; colunas que ignoravam maiúsculas perdem isso. As regras de acentos mudam entre versões, então nenhuma collation _ci corresponde à do Oracle em todas.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsAUTO_INCREMENT, continuando depois do maior idOs ids copiados carregam como estão, e o contador continua depois do maior deles. Uma coluna que um gatilho preenche a partir de uma sequência (o jeito de antes do 12c) também é de identidade.
identity columns the target can't countum inteiro simplesO MySQL conta uma coluna por tabela, no início de uma chave; qualquer outra mantém seus valores sem contador.counter_dropped
CREATE SEQUENCEnão criadaA exportação escreve até onde uma sequência chegou como o seu START WITH, então ela continua dali.sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)colunas geradas, STORED quando PERSISTED, VIRTUAL nos outros casosO MySQL as calcula com a mesma fórmula; os valores que a exportação escreveu para elas ficam de fora.
virtual columns with functions IntoSQL doesn't write, and the || operatoruma coluna simplesUma fórmula que não pode ser escrita para o MySQL deixa uma coluna simples e uma linha no relatório; os valores que a exportação escreveu para colunas virtuais ficam de fora, e o MySQL não tem nenhum para calcular.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)sem valor padrãoUm valor padrão que não pode ser escrito fica de fora e é informado.default_not_translated
CHECK constraintstraduzidosO MySQL 5.7 os mantém sem verificar; as outras versões os testam à medida que cada linha carrega.
CHECK constraints with functions IntoSQL doesn't writenão criadoUm CHECK que não pode ser escrito fica de fora e é informado.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnão criadoO Oracle não aplica esses CHECKs às linhas que já existiam, então as linhas podem violá-los.check_not_enforced
function-based, bitmap and domain indexesnão criadoO IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga.index_skipped
foreign keyschaves estrangeiras, carregadas com FOREIGN_KEY_CHECKS=0As linhas carregam em qualquer ordem, e as chaves verificam as linhas novas depois.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnão criadaUma chave não pode apontar para uma tabela que não existe, e uma que o Oracle não verifica pode ter linhas sem pai.foreign_key_skipped
partitioned tablesuma tabela com as linhas de todas as partiçõesAs linhas são as mesmas; particione a tabela de novo no MySQL se precisar.partitions_dropped
several schemas in one exportum banco de dados, tabelas com o nome do schema na frenteOs schemas do MySQL são bancos de dados, que uma exportação carregada em um único banco não pode criar; uma exportação de um só schema mantém os nomes das suas tabelas.schemas_merged
NOT NULL columns with values that become NULLNOT NULL removidoUma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerslistados no relatórioO código deles é escrito em PL/SQL, então eles são listados para você recriá-los.not_converted_objects
exports without CREATE TABLE (data only)tipos lidos dos valoresUma exportação só de dados tem apenas linhas, então os tipos vêm dos valores.no_schema
expressions in INSERT values other than the ones exports writeNULLUm conversor que não executa um banco de dados não consegue avaliá-las; to_date, to_timestamp, TO_CLOB, HEXTORAW e as outras que as exportações escrevem são lidas.expression_value
types IntoSQL doesn't know, and object typeslongtextO texto aceita qualquer valor; mude o tipo depois da carga.unknown_type
dates before year 1 and time zones given as region namesNULLO MySQL guarda os anos de 1000 a 9999, e o Oracle vai até o ano 1. Esses valores viram NULL e o relatório os conta.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLOs tipos de ponto flutuante do MySQL não têm NaN nem infinito, então esses valores viram NULL e o relatório os conta.invalid_value_null
NUL characters in textmantidoO valor é copiado com o caractere NUL escapado.
text that isn't valid in its encodingos bytes inválidos como o caractere de substituiçãoO script é UTF-8 e todo valor precisa ser texto válido.invalid_utf8_replaced
text decoded twice (ñ)copiado como estáO script contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.mojibake_suspected

Carregue o script no MySQL

O script cria as tabelas, copia as linhas e depois adiciona chaves, índices e chaves estrangeiras, então carrega rápido e para no primeiro erro.

mysql --default-character-set=utf8mb4 mydb < oracle.mysql.sql

As chaves estrangeiras são criadas como o dump as declara, com FOREIGN_KEY_CHECKS=0 enquanto as linhas carregam, então uma linha que aponta para uma linha que não existe não para a carga.

Para um dump grande, execute o cliente na mesma máquina do servidor e aumente max_allowed_packet se uma única linha for muito grande.

O IntoSQL Pro carrega o arquivo direto no MySQL pelo app para desktop ou pela linha de comando, sem escrever um script.

Gere o dump do Oracle para o melhor resultado

O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:

  • No SQL Developer, escolha Tools, Database Export, com DDL e o formato de dados Insert. O SQLcl escreve o mesmo com SET SQLFORMAT INSERT.
  • Rode ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' antes de exportar: o formato padrão escreve as datas sem a hora nem o século.
  • Um arquivo .dmp do exp ou do expdp é binário: importe-o em um banco de dados Oracle, como o Oracle Database Free no Docker, e exporte-o com o SQL Developer.

O que não é convertido

Visões, pacotes, procedimentos, funções, gatilhos, tipos e sinônimos são escritos em PL/SQL. Eles aparecem no relatório pelo nome, nunca são descartados em silêncio, para que você possa reescrevê-los para o MySQL.

Perguntas sobre Oracle para MySQL

Não encontrou a resposta? Escreva para nós pela página de contato e uma pessoa responde. Página de contato

Meu dump é enviado?

Não. O conversor roda no seu navegador e lê o dump do seu disco em partes, então ele nunca sai do seu computador. O app para desktop e a linha de comando também convertem no seu computador.

Qual o tamanho máximo do dump?

O conversor nunca guarda o dump inteiro na memória: ele lê o arquivo duas vezes, por intervalos, e escreve o script à medida que avança. Dumps de vários gigabytes são convertidos no navegador, no app para desktop e com a linha de comando.

Posso converter um arquivo .dmp do exp ou do expdp?

Não diretamente: o Data Pump e o Export original escrevem um formato binário que só o Oracle lê. Importe-o em qualquer banco de dados Oracle, o Oracle Database Free roda no Docker, e exporte-o com o Database Export do SQL Developer ou com o SQLcl. O conversor avisa quando recebe um arquivo .dmp.

De quais versões do Oracle a exportação pode vir?

Exportações do SQL Developer e do SQLcl, com as definições de tabela do DBMS_METADATA, a partir do Oracle 11g. Cada exportação de teste vem do Oracle 21c e 23ai, em sessões americanas, alemãs e ISO, e é comparada com a origem célula por célula.

O que acontece com NUMBER, DATE e os outros tipos do Oracle?

NUMBER vira decimal, ou bigint para números inteiros, e texto acima de 65 dígitos; DATE vira datetime, mantendo a hora; CLOB longtext, BLOB blob, e os intervalos mantêm o texto do Oracle. NaN e Infinity viram NULL e o relatório os conta.

As colunas de identidade e as sequências são mantidas?

As colunas de identidade viram AUTO_INCREMENT e continuam depois do maior id. O MySQL não tem sequências, então elas aparecem no relatório, assim como os valores padrão que as usam.

E os pacotes, procedimentos e gatilhos em PL/SQL?

Eles aparecem no relatório pelo nome e não são convertidos, porque cada banco de dados os escreve na sua própria linguagem.

Em quais versões do MySQL o script carrega?

MySQL 5.7 e posteriores. Cada exportação de teste carrega no 5.7 e no 9 e para no primeiro erro se algo der errado.