OracleからMysqlへのマイグレーションで問題となったこと

Oracle10gからMysql5.5へマイグレーションした際に、問題となったことのメモです。

ミリ秒問題

Mysqlではミリ秒に対応していないため、Oracle側のミリ秒をインポートするとエラーがでてしまう。

エラー例:

| Warning | 1264 | Out of range value for column 'upd_date' at row 1 |


ミリ秒問題の解決策
エクスポート時にフォーマットを指定することにより解決できる。 しかし今回は識別子として利用していたので、ミリ秒を切り捨てることができなかった。 そこでCHARA型に変更し、文字列として扱い回避



行サイズの上限問題

InnoDBは、テーブルスペースのページサイズの約半分で、ページサイズのデフォルトは16KBなのでデフォルトの行サイズは約8KBである。
ページサイズを変更するには、MySQLをソースからコンパイルして、さらにテーブルスペースとログファイルを再作成する必要がある。
ページサイズの上限は64KBであるので、その場合の1行の最大サイズは32KBとなる。MySQL Clusterは1行あたり最大8KB。
16Kb以外のテーブルサイズのサポートはMySQL5.6以降となります。

エラー例:

ERROR 1118 (42000): Row size too large. The maximum row si


行サイズの上限問題の解決策
今回は使われていない不要なカラムがあったため、その不要なカラムを削除して対応
※Mysql5.5では、デフォルト以外のページサイズをサポートしていない。



カラムの中の改行問題(explanation)

Oracle(sqlplus)は、カラムに改行があった場合、空行を差し込んでしまうので、 Mysqlにインポートする際に空行がインポートされてしまう。

カラムの中の改行問題の解決策
CSVファイルから空行を削除する。
削除例:

$ sed -e "/^$/d" table_name.csv > table_name1.csv

※table_name.csv:元CSVファイル、table_name1.csv:空行削除したCSVファイル



Nullインポート問題(update_date)

OracleとMysqlでは、空データの扱いがことなるようである。
Oracleの空データをそのままMysqlへインポートした際に下記の事象が発生しました。
・Date型やint型にNULLの場合、0が入ってしまう。
・ユニーク制約がある場合、空データの場合エラーとなる。

Nullインポート問題の解決策
カラムが空の場合、\Nに置き換える。

※一部のカラムでNULLでは警告がでるので、NULLと同じ意味を持つ「\N」とする。
CSVでNULLを「NULL」と記述するより、「\N」と記述した方がいいようである。下記事象は「\N」とすることで解決しました。

桁数が4桁以内の場合、「NUL」、「NU」の様に中途半端に入り、NULLではなくなる。




OracleのDATE型(yy-mm-dd)をMysqlにインポートする際の不具合

Oracle側で99-12-31というデータはMAX年(9999)を意味しているがMysqlにインポートすると1999-12-31となってしまう

OracleのDATE型(yy-mm-dd)をMysqlにインポートする際の不具合の解決策
Oracle側のExport時にYYYY-MM-DDと指定する。


さらに詳細なMysqlマイグレーションの課題解決記事へ
Google+