embulk-input-postgresql を用いたデータ吸い出しを行うときに ERROR: canceling statement due to statement timeout
というエラーが発生することがあります。
org.embulk.exec.PartialExecutionException: java.lang.RuntimeException: org.postgresql.util.PSQLException: ERROR: canceling statement due to statement timeout
at org.embulk.exec.BulkLoader$LoaderState.buildPartialExecuteException(BulkLoader.java:340)
psqlにて再現してみましょう。embulk経由と同様に、1分経ったところでクエリが中断されました。
何らかのサーバ側のタイムアウト処理で止められています。
> psql
psql (10.14 (Ubuntu 10.14-0ubuntu0.18.04.1), server 11.1)
WARNING: psql major version 10, server major version 11.
Some psql features might not work.
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
test_server=> SELECT
test_server-> ...snip...
test_server-> FROM
test_server-> foo_bar
test_server-> WHERE
test_server-> ...何か重たいクエリ...
ERROR: canceling statement due to statement timeout
statement_timeout の値を見てみましょう。やはり、1分でした。15分に今回は伸ばしてみます。
マイクロ秒で指定すると読みづらいので、文字列で指定すると楽です。
test_server=> SHOW statement_timeout;
statement_timeout
-------------------
1min
(1 row)
test_server=> SET statement_timeout to '15min';
SET
test_server=> SHOW statement_timeout;
statement_timeout
-------------------
15min
(1 row)
この設定はembulkには次のように記述します。
before_selectを使うことで、SELECT句と同じトランザクションで実行されます。
in:
type: postgresql
host: {{ env.DB_HOST }}
user: {{ env.DB_USER }}
password: {{ env.DB_PASSWORD }}
ssl: true
database: {{ env.DB_DATABASE }}
default_timezone: UTC
query: |
SELECT
...
before_select: SET statement_timeout to '15min';
私の場合はリードレプリカにてこの現象を見ました。
何かお役に立てると幸いです。