過去記事に関しては以下を参照。
MySQLからMongoDBへのデータ移行
MySQLからMongoDBへのデータ移行 その2
MySQLからMongoDBへのデータ移行 その3
今回移行対象のデータ件数は4000万件程度。
件数としてはビックデータとは言えない微妙な件数・・・。
まず結論から。
- MySQLからデータを抽出する方法に関してはeオプションを使って、標準出力をファイルにリダイレクトさせる。BSON形式っぽいTSVファイルにして出力する。
- ちゃんとしたBSON形式に変換する。ダブルクォーテーションのエスケープとか、改行コードをCRLFに変換とか、変な文字列の削除とか諸々必要
- mongoimportは決して早くない。と思う。(チューニングしてないので。)
- BSON形式以外のインポートはお勧めできない。型変換に異常に時間がかかるため。
- mongoimport中に重複があったとしてもエラーメッセージは出てこない。すでに重複するデータがmongoに入っていた場合はエラーが出る。
mongoimportの速度に関して
これに関してはあまり書くことはないが、とりあえず4000万件のデータを入れるのに7.5時間位掛かりました。2.1系から2.6.5にバージョンアップしたら倍位遅くなりました。原因はまだ不明です。
上の時間はバージョンアップ後の時間です。
ちなみにサーバ構成はこんな感じです。
mongos×3台、mongod×6台(うちマスター3台、スレーブ3台)
mongoimportのファイル形式に関して
結果的にはファイル形式に関してはBSON形式一択でした。CSVやTSV形式だと、データ型を定義することが出来ないため、
純粋な数値以外は全てテキスト型になってしまうので、日付のデータやNULLに関しては書き換えが必要になる。
データ量が多くなるとその書き換えに非常に時間がかかる。
mongoimportのエラーに関して
これに関しては色々調べたんですけど、結局良くわからず・・・。エラーが出たらインポート止めるっていうオプションもあるらしいのですが、そのオプションをつけても重複エラーに関しては止まらないらしいです。