higehikiのブログ

iPhoneアプリ「ログ雀」の中の人です。

Amazon RDSのレプリケーションがLOAD DATAするとエラーで止まる

AmazonRDSのreplica setを作って運用していたんですが、とある開発事案で、大量のレコードを短時間で生成する必要に迫られました。

要件としては、
① 特定ファイル(複数)のファイル名から属性情報を抜き出す
② 既存テーブルAの属性情報にHitしないレコードをSELECTしてtmpテーブルを生成
③ tmpテーブルに特定ファイル(複数)を1個ずつ展開してINSERT
というようなものです。

ただ、特定ファイル内のレコード数が大きく、1ファイル、10万件〜100万件を想定しておく必要がありました。

ここで、単純にサーバー(php)から1行ずつINSERTするのは選択肢から消えます。
バルクインサートも検証しましたが、速度として満足いくものではなく、代替方法を検討しました。

結果、LOAD DATAを使おう!ってことになりました。

LOAD DATA INFILE "ファイル名" INTO TABLE テーブル名 
FIELDS TERMINATED BY ',区切り文字' ENCLOSED BY '"';

クッソ速いんですねコレ。知らなかった…。

ひゃっほーひゃっほー言っていたら、商用環境でRDSのレプリケーションがエラー…。
どうも、MySQLでは推奨されない方法 + 対応していない?!という状況のようで八方塞がりに。

「バージョン上げたら直るかも?」ってアドバイスを頂き、確認したところ、「MySQL 5.6.17」が選択できるようになっている!
動けばいいなーぐらいの期待感で、replica setの方を Modify で 5.6.17 に変更したところ…。


動いた!エラーでない!ひゃっほーひゃっほー!

めでたしめでたし。