データが大きすぎて? AWS Database Migration Service や AWS Data Pipeline を使用した Amazon Redshift へのデータのコピー が失敗する・・ちなみに圧縮したtsvで13.8GiB でした
データはローカルにもあったので、次の手順でコピーした。基本的には SELECT INTO OUTFILE でtsv書き出してs3にアップロードして読み込み
ec2 にmysqlのデータベースファイルごと移動してmysqlで読み込めるようにする
scp とかで。
テーブルの内容をローカルにtsvとして吐き出す
SELECT * FROM table_1 INTO OUTFILE '/dev/shm/table_1.tsv'
ec2 はメモリがすごいやつ借りてメモリストレージ( /dev/shm/ )に書き出すとすごいはやい。t2.micro とかで数日がんばるよりいろいろよい。
tsv を圧縮・分割しながら s3 にアップロード
cat /dev/shm/table_1.tsv|awk '{
ym = substr($2,0,4) // $2 には '2013-11-01' のような値が入るので月で分割。単純に行数で分割してもよい
print $0 | "gzip|aws s3 cp - s3://mybucket/data/table_1_" ym ".tsv.gz"
}
SQL で分割できるならそれでもいいかも。今回は日付テーブルにインデックスとかなかったので…
redshift でテーブルを作成
適当にmysql の create table からエラーが出る部分を削って作った。
redshift でs3のファイルを読み込む
COPY meet_me_chat
FROM 's3://mybuckat/data/'
CREDENTIALS '<credentials>'
TIMEFORMAT 'YYYY-MM-DD HH:MI:SS'
GZIP -- gzip 圧縮されている
DELIMITER '\t'
ESCAPE -- \ をエスケープとして読み込む
ACCEPTINVCHARS -- 無効なutf8文字を??などに変換して受け入れる
COMPUPDATE ON -- 自動圧縮してロードする
;
エラーが出た時のみかたをググるといろいろ書いてあるけど、エラーメッセージに出る通りに stl_load_errors テーブルを見るだけでだいたい事足りる。
あと psql でいろいろやるなら \x auto
すると見やすくなることがある(mysql の \G
のようなもの)
整える
vacuum;
analyze;
バイナリなどがない場合は結構簡単。