HYLOGICS

今後は各分室にコンテンツを移して、ここは雑記や暮らしを中心としたライフログ的な何かにしていく予定です。

【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を実施してタイムアウトしても何度か再実行を繰り返すことで処理時間が短くなった結果タイムアウトしなくなるケースがある。