3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

OracleからMySQLへのテーブル定義(DDL)の移行

OracleからMySQLにテーブル定義をまとめて移行する方法です。

経緯など

開発環境以上はOracle。
そこそこ制約が厳しいので、個々の開発の段階で、より自由に操作できるDB環境を整えるため。
移行対象のテーブルは650以上。
OracleとMySQLでは、構文が異なる部分があるため、SQLines SQL Converter Tool(以下、Sqlines)というフリーのコンバーターを使って、DDL変換することにしました。

環境と前提条件

  • OS(ローカルPC):Windows10
  • OS(MySQLインストール先):CentOS6.8
  • 移行元DB:Oracle Database 12c
  • 移行先DB:MySQL8.0(database(Oracleでいうところのschema)は作成済とする)

使用ツール、方法

  • OracleからのDDLエクスポート:SQL Developer
  • Oracle → MySQLへDDLコンバート:Sqlines
  • インポートファイルの移動(ローカルPC → MySQLインストール先):WinSCP
  • MySQLへのDDLインポート:Linuxコマンド

作業イメージ

作業イメージは以下の通り。
image.png

手順

1. 事前準備

使用するツールをダウンロード & インストールしておきます。

1-1. SQL Developerのダウンロード ~ 接続設定

Oracle SQL Developer ダウンロードより、SQL Developerをダウンロードし、移行元DB(Oracle)に接続できるようにしておきます。
詳細な手順は、SQL Developerの使い方~ダウンロード、インストール、DB接続、SQL実行をご覧ください。

1-2. Sqlinesのダウンロード ~ 解凍

Sqlinesより、Sqlinesをダウンロードし、解凍しておきます。
手順は以下の通り。
(1)Sqlinesにアクセスし、画面右端の「Migration to MySQL」下の「Oracle to MySQL」をクリックします。
image.png

(2)「SQLines SQL Converter Tool」下の「Desktop Version」をクリックします。
image.png

(3)Windows版の最新版をクリックしてダウンロード。
image.png

(4)ローカルPCの任意の場所に展開します。フォルダの中は以下のようになっています。
image.png

※現時点で、のMySQLの対応バージョンは5系ですが、インポート後にアップグレードするため、問題ない認識です。

1-3. WinSCPのダウンロード ~ 接続設定

WinSCPオフィシャルサイトより、WinSCPをDLし、移行先DB(MySQL)の入った環境に接続できるようにしておきます。
詳細な手順は、WinSCP インストールから基本的の使い方をご覧ください。

2. テーブル定義(DDL)エクスポート from Oracle

Oracleからテーブル定義(DDL)をエクスポートします。

(1) SQL Developerを起動し、「ツール」タブ(①) > 「データベース・エクスポート」をクリックします(②)。
image.png

(2)エクスポート・ウィザードが立ち上がったら、接続DBを選択します(①)。
DDLのエクスポート欄の「スキーマの表示」のチェックをはず
今回はDDLのみが対象なので、「データのエクスポート」(③)のチェックを外しておきます。
移行元DB(Oracle)に合わせたエンコーディングを選択し(③)、「参照」を押下して、エクスポート先とファイル名を指定し(④)、「次」をクリックします。
image.png

(3)「エクスポートするタイプ」の選択です。デフォルトでは、「標準オブジェクト型」のすべてにチェックが入っていますが、「表」のみにし(①)、「次」(②)をクリックします。
image.png

(4)「オブジェクトの指定」画面に切り替わったら、「増やす」をクリックします。
image.png

(5)対象のスキーマを選択し(①)、「参照」をクリック(②)。
image.png

(6)対象のテーブルを確認し(①)、「>>」をクリック。
※一部のテーブルのみ移行する場合は、対象のテーブルを選択し(複数選択できます)、「>」をクリックしてください。
image.png

(7)内容を確認し(①)、「次」をクリック(②)。
image.png

(8)「エクスポートのサマリー」画面に移動したら、内容を確認し、「終了」をクリックします。
image.png

(9)DDLのエクスポートが始まります。量が多い場合は、「バックグラウンドで実行」してもよいでしょう。
image.png
※650強のテーブルのエクスポートで5分ほどかかりました。

(10)終了すると、エクスポートされたファイルが開くので内容を確認します。
image.png

※量が多い場合は以下のメッセージが出て開きませんが、指定した場所にはエクスポートされているのでご安心を。
image.png

3. テーブル定義(DDL)コンバート from Oracle to MySQL

エクスポートされたDDLはOracle用なので、MySQL用にコンバート(変換)します。

(1)解凍したSqlinesのフォルダを開き、「sqlinesw.exe」をダブルクリックします。
image.png

(2)Sourceの「Database」で「Oracle」を選択し(①)、「Input SQL Scripts」でエクスポートしたファイルを入力します(②)。
Targetの「Database」で「MySQL」を選択し(③)、「Output SQL Scripts」で任意のファイル名を入力し、「Convert」(⑤)をクリックします。
image.png
※②, ④では別ウィンドウが開きますが、フォルダの選択までしかできないので、ファイル名は手動で入力してください。

(3)Convertが実行されるとログが出ます。
image.png

※こちらは即完了!1秒かかったか、かからなかったかというレベル。

(4)(2)の④「Output SQL Scripts」で指定した格納先にコンバートされてできたファイル(以下、インポートファイル)が存在することを確認します。
image.png

4. テーブル定義(DDL)インポート to MySQL

(1)WinSCPで手順3でできたインポートファイルを移行先DB(MySQL)の入ったサーバの任意のディレクトリにコピーします。

(2)移行先DB(MySQL)の入ったサーバにrootユーザーでログインし、MySQLが起動していることを確認します。

# service mysqld status

(3)でインポートファイルを配置したディレクトリに移動します。
/home/hogeに配置した場合は以下の通り。

# cd /home/hoge

(3)以下のコマンドを実行し、DDLをインポートします。

# mysql -u root -p -f < インポートファイル名

(4)終了したらMySQLをアップグレード&再起動します。

# service mysqld restart --upgrade=FORCE

※「mysql_upgrade」はMySQL8ではdeprecated(非推奨)なので、代わりに「--upgrade=FORCE」を使います。

(5)MySQLにログインし、テーブルがインポートされていることを確認します(以下、rootでログインの場合)。

# mysql -u root -p 
# use 対象のデータベース名;
# show tables;

終わりに

SQL ServerやPostgres SQLなど → MySQLの移行、MySQL → Oracleの移行ツールは検索すればわりとすぐに出てくるのですが、Oracle → MySQLは一筋縄ではいかず、方法探しと選定だけでも丸1日以上かかりました。
(考えてみれば同じOracle社管轄で高価なOracle Database → 安価なMySQLの移行方法がやたら出回るわけないのですが。)

MySQLインポート時にエラーが出ることがありますが、そのトラブルシューティングについては、
OracleからMySQLへのテーブル定義(DDL)の移行時のトラブルシューティング | Qiita
に書きましたので、そちらもご覧ください。
(エラー発生分以外はオプション-fにより、インポートされるので、その辺はご安心を)。

Sqlinesは、他DB → 他DBへのコンバートもできるようなので(例:SQL Server → Postgres SQL)機会があればやってみたいです。

参考

以下を参考にさせていただきました!ありがとうございました!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?