1
2

More than 5 years have passed since last update.

DMS が失敗するときに手動で mysql から redshift にコピーする

Last updated at Posted at 2016-07-27

データが大きすぎて? 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;

バイナリなどがない場合は結構簡単。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2