OracleからMySQLへのマイグレーション時に発生した問題点
Oracle10gからMysql5.5へマイグレーションを行った際に遭遇したエラーや問題点をまとめました。・行サイズの上限問題
・カラムの中の改行問題(explanation)
・Nullインポート問題
・OracleのDATE型(yy-mm-dd)をMysqlにインポートする際の不具合
・余分な空白が入る
・OracleのCLOB出力問題
・ミリ秒問題
・文字化け
行サイズの上限問題
InnoDBは、テーブルスペースのページサイズの約半分で、ページサイズのデフォルトは16KBなのでデフォルトの行サイズは約8KBです。ERROR 1118 (42000): Row size too large. The maximum row si■行サイズの上限問題の解決策
カラムの中の改行問題(explanation)
SqlPlusは、カラム中に改行がある場合、空行を挿入する仕様となっているため、 Mysqlにインポートする際に空行の部分が、そのままインポートされてしまう。Nullインポート問題
Nullインポート問題として、「MysqlのDate型やint型のNull問題」と「UNIQUEKEYが指定されている場合、空カラムを複数登録できない」 という問題に遭遇した。set echo off set linesize 32767 set pages 0 set trimspool on set feed off spool CSV_m_agencyhoge.csv select '~' || DECODE(AGENCY_CD, '', '\N',AGENCY_CD ) || '~' ||','|| '~' || DECODE(AGENCY_NAME, '', '\N',AGENCY_NAME ) || '~' ||','|| '~' || DECODE(DELETE_FLG, '', '\N',DELETE_FLG ) || '~' ||','|| '~' || DECODE(UPD_DATE, '', '\N',TO_CHAR(UPD_DATE , 'YYYY-MM-DD HH24:MI:SS' ) ) || '~' ||','|| '~' || DECODE(UPD_USER_ID, '', '\N',UPD_USER_ID ) || '~' ||','|| '~' || DECODE(INS_DATE, '', '\N',TO_CHAR(INS_DATE , 'YYYY-MM-DD HH24:MI:SS' ) ) || '~' ||','|| '~' || DECODE(INS_USER_ID, '', '\N',INS_USER_ID ) || '~' from m_agencyhoge ; spool off※区切り文字[,]、文字列の囲み[~]としています。環境に合わせてください。
OracleのDATE型(yy-mm-dd)をMysqlにインポートする際の不具合
Oracle側で99-12-31というデータはMAX年(9999)を意味しているがMysqlにインポートすると1999-12-31と解釈されてしまう。余分な空白が入る問題
Oracleからエクスポートする際に、「set colsep ','」を使うと余分な空白が入り、Mysqlへインポートされる。select emp_id ||','|| dept_id ||','|| first_name ||','|| last_name ||','||salary from emp;
OracleのCLOB出力問題
CLOB型が含まれているデータをCSV形式にエクスポートすると正常に出力されない現象が発生set PAGESIZE 0 set LINESIZE 500 set long 6000 select CLOB_TAG_INFO from t_event_html_info;
ミリ秒問題
Mysqlではミリ秒に対応していないため、Oracle側のミリ秒をインポートするとエラーがでてしまう。| Warning | 1264 | Out of range value for column 'upd_date' at row 1 |■ミリ秒問題の解決策
文字化け
マイグレーションツールを利用する場合、CSVファイルの文字コードと特殊文字により文字化けすることがある。