oracle-to-mariadb について
oracle-to-mariadbは、OracleデータベースからMariaDBへの移行を計画または実施するチーム向けのリファレンススキルです。Oracle互換モード、データ型の対応、手動での書き換え、移行ツールとバージョンごとの注意点を説明します。
主な機能
- 01Oracle互換モードの説明
- 02OracleからMariaDBへの型対応表
- 03手動での書き換えが必要な構文の特定
- 04移行ツールとバージョン上の注意点の整理
活用シーン
- 01移行前のOracleスキーマ互換性評価
- 02未対応SQL構文の書き換え計画
- 03データ型とトランザクション動作の差異確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mariadb/ skills --skill oracle-to-mariadbインストール後、Claude Code で/oracle-to-mariadbを入力して読み込まれたか確認します。
詳細
Oracle から MariaDB への移行ガイド
最終更新日:2026-06-04
Oracle からの移行先として MariaDB を選ぶ理由
MariaDB は、ネイティブで PL/SQL との互換性を備えた唯一のオープンソースデータベースです。MySQL には、同等の Oracle 互換モードがありません。PostgreSQL では、PL/SQL を全面的に書き換える必要があります。MariaDB の sql_mode=ORACLE を有効にすると、ストアドプロシージャ、パッケージ、カーソル、例外処理、Oracle スタイルの関数など、Oracle コードのおよそ 80% を変更せずに実行できます。
他のオープンソースの代替製品と比べた追加の利点:
- Connect Storage Engine — 移行中、全面的な切り替えを行わずに、ODBC 経由で Oracle のライブデータをフェデレーションできます
- システムバージョン管理テーブル — 時系列データについて Oracle Flashback Archive に相当する機能を提供します。オープンソースデータベースでは唯一です
- ColumnStore — Oracle の In-Memory ColumnStore に匹敵する、列指向の分析エンジンです
- コスト:通常、Oracle のライセンスと比べて 70~90% のコスト削減を実現できます
必要条件: Oracle 互換モードには MariaDB Community Server 10.3 以降が必要です。
ROWNUM、TO_CHAR()、ADD_MONTHS()、SYS_GUID()には 10.6 以降が必要です。現在の LTS は 11.8(2025 年 5 月)です。
最初の手順:Oracle 互換モードを有効にする
SET sql_mode = 'ORACLE';
-- or permanently in configuration:
-- sql_mode = ORACLE
これを行わないと、PL/SQL 構文、Oracle のデータ型の同義語、Oracle スタイルの関数は動作しません。これは最も重要な手順であり、最も見落とされやすい手順です。
LLM が誤りやすい点
| よくある内容 | 正しい内容 |
|---|---|
| 構文エラーになる PL/SQL | まず sql_mode=ORACLE を設定してください。設定しないと、PL/SQL の構文要素は認識されません |
Oracle の DATE を MariaDB の DATE にマッピングする | Oracle の DATE は日付と時刻の両方を格納します。DATE ではなく DATETIME にマッピングしてください |
| PL/SQL と 100% 互換性があると想定する | 約 80% は変更せずに動作しますが、通常、SYNONYM、INSERT ALL、CONNECT BY は書き換えが必要です。(+) 結合は 12.1 以降の Oracle モードで動作します(次の行を参照) |
スキーマまたはコードで SYNONYM を使用する | MariaDB に同等の機能はありません。ビューまたはオブジェクトへの直接参照に置き換えてください |
(+) 外部結合表記 | MariaDB 12.1 以降の Oracle モードでサポートされています(MDEV-13817)。それより古いバージョンでは LEFT JOIN/RIGHT JOIN に書き換えてください |
START WITH ... CONNECT BY | サポートされていません。WITH RECURSIVE を使用した再帰 CTE に書き換えてください |
TIMESTAMP WITH TIME ZONE | 移行時にタイムゾーン情報が失われ、DATETIME になります。アプリケーション側でタイムゾーンを処理してください |
データ型のマッピング
sql_mode=ORACLE により、次の項目は自動的に処理されます。
| Oracle | MariaDB | 備考 |
|---|---|---|
VARCHAR2(n) | VARCHAR(n) | 自動 |
NUMBER(p,s) | DECIMAL(p,s) | 自動 |
NUMBER | DOUBLE | 自動 |
DATE | DATETIME | 自動ですが、注意: Oracle の DATE には時刻が含まれますが、MariaDB の DATE には含まれません |
CLOB | LONGTEXT | 自動 |
BLOB | LONGBLOB | 自動 |
RAW(n) | VARBINARY(n) | 自動 |
CHAR(n > 255) | VARCHAR(n) | 手動 |
TIMESTAMP WITH TIME ZONE | DATETIME | 手動 — タイムゾーン情報が失われます |
BFILE | LONGBLOB | 手動 — ファイルパスの保存方法が異なります |
ROWID | CHAR(10) | 手動 |
sql_mode=ORACLE が対応する内容
PL/SQL 構文(10.3+)
- パッケージ:
CREATE PACKAGE、CREATE PACKAGE BODY— 11.4 以降はsql_mode=ORACLEの外でも動作するため(MDEV-10075)、混在モードのコードベースでもパッケージを使用できます - カーソル:明示的、暗黙的、パラメーター付き、
%ISOPEN、%ROWCOUNT、%FOUND、%NOTFOUND - 準備済みステートメントのカーソル(12.3+)
- カーソル変数:
TYPE ... IS REF CURSOR(13.0+)— カーソルをプロシージャーのパラメーターとして渡し、戻り値として返せます - 事前定義された弱い型の
SYS_REFCURSOR(12.0+)— 組み込みのカーソル型で、TYPE宣言は不要です。システム変数max_open_cursorsにより、同時に開けるカーソルの数が制限されます - 変数の型:
:=による代入、%TYPE、%ROWTYPE - ストアド関数の戻り値としての
ROWデータ型(11.7+)— 関数が構造化された行を返します。Oracle の行型に似ています - ルーチンのパラメーターおよび関数の
RETURN句でのRECORD型(13.0+) - 連想配列:
DECLARE TYPE ... TABLE OF ... INDEX BY(12.1+) - ストアドルーチンのパラメーターにはデフォルト値を指定できます(11.8+)— Oracle の
DEFAULT句のように、引数を少なくしてプロシージャーを呼び出せます - 制御フロー:
FOR i IN 1..10 LOOP、GOTO、EXIT WHEN、ELSIF、CONTINUE - 例外処理:
EXCEPTION WHEN TOO_MANY_ROWS / NO_DATA_FOUND / DUP_VAL_ON_INDEX - 無名ブロック:
BEGIN ... END - 動的 SQL:
EXECUTE IMMEDIATE ... USING - トリガー変数:
:NEW、:OLD
Oracle 互換関数
| 関数 | 利用可能なバージョン |
|---|---|
DECODE() | 10.3 |
CHR()、位置 0 を指定した SUBSTR() | 10.3 |
ADD_MONTHS() | 10.6 |
TO_CHAR() | 10.6(FM のパディング抑制フォーマットは 12.0 で追加) |
SYS_GUID() | 10.6 |
ROWNUM | 10.6 |
TO_NUMBER() | 12.2.1 |
TO_DATE() | 12.3(ネイティブ対応。それ以前のバージョンでは STR_TO_DATE() を使用) |
TRUNC() | 12.2 |
NULL の処理
Oracle では空文字列を NULL として扱います。sql_mode=ORACLE ではこの動作は自動的に有効にならないため、EMPTY_STRING_IS_NULL を別途追加する必要があります。
SET sql_mode = 'ORACLE,EMPTY_STRING_IS_NULL';
EMPTY_STRING_IS_NULL がない場合、Oracle モードでも MariaDB では '' は NULL ではありません。
その他の自動動作
- 文字列連結としての
||(NULL を無視) EXCEPTの同義語としてのMINUS(10.6+)- 準備済みステートメントでの名前付きプレースホルダー(
:1、:2) SELECT DISTINCTの同義語としてのSELECT UNIQUEDUALテーブルのサポート
手動での書き換えが必要なもの
以下の Oracle 機能には直接相当する機能がないため、コードの変更が必要です。
SYNONYM— ビュー(CREATE VIEW)に置き換えるか、オブジェクト参照を直接更新しますINSERT ALL/INSERT FIRST— 複数のINSERTステートメントまたはアプリケーションロジックに書き換えます(+)外部結合構文 — Oracle モードでは MariaDB 12.1 以降でネイティブにサポートされています。それ以前のバージョンではLEFT JOIN/RIGHT JOINに書き換えます。-- Oracle: SELECT * FROM a, b WHERE a.id = b.id(+); -- MariaDB: SELECT * FROM a LEFT JOIN b ON a.id = b.id;START WITH ... CONNECT BY— 再帰 CTE に書き換えます。-- MariaDB equivalent: WITH RECURSIVE tree AS ( SELECT id, parent_id, name FROM categories WHERE parent_id IS NULL UNION ALL SELECT c.id, c.parent_id, c.name FROM categories c JOIN tree t ON c.parent_id = t.id ) SELECT * FROM tree;TIMESTAMP WITH TIME ZONE— タイムゾーンオフセットを別の列に保存するか、アプリケーション側で処理します- オブジェクト型と継承 — 相当する機能はありません。正規化されたテーブルに再構成します
移行ツール
- MariaDB Migration Assessment Tool — Oracle の DDL エクスポートを分析し、移行を開始する前に互換性を評価します
- Connect Storage Engine — ODBC 経由で Oracle のライブデータを読み取る MariaDB テーブルを作成します。全面的な切り替えをせずに段階的に移行する場合に便利です
- DBeaver — Oracle と MariaDB 間のスキーママッピング、データ比較、データ転送に対応します
- MaxScale のクエリー書き換え — アプリケーション側で変更できない場合に、サポートされていない Oracle 構文をその場で傍受して書き換えます
主な注意点
- 自動コミット(コミットモデルが逆です):Oracle には
autocommit変数がなく、デフォルトは手動コミットです。INSERT/UPDATE/DELETEは、明示的にCOMMITを実行するまで永続化されません。MariaDB は逆で、デフォルトでautocommitがONのため、各ステートメントはすぐにコミットされます。Oracle の「バッチ処理後にコミット」という動作を維持するには、作業単位をSTART TRANSACTION ... COMMITで囲むか、autocommit=0を設定してください。Oracle のトランザクションに関する概念ガイドを参照してください。 SYSDATE:MariaDB の Oracle モードではSYSDATEは動作しますが、DATETIMEを返します。日付のみの比較を確認してください。DUAL:MariaDB でも動作しますが、完全に同じではありません。schema.DUALのようなスキーマ修飾参照は避けてください。- シーケンス:MariaDB 10.3 以降では、Oracle 互換の構文(
MINVALUE、MAXVALUE、INCREMENT BY)でCREATE SEQUENCEが動作します。 - アクティブなセッションがある場合の
DROP USER(12.1 以降):Oracle 互換の動作です。Oracle モードでは、ユーザーにアクティブなセッションがあるとDROP USERは失敗します。他のモードでは警告が出されます。 - 約 20%の書き換え:Oracle から MariaDB への変換を 100%実現できるツールはありません。複雑な PL/SQL、オブジェクト型、サポートされていない構文については、手動での確認を見込んでください。
参考資料
- sql_mode=ORACLE — MariaDB ドキュメント
- Oracle から MariaDB への移行 — mariadb.com
- sql_mode と DBeaver による Oracle から MariaDB への移行の簡素化 — MariaDB ブログ
- 移行評価ツール — MariaDB ブログ
- Oracle 移行における MariaDB と PostgreSQL の比較 — mariadb.com
- Oracle から MariaDB への移行:詳細解説 — Severalnines
- Connect SE を使った Oracle から MariaDB へのデータ移行 — mariadb.org
ここで取り上げていないトピックについては、mariadb.com/docs の MariaDB 公式ドキュメントを参照してください。