Ich möchte regelmäßig eine gespeicherte Prozedur aufrufen. Auf Oracle würde ich dafür einen Job anlegen. Ich habe festgestellt, dass Postgresql dies gut imitieren kann, indem es ein externes Tool (cron usw.) und PgAgent verwendet.
Kennen Sie eine "interne" Alternative, bei der das externe Tool nicht zum Einsatz kommt?
- Ich möchte Sicherheitsbedenken in Bezug auf das in der Befehlszeile des pgAgent gespeicherte Kennwort vermeiden.
- Ich möchte jegliche zusätzliche Systemkonfiguration zum Ausblenden des Passworts vermeiden (
~/.pgpass
).
Postgresql 8.3
Linux RedHat 64bit
postgresql
jobs
scheduled-tasks
Stephan
quelle
quelle
Antworten:
Selbst wenn Sie die (zum Zeitpunkt des Schreibens) bevorstehende Veröffentlichung von PostgreSQL 10 oder die aktuelle Veröffentlichung von PostgreSQL 9.6 ausgeführt haben, die keine frühere Veröffentlichung wie 8.3 ist, gibt es noch keinen integrierten Aufgabenplaner.
So etwas wie PgAgent oder externe Cron-Jobs sind erforderlich. Es gibt keine praktische Umgehung.
Die in 9.3 eingeführte Hintergrund-Worker-Funktion sollte hoffentlich ermöglichen, dass ein Tool wie PgAgent in einer späteren Version in den PostgreSQL-Kern verschoben wird, dies ist jedoch noch nicht geschehen. Sogar auf 9.3 müssen Sie noch cron oder pgagent ausführen.
Ein paar Leute arbeiten an Schedulern, die auf Hintergrundarbeitern basieren, und es gibt einige Patches, die Funktionen bereitstellen sollten, die dabei helfen. Ab PostgreSQL 10 gibt es jedoch immer noch keine gute, weit verbreitete Scheduler-Qualität, und die meisten Leute verwenden cron / ms task scheduler / etc.
Bitte beachten Sie auch die Versionsrichtlinien . Sie führen eine veraltete und nicht unterstützte Version aus.
quelle
Please take a look at the version policy
, ein Upgrade von Postgresql ist keine Option.standard_conforming_strings
undbytea_output
.Ab PostgreSQL 9.5 können Sie die Erweiterung pg_cron verwenden , die als gemeinsam genutzte Bibliothek in PostgreSQL geladen wird.
Nach dem Einrichten ist das Erstellen eines Jobs ziemlich einfach:
Dadurch wird der Löschbefehl gemäß dem angegebenen Cron-Zeitplan ausgeführt. Sie können mit auch
@reboot
einen Job planen, wenn der Server neu gestartet wird, und pg_cron startet automatisch die Ausführung von Jobs, wenn Sie einen Hot-Standby-Modus aktivieren.Anstatt .pgpass zu verwenden, können Sie in pg_hba.conf localhost-Zugriff für den cron-Benutzer bereitstellen.
quelle
Das willst du wirklich, wirklich nicht. Postgres ist kein Betriebssystem, sondern ein Datenbankserver. Selbst wenn die Datenbank das Ausführen von geplanten Aufgaben unterstützt, ist es keine gute Idee, die Datenbank auf diese Weise zu missbrauchen.
Wenn Sie kein Passwort und keine weiteren Informationen einrichten möchten, ist dies leicht zu beheben. Richten Sie stattdessen eine lokale Unix-Socket-Verbindung mit Trust- oder Ident-Authentifizierung ein und führen Sie Ihren Cronjob als dieser Benutzer aus.
In der Standardkonfiguration richtet postgres den Systembenutzer normalerweise so ein, dass er den Datenbankserver ausführt.
postgres
Dieser Systembenutzer ist normalerweise bereits vorkonfiguriert, sodass er bei der Verbindung über einen lokalen Unix-Socket eine Verbindung zum lokalen Server mithilfe der Vertrauensauthentifizierung herstellen kann. Sie können Ihren Cronjob als Postgres-Systembenutzer ausführen, eine Verbindung zum lokalen Socket herstellen und dann die Rolle wechseln, wenn Ihre gespeicherte Prozedur nicht mit Superuser-Berechtigungen ausgeführt werden soll.In der Standardeinstellung können Sie dies einfach tun:
Fügen Sie im Editor den Eintrag crontab wie folgt hinzu:
und in deiner /path/to/run_stored_procedure.sh Datei benutzt du einfach psql um deine store Prozedur aufzurufen
quelle