Embulkを使ってOracleからデータをTSVでダンプする
利用しているOracle(sqlplus)のバージョンによっては、抜き出す機能もありそうなのだが、自分の環境では利用できなかったので、Embulkを利用した。
TSV出力
以下のようなファイルを作成し、環境変数で必要なデータを渡してembulk run exporter.yml.liquid
すると、指定のディレクトリ配下(/exporter/{{ env.EXPORT_DATE }}
)に出力される。
in:
type: oracle
driver_path: {{ env.DB_DRIVER_PATH }}
driver_class: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@{{ env.DB_THIN }}
user: {{ env.DB_USER }}
password: {{ env.DB_PASSWORD }}
query: |
SELECT *
FROM {{ env.SCHEMA }}.{{ env.TABLE }}
out:
type: file
path_prefix: /exporter/{{ env.EXPORT_DATE }}/{{ env.TABLE }}-
file_ext: tsv
formatter:
type: csv
delimiter: "\t"
quote_policy: ALL
newline: LF
gzipで出力
gzipで出力する場合は、encodersの設定を入れつつ、拡張子を繋げる。
out:
type: file
path_prefix: /exporter/{{ env.EXPORT_DATE }}/{{ env.TABLE }}-
file_ext: tsv.gz
formatter:
type: csv
delimiter: "\t"
quote_policy: ALL
newline: LF
encoders:
- {type: gzip, level: 6}
出力先をS3に
出力をS3にする場合は、embulk-output-s3プラグインを利用して、以下のように記述する。
out:
type: s3
path_prefix: {{ env.DIR_PATH }}/{{ env.TABLE }}-
file_ext: .tsv.gz
sequence_format: "%03d.%02d"
bucket: 出力先バケット名
endpoint: s3-ap-northeast-1.amazonaws.com
formatter:
type: csv
delimiter: "\t"
quote_policy: ALL
newline: LF
encoders:
- {type: gzip, level: 6}
S3プラグインはfile_extとsequence_formatに設定した値の解釈が、fileプラグインと挙動が違うため、合わせるにはこのようにする必要があった。
失敗談
最初は以下のようにurl側でスキーマを指定し、tableとselectを利用して指定していたが、うまくいかず上記の方法に変更している。
in:
type: jdbc
driver_path: {{ env.DB_DRIVER_PATH }}
driver_class: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:{{ env.SCHEMA }}
user: {{env.DB_USER}}
password: {{env.DB_PASSWORD}}
table: error_message
select: "*"
今思い返すと、自分の環境ではthinをDESCRIPTIONを使って細かく指定しなければいけなかったので、
CONNECT_DATAのINSTANCE_NAMEにスキーマを渡すように書けば、うまくいっていたかもしれない。
そして悪戦苦闘の結果、exporter.yml.liquid
ではinのtypeをoracle
にしているが、使っているのは実質jdbcプラグインの項目なので、jdbc
にしても大丈夫なはず。