最終的な目標
AWS RDS(MySQL)のテーブル内のデータを、S3へエクスポートして、Athenaでクエリを投げられるようにしたい!
本記事で出来るようになること
AWS RDS(MySQL)のテーブル内のデータをS3へエクスポートする
EC2サーバーを経由して、S3へエクスポートする方法
例)
ユーザー名:testuser
ホスト名:fugafuga
パスワード:hogehoge
DB:test_db
テーブル名:test_table
mysqldump
mysqldumpでのエクスポート
# tsvでのエクスポート
$ mysqldump -utestuser -hfugafuga -phogehoge --tab=/tmp test_db test_table > ./output/mysqldump_output.tsv
# csvでのエクスポート
$ mysqldump -utestuser -hfugafuga -phogehoge --tab=/tmp --fields-terminated-by=, test_db test_table > ./output/mysqldump_output.csv
# whereで指定したい場合
$ mysqldump -utestuser -hfugafuga -phogehoge --tab=/tmp test_db test_table --where 'userid >= 50' > ./output/mysqldump_output.tsv
参考)mysqldumpまとめ
参考)MySQLのデータをcsv,tsv形式でダンプする
mysqlコマンド
mysqlコマンドでのエクスポート
# tsvでのエクスポート
mysql -utestuser -hfugafuga -phogehoge -D test_db -e "SELECT * from test_table;" > ./output/mysql_output.tsv
# csvでのエクスポート
mysql -utestuser -hfugafuga -phogehoge -D test_db -e "SELECT * from test_table;" | sed -e 's/\t/,/g' > ./output/mysql_output.csv
SELECT INTO OUTFILE
こちらはRDSに入ってからのコマンドになります。
SELECT INTO OUTFILEでのエクスポート
-- csvエクスポート
SELECT * FROM test_table
INTO OUTFILE './output/select_into_outfile_output.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"';
-- tsvエクスポート
SELECT * FROM test_table
INTO OUTFILE './output/select_into_outfile_output.tsv'
FIELDS TERMINATED BY '\t';
上記の何かしらのやり方でファイルを出力した後、S3へ
S3へエクスポート
$ gzip output.tsv
$ aws s3 cp ./output.tsv.gz s3://hogehoge/yyyymm=202206/
直でS3へエクスポートする方法
RDSのスナップショット→parquet形式でエクスポート
こちらの大変丁寧に書かれてある記事を参考にすれば、S3へ直でエクスポートすることができます。
(サボってすみません)
parquet形式でエクスポートできるのですが、csvなどのファイル形式よりもデータスキャン量が圧倒的に少ないのでおすすめです。
おわりに
調べてみると意外と方法があるのだなぁと実感しました。
書かないと忘れるので、自分の備忘録として書いたつもりではおりますが、
どなたかの役に立てば幸いです。