MySQLからORACLEにデータを移行するまでの道のり
ORACLEがライセンスの問題で複数サーバーを立てられない。
なのでバックアップサーバーとかはなかなか立てられない。。
という事でバックアップにMySQLサーバーに使っています。
あと分析用とかもMySQLを使わざる終えないのでOracle > MySQL
のデータ移行をしないといけないという悲しい状況です。
今回はそのバックアップを取っていたデータから新しいテーブルを作成してそれを本番のOracleDBに移行するっという作業でしたがいろいろ詰まったところがあったんでメモ
・エンコードを合わせないといけない
バックアップの方はUTF8なので問題ないですが、オラクルの方はふる~~いのSJISでした。しかもエンコードを調べるSQLでの結果もわかりにくい。
SELECT VALUE FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER='NLS_CHARACTERSET';
「JA16SJIS」
見たこともないエンコードが。。なのではじめはSJISなのかEUCなのかさえわからなかったのですが、このコードでさらにぐぐると SJIS?っていう事がわかる。
なのでmysqlでエクスポートしたテーブルをUTF8>SJISに変換しないといけない作業。
mysql> select * from h_mypage_history INTO OUTFILE "/tmp/h_mypage_history.tsv" FIELDS TERMINATED BY '\t';
,(カンマ)よりもタブの方がごみデータがすくないと重いTSVでエクスポート
nkf -s /tmp/h_mypage_history.tsv > /tmp/h_mypage_history_sjis.tsv
・NULLの取り扱いが違う
MySQLでは\Nっていう風に記載されているのに対し、オラクルはそういう記述の仕方ではないらしい。
なのでNULLをデータなしに変換。
sed -e 's/\\N//g' /tmp/h_mypage_history_tab_sjis.tsv > /tmp/h_mypage_history_tab_sjis2.tsv
・インポートが難しい
[~]$ sqlldr ユーザー/パスワード control=mypage.ctl direct=true
というコマンドを叩く。そのまえにmypage.ctl
というコントロールファイルを作成しないといけない。
その内容は
LOAD DATA
INFILE '/tmp/h_mypage_history_sjis2.tsv'
INTO TABLE h_mypage_history
APPEND
FIELDS TERMINATED BY X'9' trailing nullcols
(
USER_ID
)
タブテキストの場合はFIELDS TERMINATED BY X'9'
としないといけないみたいです。
あと失敗すると、mypage.ctlファイルを作成する場合は
mypage.logていうログが生成されるのでそこからエラーなどを見てデバッグするみたいで直接のコマンドからエラーが見れないっていう遠まわしな。。。
なんだかんだ3人日ぐらいかかってデータ移行ができました。
参考URL
http://blog.livedoor.jp/ncad_webdb/archives/51384321.html
http://www.shift-the-oracle.com/config/multibyte-characterset.html
http://www.oracle.co.jp/forum/thread.jspa?threadID=8008600
http://www.oracle.co.jp/forum/thread.jspa?threadID=35001617
http://www.searchman.info/tips/1150.html
http://vertex.air-nifty.com/blog/2008/10/oraclecsv-fe87.html