MySQL のテーブルのデータを CSV に出力
MySQL のテーブルのデータを CSV に出力
RDS のデータを BigQuery にインポートしている。
RDSのデータをリストアRDSのデータをCSVで出力GCSにCSVをアップロードbq loadコマンドを利用してBigQueryにインポート
今回やること
MySQL のデータを BigQuery に入れられるように整形して、CSV で出力する。
注意点
MySQL の接続先に合わせて、CSV の出力先を変更する。
CSV 生成時の MySQL の接続先が、2 種類ある。
Amazon Aurora MySQL:RDSのAmazon Aurora MySQLに本番データをリストアしているMySQL Server: 本番データのdumpファイルを、MySQLにインポートしている
両方とも同じスクリプトでインポートを実行したい。
仕様
Amazon Aurora MySQL に接続している場合
INTO OUTFILE S3で、S3にCSVをアップロード
S3 に CSV をアップロードしている理由
INTO OUTFILEで、CSVを生成できないmysql -u ${USERNAME} -p${DB_PASSWORD} -h ${RDS_HOST_NAME} -P ${DB_PORT} > output.csvで、CSVを衛生できるが、BigQueryにインポートできる形式にエスケープするのが難しい
$ ./output_csv.sh "mysql -u ${USERNAME} -p${DB_PASSWORD}" $DATASET_NAME $TABLE_NAME
Amazon Aurora MySQL に接続していない場合
/tmp/tablesにCSVを生成
$ ./output_csv.sh "mysql -u ${USERNAME} -p${DB_PASSWORD} -h ${RDS_HOST_NAME} -P ${DB_PORT}" $DATASET_NAME $TABLE_NAME
実装
output_csv.sh
#!/bin/bash -xe
MYSQL=$1
DATASET_NAME=$2
TABLE_NAME=$3
AURORA_VERSION=$($MYSQL -N -B -e 'select @@aurora_version' 2> /dev/null || echo "null")
# Amazon Aurora MySQL に接続しているか判別
if [[ "${AURORA_VERSION}" != "null" ]]; then
# Amazon Aurora MySQL に接続している場合は、S3 に CSV をアップロード
INTO_OUTFILE="INTO OUTFILE S3"
DIRECTORY_NAME="s3:/project_name/tables"
else
# Amazon Aurora MySQL に接続していない場合は、/tmp/tables に CSV を生成
INTO_OUTFILE="INTO OUTFILE"
DIRECTORY_NAME="/tmp/tables"
fi
cat ./sql/output_csv.template.sql | \
DATASET_NAME=$DATASET_NAME TABLE_NAME=$TABLE_NAME COLUMNS=$columns \
INTO_OUTFILE=$INTO_OUTFILE DIRECTORY_NAME=$DIRECTORY_NAME envsubst | $MYSQL
output_csv.template.sql
SET SESSION group_concat_max_len = 1000000;
SELECT *
FROM ${DATASET_NAME}.${TABLE_NAME}
${INTO_OUTFILE} "${DIRECTORY_NAME}/${DATASET_NAME}_${TABLE_NAME}.csv"
FIELDS
TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES
TERMINATED BY '\n';
