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コマンド
作業イメージ
手順
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」をクリックします。
(2)「SQLines SQL Converter Tool」下の「Desktop Version」をクリックします。
(4)ローカルPCの任意の場所に展開します。フォルダの中は以下のようになっています。
※現時点で、のMySQLの対応バージョンは5系ですが、インポート後にアップグレードするため、問題ない認識です。
1-3. WinSCPのダウンロード ~ 接続設定
WinSCPオフィシャルサイトより、WinSCPをDLし、移行先DB(MySQL)の入った環境に接続できるようにしておきます。
詳細な手順は、WinSCP インストールから基本的の使い方をご覧ください。
2. テーブル定義(DDL)エクスポート from Oracle
Oracleからテーブル定義(DDL)をエクスポートします。
(1) SQL Developerを起動し、「ツール」タブ(①) > 「データベース・エクスポート」をクリックします(②)。
(2)エクスポート・ウィザードが立ち上がったら、接続DBを選択します(①)。
DDLのエクスポート欄の「スキーマの表示」のチェックをはず
今回はDDLのみが対象なので、「データのエクスポート」(③)のチェックを外しておきます。
移行元DB(Oracle)に合わせたエンコーディングを選択し(③)、「参照」を押下して、エクスポート先とファイル名を指定し(④)、「次」をクリックします。
(3)「エクスポートするタイプ」の選択です。デフォルトでは、「標準オブジェクト型」のすべてにチェックが入っていますが、「表」のみにし(①)、「次」(②)をクリックします。
(4)「オブジェクトの指定」画面に切り替わったら、「増やす」をクリックします。
(5)対象のスキーマを選択し(①)、「参照」をクリック(②)。
(6)対象のテーブルを確認し(①)、「>>」をクリック。
※一部のテーブルのみ移行する場合は、対象のテーブルを選択し(複数選択できます)、「>」をクリックしてください。
(8)「エクスポートのサマリー」画面に移動したら、内容を確認し、「終了」をクリックします。
(9)DDLのエクスポートが始まります。量が多い場合は、「バックグラウンドで実行」してもよいでしょう。
※650強のテーブルのエクスポートで5分ほどかかりました。
(10)終了すると、エクスポートされたファイルが開くので内容を確認します。
※量が多い場合は以下のメッセージが出て開きませんが、指定した場所にはエクスポートされているのでご安心を。
3. テーブル定義(DDL)コンバート from Oracle to MySQL
エクスポートされたDDLはOracle用なので、MySQL用にコンバート(変換)します。
(1)解凍したSqlinesのフォルダを開き、「sqlinesw.exe」をダブルクリックします。
(2)Sourceの「Database」で「Oracle」を選択し(①)、「Input SQL Scripts」でエクスポートしたファイルを入力します(②)。
Targetの「Database」で「MySQL」を選択し(③)、「Output SQL Scripts」で任意のファイル名を入力し、「Convert」(⑤)をクリックします。
※②, ④では別ウィンドウが開きますが、フォルダの選択までしかできないので、ファイル名は手動で入力してください。
※こちらは即完了!1秒かかったか、かからなかったかというレベル。
(4)(2)の④「Output SQL Scripts」で指定した格納先にコンバートされてできたファイル(以下、インポートファイル)が存在することを確認します。
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)機会があればやってみたいです。
参考
以下を参考にさせていただきました!ありがとうございました!