PostgreSQLのバージョン:

old_snapshot_threshold

スナップショットが使用されるときに、snapshot too oldエラーを引き起こす危険性なしにスナップショットを利用できる最小時間を設定します。このパラメータはサーバ起動時にのみ設定できます。

この制限値を越えると、古いデータはバキュームされます。これにより、長い間残っていたスナップショットによりデータが溢れてしまうのを防ぐことができます。スナップショットから見えるデータが消えることによる不正な結果を防ぐため、スナップショットがこの制限値よりも古く、かつこのスナップショットが作られた以降に変更されたページを読むためにスナップショットが使用されるときはエラーが発生します。

-1を設定するとこの機能が無効になります。これがデフォルトです。実際の環境でのおすすめの値はおそらく数時間から2, 3日の間となるでしょう。設定値は、分の粒度に書き換えられます。小さな値(たとえば01min)は、テストの際に有用だということで許可されています。60dのような大きな値の設定もできますが、多くのワークロードにおいて、大きなデータ溢れやトランザクションIDの周回がそれよりはずっと短い期間で起こる可能性があることに注意してください。

この機能が有効であると、リレーションの終端部にあるフリースペースはオペレーティングシステムには返却されません。そうしないと、snapshot too oldの条件の検出に必要な情報を削除してしまうことになるからです。明示的に解放されない限り(たとえばVACUUM FULLによって)、リレーションに割り当てられた領域は、そのリレーションの中での再利用に限定して紐付けられます。

この設定は、どのような状況でもエラーが検出されることを保証するものではありません。(たとえば)マテリアライズされた結果集合を持つカーソルから正しい結果を得ることができるのであれば、たとえ参照している元のテーブルからVACUUMによって行が削除されたとしてもエラーにはなりません。ある種のテーブルでは、早期にVACUUMできないので、この設定の影響を受けません。例としては、システムカタログが挙げられます。このようなテーブルにおいては、この設定によってデータ溢れを防ぐことも、スキャンの際にsnapshot too oldエラーを起こす可能性を作り出すこともできません。

推奨事項 [EN]

… or the length of the longest transaction you expect to run + 1 hour.

件のコメント