Перейти к содержимому
Главная страница IntoSQL

Конвертация Oracle в MySQL

Перетащите файл .sql, который записывает Database Export в SQL Developer или SQLcl, с таблицами и командами Insert, и скачайте скрипт MySQL с теми же таблицами, ключами, индексами и данными. Каждое значение, которое MySQL не может хранить как есть, и каждый объект, который он не переносит, указаны в отчете.

Ваш файл
sqlshop_2024_oracle.sqlПример файла, 9,3 кБ
Ваша база данных

18 строк конвертировано, без исправлений, ни одна не отклонена

Показать

Таблицы в shop_2024_oracle.sqlДамп Oracle · создан программой SQL Developer · utf-8

  • customers8 строк
    7 столбцов
    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 строк
    9 столбцов
    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;

Исправления

Исправлять ничего не пришлось.

Требует проверки

  • Не создано последовательностей: 1; в MySQL их нет. Храните следующее значение в таблице, если оно нужно вашему приложению.
  • Значение по умолчанию столбца "invoice" таблицы orders нельзя записать для MySQL (a sequence), поэтому у столбца его нет. Добавьте значение по умолчанию вручную, если оно нужно новым строкам.

Файл конвертируется на этом компьютере и никуда не загружается.

Другие примеры:

Что меняется при переходе с Oracle на MySQL

Каждая строка - это правило, которое применяет конвертер, и строка отчета, которую он пишет, когда правило что-то меняет в ваших данных.

  • BOOLEAN (23ai)

    tinyint(1)

    В MySQL нет логического столбца, поэтому TRUE и FALSE становятся 1 и 0.

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

    varchar(n) до 1024 символов, дальше типы text

    Длины считаются в символах, считал ли Oracle байты или символы, поэтому каждое значение помещается.

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

    decimal(p,s) или bigint

    NUMBER сохраняет каждую цифру; NUMBER без точности, все значения которого - целые числа до 18 цифр, становится 64-битным целым, а отрицательный масштаб хранит столько же цифр до запятой.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    varchar(100) с текстом Oracle, например +01-06

    TIME в MySQL вмещает длительности до 838 часов и не содержит лет и месяцев; текст сохраняет каждую часть.

    Строка отчета: type_replaced

  • DATE, TIMESTAMP(p)

    datetime(p)

    DATE в Oracle хранит время с точностью до секунды, поэтому это дата и время. Экспорт в американском или немецком сеансе записывает даты без времени и века (DD-MON-RR); экспортируйте в сеансе ISO (SYYYY-MM-DD HH24:MI:SS), чтобы их сохранить.

  • TIMESTAMP(7) to TIMESTAMP(9)

    шесть цифр долей секунды, седьмая отбрасывается

    MySQL хранит микросекунды; седьмая цифра (100 наносекунд) отбрасывается, а не округляется, поэтому ни одно значение не переходит на следующую секунду или день.

    Строка отчета: fraction_cut

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetime(p) в UTC

    TIMESTAMP в MySQL доходит только до 2038 года, поэтому моменты хранятся как datetime в UTC: тот же момент, какое бы смещение ни было у значения.

    Строка отчета: moments_as_utc

  • JSON (21c), and CLOB holding JSON

    json

    Те же значения JSON; SQL NULL, который экспорт записал как 'null', остается NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) и типы blob

    Байты остаются байтами.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    text

    У собственных типов Oracle нет аналогов; их значения сохраняют свой текст, включая значения ROWID, хотя вне Oracle они ничего не значат.

    Строка отчета: type_replaced

  • collations that ignore case (BINARY_CI)

    точное сравнение (utf8mb4_bin)

    Таблицы используют utf8mb4_bin, поэтому уникальные ключи различают то, что различал Oracle; столбцы, которые не учитывали регистр, это теряют. Правила для диакритики отличаются в разных версиях, поэтому ни одна сортировка _ci не совпадает с Oracle во всех из них.

    Строка отчета: case_insensitive_collation

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

    AUTO_INCREMENT, продолжается после наибольшего id

    Скопированные id загружаются как есть, а счетчик продолжается после наибольшего. Столбец, который триггер заполняет из последовательности (способ до 12c), тоже становится столбцом identity.

  • identity columns the target can't count

    обычное целое

    MySQL нумерует один столбец на таблицу, в начале ключа; любой другой сохраняет значения без счетчика.

    Строка отчета: counter_dropped

  • CREATE SEQUENCE

    не создается

    Экспорт записывает, до какого значения дошла последовательность, как ее START WITH, поэтому она продолжается оттуда.

    Строка отчета: sequence_not_converted

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

    генерируемые столбцы, STORED при PERSISTED, иначе VIRTUAL

    MySQL вычисляет их по той же формуле; значения, которые экспорт для них записал, опускаются.

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

    обычный столбец

    Формула, которую нельзя записать для MySQL, оставляет обычный столбец и строку в отчете; значения, которые экспорт записал для виртуальных столбцов, опускаются, и MySQL не может их вычислить.

    Строка отчета: generated_not_translated

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

    без значения по умолчанию

    Значение по умолчанию, которое нельзя записать, опускается и попадает в отчет.

    Строка отчета: default_not_translated

  • CHECK constraints

    переводится

    MySQL 5.7 хранит их без проверки; остальные применяют их при загрузке каждой строки.

  • CHECK constraints with functions IntoSQL doesn't write

    не создается

    Проверка, которую нельзя записать, опускается и попадает в отчет.

    Строка отчета: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    не создается

    Oracle не применяет эти проверки к уже существующим строкам, поэтому строки могут их нарушать.

    Строка отчета: check_not_enforced

  • function-based, bitmap and domain indexes

    не создается

    IntoSQL создает индексы b-tree по целым столбцам; остальные создайте заново после загрузки.

    Строка отчета: index_skipped

  • foreign keys

    внешние ключи, загрузка с FOREIGN_KEY_CHECKS=0

    Строки загружаются в любом порядке, а ключи затем проверяют новые строки.

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

    не создается

    Ключ не может ссылаться на таблицу, которой нет, а у ключа, который Oracle не проверяет, могут быть строки без родителя.

    Строка отчета: foreign_key_skipped

  • partitioned tables

    одна таблица со строками всех секций

    Строки те же; при необходимости секционируйте таблицу заново в MySQL.

    Строка отчета: partitions_dropped

  • several schemas in one export

    одна база данных, имя таблицы начинается с имени ее схемы

    Схемы в MySQL - это базы данных, а экспорт, загружаемый в одну базу, не может их создать; экспорт одной схемы сохраняет имена своих таблиц.

    Строка отчета: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL снимается

    Столбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.

    Строка отчета: not_null_relaxed

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

    перечисляются в отчете

    Их код написан на PL/SQL, поэтому они перечислены, чтобы вы создали их заново.

    Строка отчета: not_converted_objects

  • exports without CREATE TABLE (data only)

    типы определяются по значениям

    Экспорт только с данными содержит лишь строки, поэтому типы берутся из значений.

    Строка отчета: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Конвертер, который не запускает базу данных, не может их вычислить; to_date, to_timestamp, TO_CLOB, HEXTORAW и другие функции, которые пишут экспорты, читаются.

    Строка отчета: expression_value

  • types IntoSQL doesn't know, and object types

    longtext

    Тип text вмещает любое значение; измените тип после загрузки.

    Строка отчета: unknown_type

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

    NULL

    MySQL хранит годы с 1000 по 9999, а Oracle начинается с 1 года. Такие значения становятся NULL, а отчет их подсчитывает.

    Строка отчета: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Типы с плавающей точкой в MySQL не поддерживают NaN и бесконечность, поэтому такие значения становятся NULL, а отчет их подсчитывает.

    Строка отчета: invalid_value_null

  • NUL characters in text

    сохраняется

    Значение копируется, а символ NUL в нем экранируется.

  • text that isn't valid in its encoding

    неверные байты заменяются символом замены

    Скрипт в UTF-8, и каждое значение должно быть корректным текстом.

    Строка отчета: invalid_utf8_replaced

  • text decoded twice (ñ)

    копируется как есть

    Скрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает.

    Строка отчета: mojibake_suspected

В OracleВ MySQLСтрока отчета
BOOLEAN (23ai)tinyint(1)В MySQL нет логического столбца, поэтому TRUE и FALSE становятся 1 и 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGvarchar(n) до 1024 символов, дальше типы textДлины считаются в символах, считал ли Oracle байты или символы, поэтому каждое значение помещается.
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s) или bigintNUMBER сохраняет каждую цифру; NUMBER без точности, все значения которого - целые числа до 18 цифр, становится 64-битным целым, а отрицательный масштаб хранит столько же цифр до запятой.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDvarchar(100) с текстом Oracle, например +01-06TIME в MySQL вмещает длительности до 838 часов и не содержит лет и месяцев; текст сохраняет каждую часть.type_replaced
DATE, TIMESTAMP(p)datetime(p)DATE в Oracle хранит время с точностью до секунды, поэтому это дата и время. Экспорт в американском или немецком сеансе записывает даты без времени и века (DD-MON-RR); экспортируйте в сеансе ISO (SYYYY-MM-DD HH24:MI:SS), чтобы их сохранить.
TIMESTAMP(7) to TIMESTAMP(9)шесть цифр долей секунды, седьмая отбрасываетсяMySQL хранит микросекунды; седьмая цифра (100 наносекунд) отбрасывается, а не округляется, поэтому ни одно значение не переходит на следующую секунду или день.fraction_cut
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetime(p) в UTCTIMESTAMP в MySQL доходит только до 2038 года, поэтому моменты хранятся как datetime в UTC: тот же момент, какое бы смещение ни было у значения.moments_as_utc
JSON (21c), and CLOB holding JSONjsonТе же значения JSON; SQL NULL, который экспорт записал как 'null', остается NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) и типы blobБайты остаются байтами.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYtextУ собственных типов Oracle нет аналогов; их значения сохраняют свой текст, включая значения ROWID, хотя вне Oracle они ничего не значат.type_replaced
collations that ignore case (BINARY_CI)точное сравнение (utf8mb4_bin)Таблицы используют utf8mb4_bin, поэтому уникальные ключи различают то, что различал Oracle; столбцы, которые не учитывали регистр, это теряют. Правила для диакритики отличаются в разных версиях, поэтому ни одна сортировка _ci не совпадает с Oracle во всех из них.case_insensitive_collation
identity columns, and a sequence a BEFORE INSERT trigger assignsAUTO_INCREMENT, продолжается после наибольшего idСкопированные id загружаются как есть, а счетчик продолжается после наибольшего. Столбец, который триггер заполняет из последовательности (способ до 12c), тоже становится столбцом identity.
identity columns the target can't countобычное целоеMySQL нумерует один столбец на таблицу, в начале ключа; любой другой сохраняет значения без счетчика.counter_dropped
CREATE SEQUENCEне создаетсяЭкспорт записывает, до какого значения дошла последовательность, как ее START WITH, поэтому она продолжается оттуда.sequence_not_converted
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)генерируемые столбцы, STORED при PERSISTED, иначе VIRTUALMySQL вычисляет их по той же формуле; значения, которые экспорт для них записал, опускаются.
virtual columns with functions IntoSQL doesn't write, and the || operatorобычный столбецФормула, которую нельзя записать для MySQL, оставляет обычный столбец и строку в отчете; значения, которые экспорт записал для виртуальных столбцов, опускаются, и MySQL не может их вычислить.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)без значения по умолчаниюЗначение по умолчанию, которое нельзя записать, опускается и попадает в отчет.default_not_translated
CHECK constraintsпереводитсяMySQL 5.7 хранит их без проверки; остальные применяют их при загрузке каждой строки.
CHECK constraints with functions IntoSQL doesn't writeне создаетсяПроверка, которую нельзя записать, опускается и попадает в отчет.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEне создаетсяOracle не применяет эти проверки к уже существующим строкам, поэтому строки могут их нарушать.check_not_enforced
function-based, bitmap and domain indexesне создаетсяIntoSQL создает индексы b-tree по целым столбцам; остальные создайте заново после загрузки.index_skipped
foreign keysвнешние ключи, загрузка с FOREIGN_KEY_CHECKS=0Строки загружаются в любом порядке, а ключи затем проверяют новые строки.
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesне создаетсяКлюч не может ссылаться на таблицу, которой нет, а у ключа, который Oracle не проверяет, могут быть строки без родителя.foreign_key_skipped
partitioned tablesодна таблица со строками всех секцийСтроки те же; при необходимости секционируйте таблицу заново в MySQL.partitions_dropped
several schemas in one exportодна база данных, имя таблицы начинается с имени ее схемыСхемы в MySQL - это базы данных, а экспорт, загружаемый в одну базу, не может их создать; экспорт одной схемы сохраняет имена своих таблиц.schemas_merged
NOT NULL columns with values that become NULLNOT NULL снимаетсяСтолбец, значения которого пришлось заменить на NULL, не может сохранить NOT NULL, иначе загрузка остановится.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersперечисляются в отчетеИх код написан на PL/SQL, поэтому они перечислены, чтобы вы создали их заново.not_converted_objects
exports without CREATE TABLE (data only)типы определяются по значениямЭкспорт только с данными содержит лишь строки, поэтому типы берутся из значений.no_schema
expressions in INSERT values other than the ones exports writeNULLКонвертер, который не запускает базу данных, не может их вычислить; to_date, to_timestamp, TO_CLOB, HEXTORAW и другие функции, которые пишут экспорты, читаются.expression_value
types IntoSQL doesn't know, and object typeslongtextТип text вмещает любое значение; измените тип после загрузки.unknown_type
dates before year 1 and time zones given as region namesNULLMySQL хранит годы с 1000 по 9999, а Oracle начинается с 1 года. Такие значения становятся NULL, а отчет их подсчитывает.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLТипы с плавающей точкой в MySQL не поддерживают NaN и бесконечность, поэтому такие значения становятся NULL, а отчет их подсчитывает.invalid_value_null
NUL characters in textсохраняетсяЗначение копируется, а символ NUL в нем экранируется.
text that isn't valid in its encodingневерные байты заменяются символом заменыСкрипт в UTF-8, и каждое значение должно быть корректным текстом.invalid_utf8_replaced
text decoded twice (ñ)копируется как естьСкрипт содержит именно эти символы, поэтому они копируются; отчет на них указывает.mojibake_suspected

Загрузите скрипт в MySQL

Скрипт создает таблицы, копирует строки, затем добавляет ключи, индексы и внешние ключи, поэтому загрузка идет быстро и останавливается на первой ошибке.

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

Внешние ключи создаются так, как их объявляет дамп, с FOREIGN_KEY_CHECKS=0 на время загрузки строк, поэтому строка, которая ссылается на отсутствующую строку, не останавливает загрузку.

Для большого дампа запускайте клиент на той же машине, где работает сервер, и увеличьте max_allowed_packet, если отдельная строка очень большая.

IntoSQL Pro загружает файл прямо в MySQL из приложения для компьютера или командной строки, без написания скрипта.

Как создать дамп Oracle для лучшего результата

Конвертер читает то, что есть в дампе. Эти параметры сохраняют в нем больше ваших данных:

  • В SQL Developer выберите Tools, Database Export, с DDL и форматом данных Insert. SQLcl записывает то же самое с SET SQLFORMAT INSERT.
  • Выполните ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' перед экспортом: формат по умолчанию записывает даты без времени и века.
  • Файл .dmp из exp или expdp двоичный: импортируйте его в базу Oracle, например в Oracle Database Free в Docker, и экспортируйте через SQL Developer.

Что не конвертируется

Представления, пакеты, процедуры, функции, триггеры, типы и синонимы написаны на PL/SQL. Они перечислены в отчете по имени и никогда не удаляются молча, чтобы вы могли переписать их для MySQL.

Вопросы о Oracle в MySQL

Нет ответа на ваш вопрос? Напишите нам через страницу контактов, и вам ответит человек. Страница контактов

Мой дамп загружается на сервер?

Нет. Конвертер работает в вашем браузере и читает дамп с диска по частям, поэтому он никогда не покидает ваш компьютер. Приложение для компьютера и командная строка тоже конвертируют на вашем компьютере.

Насколько большим может быть дамп?

Конвертер никогда не держит весь дамп в памяти: он читает файл дважды, по диапазонам, и пишет скрипт по ходу чтения. Дампы в несколько гигабайт конвертируются в браузере, в приложении для компьютера и в командной строке.

Можно ли конвертировать файл .dmp из exp или expdp?

Не напрямую: Data Pump и исходный Export пишут двоичный формат, который читает только Oracle. Импортируйте его в любую базу Oracle (Oracle Database Free работает в Docker) и экспортируйте через Database Export в SQL Developer или SQLcl. Конвертер сообщает об этом, когда получает файл .dmp.

Из каких версий Oracle может быть экспорт?

Экспорты из SQL Developer и SQLcl с определениями таблиц из DBMS_METADATA, из Oracle 11g и новее. Каждый тестовый экспорт создан в Oracle 21c и 23ai, в американском, немецком и ISO-сеансах, и сверен с источником ячейка за ячейкой.

Что происходит с NUMBER, DATE и другими типами Oracle?

NUMBER становится decimal, или bigint для целых чисел, и текстом свыше 65 цифр; DATE становится datetime и сохраняет время; CLOB - longtext, BLOB - blob, а интервалы сохраняют текст Oracle. NaN и Infinity становятся NULL, а отчет их подсчитывает.

Сохраняются ли столбцы identity и последовательности?

Столбцы identity становятся AUTO_INCREMENT и продолжаются после наибольшего id. В MySQL нет последовательностей, поэтому они попадают в отчет, как и значения по умолчанию, которые из них берутся.

А пакеты, процедуры и триггеры PL/SQL?

Они перечислены в отчете по имени и не конвертируются, потому что каждая база данных пишет их на своем языке.

На каких версиях MySQL загружается скрипт?

MySQL 5.7 и новее. Каждый тестовый экспорт загружается на 5.7 и 9 и останавливается на первой ошибке, если что-то пойдет не так.