こんにちは。丸山です。
お久しぶりですが、現在でもオンプレから、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例をご紹介いたします。