【Oracle to MySQL】異種DB移行の壁を乗り越える!①変換の壁、②仕様の壁編

こんにちは。丸山です。

お久しぶりですが、現在でもオンプレから、AWSやGoogle Cloudなどのクラウド環境へ移行する際、
OracleからMySQLやPostgreSQLなどのOSSへDB移行を検討したいという問い合わせが多くあります。

以前、異種DB移行について移行の際の3つの壁についてお話ししています。

そこで今回は、実際の事例の中からOracle からMySQLへの変換について紹介します。

以前お話ししました通り、変換には3つの壁があります。
中でも、OracleからMySQLへの移行する際の例は以下の通りです。

 

その中で、今回は①変換の壁と、②仕様の壁の一例をお話ししたいと思います。

①変換の壁 <シーケンス>

Oracleは機能が充実しているため、OracleではあってもMySQLではない機能があります。その代表的なものがシーケンスです。当社事例では、このシーケンスの変換について疑似的にシーケンスの機能を作成する変換方針を取りました。

上手の通り、シーケンスと同じ動きをするファンクションを用意し、1シーケンスごとに1テーブル作成。シーケンス用のテーブルには、MySQLの機能であるAUTO_INCREMENT属性のカラムを用意しています。性能としても問題なく利用できたため採用となりました。

②仕様の壁 <NULLと空文字の違い>

次に、Oracle とMySQLの違いである空白とNULLの違いについてお話していきましょう。
この違いは、Oracle からPostgreSQLとも同じ現象が起こります。

まず、前提としてOracleとMySQLには、以下の違いがあります。

Oracle DB 空白とNULLを区別せず、自動的にNULLとして処理
MySQL 空白とNULLを区別する

 

そのため、OracleからMySQLへ移行する際にはOracleでの「空白」を、MySQLでは「空白」として扱うのか、それとも「NULL」として扱うのか、移行方針を決めておく必要があります。

弊社の事例では、空白をNULLをして変換することとしました。

そのため、データ移行の際にデータ移行の際に、Oracleから出力したCSVデータをMySQLにIMPORTする時に「,,」を「,NULL,」に変換することで対応しました。

ちなみに、空白をNULLをして扱うことを決めた場合、SQL文の変換では明確にNULLを指定しなくてはならないので注意が必要です。

  • NULLを挿入する場合
    insert into <テーブル名> values(…,…,NULL);
  • NULLを検索条件に使用する場合
    Where <カラム名> IS NULL (または IS NOT NULL)

今回は以上になります。 次回は、性能の壁の1例をご紹介いたします。

タイトルとURLをコピーしました