---
title: "在浏览器中将 Oracle 迁移到 MariaDB"
description: "将 Oracle 数据库迁移到 MariaDB：把 SQL Developer 或 SQLcl 的导出转换为表、键和数据相同的脚本，并报告每项更改。"
canonical: https://intosql.com/zh-cn/oracle-to-mariadb
last_updated: 2026-10-15
---

# 在浏览器中将 Oracle 迁移到 MariaDB

拖入 SQL Developer 的 Database Export 或 SQLcl 写出的 .sql 文件（包含表和 Insert 语句），即可下载包含相同表、键、索引和数据的 MariaDB 脚本。MariaDB 无法原样存储的每个值，以及它不支持的每个对象，都会在报告中列出。

[Oracle 到 MariaDB 迁移指南](https://intosql.com/docs/migrations/oracle-to-mariadb)

[Oracle 到 MariaDB 的数据类型](https://intosql.com/docs/types/oracle-to-mariadb)

## 从 Oracle 到 MariaDB 的变化

每一行是转换器应用的一条规则，以及该规则更改你的数据时在报告中写入的记录。

| 在 Oracle 中 | 在 MariaDB 中 | 报告记录 |
| --- | --- | --- |
| BOOLEAN (23ai) | tinyint(1) |  |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | 不超过 1024 个字符时为 varchar(n)，超过则为 text 类型 |  |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s)，或 bigint |  |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | varchar(100)，存放 Oracle 的文本，例如 +01-06 | `type_replaced` |
| DATE, TIMESTAMP(p) | datetime(p) |  |
| TIMESTAMP(7) to TIMESTAMP(9) | 秒保留六位小数，第七位截断 | `fraction_cut` |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | UTC 的 datetime(p) | `moments_as_utc` |
| JSON (21c), and CLOB holding JSON | json |  |
| BLOB, RAW(n), LONG RAW | binary(n)、varbinary(n) 和 blob 类型 |  |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | text | `type_replaced` |
| collations that ignore case (BINARY_CI) | 精确比较（utf8mb4_bin） | `case_insensitive_collation` |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | AUTO_INCREMENT，从最大的 id 之后继续 |  |
| identity columns the target can't count | 普通整数 | `counter_dropped` |
| CREATE SEQUENCE | CREATE SEQUENCE，选项相同 |  |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | 生成列，PERSISTED 时为 STORED，否则为 VIRTUAL |  |
| virtual columns with functions IntoSQL doesn't write, and the || operator | 普通列 | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | 无默认值 | `default_not_translated` |
| CHECK constraints | 已转换 |  |
| CHECK constraints with functions IntoSQL doesn't write | 不创建 | `check_skipped` |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | 不创建 | `check_not_enforced` |
| function-based, bitmap and domain indexes | 不创建 | `index_skipped` |
| foreign keys | 外键，以 FOREIGN_KEY_CHECKS=0 导入 |  |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | 不创建 | `foreign_key_skipped` |
| partitioned tables | 单个表，包含每个分区的行 | `partitions_dropped` |
| several schemas in one export | 单个数据库，每个表名前加上其 schema 名 | `schemas_merged` |
| NOT NULL columns with values that become NULL | 去除 NOT NULL | `not_null_relaxed` |
| views, synonyms, types, packages, procedures, functions and other triggers | 在报告中列出 | `not_converted_objects` |
| exports without CREATE TABLE (data only) | 根据值推断类型 | `no_schema` |
| expressions in INSERT values other than the ones exports write | NULL | `expression_value` |
| types IntoSQL doesn't know, and object types | longtext | `unknown_type` |
| dates before year 1 and time zones given as region names | NULL | `date_out_of_range` |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULL | `invalid_value_null` |
| NUL characters in text | 保留 |  |
| text that isn't valid in its encoding | 错误的字节变为替换字符 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 按原样复制 | `mojibake_suspected` |

## 将脚本导入 MariaDB

脚本先创建表、复制行，再添加键、索引和外键，因此导入速度快，并会在遇到第一个错误时停止。

```shell
mariadb --default-character-set=utf8mb4 mydb < oracle.mariadb.sql
```

外键按转储中的声明创建，导入行时使用 FOREIGN_KEY_CHECKS=0，与 mysqldump 的做法相同。

对于较大的转储，请在服务器所在的机器上运行客户端；如果单行非常大，请调高 max_allowed_packet。

IntoSQL Pro 可以通过桌面应用或命令行将文件直接导入 MariaDB，无需生成脚本。

## 如何转储 Oracle 以获得最佳结果

转换器读取转储中的内容。以下选项能让转储保留更多数据：

- 在 SQL Developer 中选择 Tools、Database Export，并选择 DDL 和 Insert 数据格式。SQLcl 使用 SET SQLFORMAT INSERT 也会写出相同内容。
- 导出前请执行 ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS'：默认格式写出的日期不含时间和世纪。
- exp 或 expdp 生成的 .dmp 文件是二进制的：请将其导入 Oracle 数据库（例如 Docker 中的 Oracle Database Free），再用 SQL Developer 导出。

## 哪些内容不会转换

视图、包、存储过程、函数、触发器、类型和同义词都是用 PL/SQL 编写的。它们会按名称在报告中列出，绝不会被悄悄丢弃，以便你为 MariaDB 重写。

## 关于 Oracle 转 MariaDB 的问题

### 我的转储会被上传吗？

不会。转换器在你的浏览器中运行，分块从磁盘读取转储，因此转储不会离开你的电脑。桌面应用和命令行也在你的电脑上转换。

### 转储可以多大？

转换器从不把整个转储放进内存：它按范围读取文件两次，边读边写出脚本。几 GB 的转储可以在浏览器、桌面应用和命令行中转换。

### 可以转换 exp 或 expdp 生成的 .dmp 文件吗？

不能直接转换：Data Pump 和原始的 Export 写出的是只有 Oracle 能读取的二进制格式。请将其导入任意 Oracle 数据库（Oracle Database Free 可在 Docker 中运行），再用 SQL Developer 的 Database Export 或 SQLcl 导出。转换器收到 .dmp 文件时会给出提示。

### 导出可以来自哪些 Oracle 版本？

由 SQL Developer 和 SQLcl 从 Oracle 11g 及更高版本写出、带有 DBMS_METADATA 表定义的导出。每个测试导出都来自 Oracle 21c 和 23ai，涵盖美式、德式和 ISO 会话，并与其源数据逐个单元格比较。

### NUMBER、DATE 和其他 Oracle 类型会怎样？

NUMBER 变为 decimal，整数为 bigint，超过 65 位则为文本；DATE 变为 datetime，保留其时间；CLOB 变为 longtext，BLOB 变为 blob，interval 保留 Oracle 的文本。NaN 和 Infinity 变为 NULL，报告会统计其数量。

### 标识列和序列会保留吗？

是的。标识列变为 AUTO_INCREMENT，并从最大的 id 之后继续；序列变为 MariaDB 序列，从序列取值的默认值也会继续从中取值。

### PL/SQL 包、存储过程和触发器怎么处理？

它们会按名称在报告中列出，但不会转换，因为每种数据库都用自己的语言编写它们。

### 脚本可以导入哪些 MariaDB 版本？

MariaDB 10.11 及更高版本。每个测试导出都能在 10.11 和 11.4 上导入，如有问题会在第一个错误处停止。

## 从 Oracle

- [Oracle 到 PostgreSQL](https://intosql.com/zh-cn/oracle-to-postgresql)
- [Oracle 到 MySQL](https://intosql.com/zh-cn/oracle-to-mysql)
- [Oracle 到 SQLite](https://intosql.com/zh-cn/oracle-to-sqlite)
- [Oracle 到 SQL Server](https://intosql.com/zh-cn/oracle-to-sql-server)
- [Oracle 到 Oracle](https://intosql.com/zh-cn/oracle-to-oracle)

## 到 MariaDB

- [MySQL 到 MariaDB](https://intosql.com/zh-cn/mysql-to-mariadb)
- [MariaDB 到 MariaDB](https://intosql.com/zh-cn/mariadb-to-mariadb)
- [PostgreSQL 到 MariaDB](https://intosql.com/zh-cn/postgresql-to-mariadb)
- [SQL Server 到 MariaDB](https://intosql.com/zh-cn/sql-server-to-mariadb)
- [SQLite 到 MariaDB](https://intosql.com/zh-cn/sqlite-to-mariadb)

## 指南和所有组合

- [MariaDB 到 Oracle](https://intosql.com/zh-cn/mariadb-to-oracle)
- [Oracle 到 MariaDB 迁移指南](https://intosql.com/docs/migrations/oracle-to-mariadb)
- [Oracle 到 MariaDB 的数据类型](https://intosql.com/docs/types/oracle-to-mariadb)
- [所有数据库组合](https://intosql.com/zh-cn/database-migration)
