【Postgresql】VACUUMがタイムアウトで異常終了した時の原因と対策
事象
VACUUM実行時、タイムアウトで異常終了する。
その際、以下のようなメッセージが出力される。
# vacuumdb -a -z -U postgres vacuumdb: vacuuming database "TEST-DB" vacuumdb: vacuuming of database "TEST-DB" failed: ERROR: canceling statement due to statement timeout
原因
statement_timeout
が設定されており、かつ特定のDBに対するVACUUMの所要時間がstatement_timeout
の値を超過した。
対応
statement_timeout
の値の見直しもしくは無効化。
(なお、statement_timeout
はデフォルトでは無効)
補足事項
vacuumdb -a
で全DBに対してVACUUMを実施してもあくまで1つのDBに対するVACUUMで1ステートメント扱いらしく、vacuumdb -a
の開始から終了までの時間がstatement_timeout
を超過してもどれか1つのDBに対するVACUUMの所要時間がstatement_timeout
を超過しない限りタイムアウトとはならない。
また、タイムアウトで異常終了してもその時点までの処理は実施されているため、肥大化したDBに対してVACUUMを実施してタイムアウトしても何度か再実行を繰り返すことで処理時間が短くなった結果タイムアウトしなくなるケースがある。