web-dev-qa-db-ja.com

外部のcronのようなツールなしでPostgresqlで繰り返しタスクを実行する方法は?

定期的にストアドプロシージャを呼び出したいのですが。 Oracleでは、このためのジョブを作成します。 Postgresqlが外部ツール(cronなど)とPgAgentを使用することでこれをうまく模倣できることを発見しました。

外部ツールを使用しない「内部」代替手段を知っていますか?

  • PgAgentのコマンドラインに保存されているパスワードによるセキュリティ上の問題を回避したいと思います。
  • パスワードを隠すための追加のシステム構成(~/.pgpass)。

Postgresql 8.
Linux RedHat 64ビット

43
Stephan

(執筆時点で)間もなくリリースされるPostgreSQL 10または現在のPostgreSQL 9.6(8.3のような古いリリースではない)を実行していたとしても、組み込みのタスクスケジューラはまだありません。

PgAgentや外部cronジョブなどが必要ですが、便利な回避策はありません。

9.3で導入されたバックグラウンドワーカー機能により、PgAgentのようなツールを後のリリースでPostgreSQLコアに移動できるようになるはずですが、まだ実行されていません。 9.3でも、cronまたはpgagentを実行する必要があります。

数人がバックグラウンドワーカーベースのスケジューラで作業しており、それを支援する機能を提供するパッチがいくつか来ています。しかし、PostgreSQL 10の時点では、まだ広く採用されている高品質のスケジューラはなく、ほとんどの人がcron/msタスクスケジューラ/などを使用しています。

バージョンポリシー もご覧ください。あなたは時代遅れでサポートされていないリリースを実行しています。

31
Craig Ringer

PostgreSQL 9.5以降では、 pg_cron 拡張機能を使用できます。これは、共有ライブラリとしてPostgreSQLにロードされます。

設定後、ジョブの作成は非常に簡単です。

SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);

これにより、指定したcronスケジュールに従って削除コマンドが実行されます。 @rebootを使用して、サーバーの再起動時にジョブをスケジュールすることもできます。ホットスタンバイを昇格すると、pg_cronは自動的にジョブの実行を開始します。

.pgpassを使用する代わりに、pg_hba.confでcronユーザーにlocalhostアクセスを提供できます。

22
Marco Slot