我想定期调用一个存储过程。在 Oracle 上,我会为此创建一个工作。我发现 Postgresql 可以通过使用外部工具(cron 等)和 PgAgent 很好地模仿这一点。
您知道不涉及外部工具的“内部”替代方案吗?
- 我想避免存储在 pgAgent 命令行中的密码的安全问题。
- 我想避免任何额外的系统配置来隐藏密码(
~/.pgpass
)。
Postgresql 8.3
Linux RedHat 64 位
我想定期调用一个存储过程。在 Oracle 上,我会为此创建一个工作。我发现 Postgresql 可以通过使用外部工具(cron 等)和 PgAgent 很好地模仿这一点。
您知道不涉及外部工具的“内部”替代方案吗?
~/.pgpass
)。Postgresql 8.3
Linux RedHat 64 位
从 PostgreSQL 9.5 开始,您可以使用pg_cron扩展,它作为共享库加载到 PostgreSQL 中。
设置完成后,创建作业非常简单:
这将根据指定的 cron 计划运行删除命令。您还可以
@reboot
在服务器重新启动时安排作业,如果您提升热备用,pg_cron 将自动开始运行作业。您可以在 pg_hba.conf 中为 cron 用户提供 localhost 访问权限,而不是使用 .pgpass。
即使您正在运行即将发布(在撰写本文时)的 PostgreSQL 10 或当前的 PostgreSQL 9.6,而不是像 8.3 这样的古老版本,仍然没有内置的任务调度程序。
需要 PgAgent 或外部 cron 作业之类的东西,没有方便的解决方法。
9.3 中引入的后台工作人员功能有望在以后的版本中允许将 PgAgent 之类的工具移入 PostgreSQL 核心,但尚未完成。即使在 9.3 上,您仍然必须运行 cron 或 pgagent。
一些人正在研究基于后台工作人员的调度程序,并且即将发布一些补丁程序,这些补丁程序应该提供帮助解决此问题的工具。但是从 PostgreSQL 10 开始,仍然没有质量好、被广泛采用的调度器,而且大多数人使用 cron / ms 任务调度器 / 等。
也请看一下版本政策;您正在运行一个过时且不受支持的版本。
你真的,真的不想这样做。Postgres 不是一个操作系统,它是一个数据库服务器。即使数据库支持运行计划任务,像这样滥用数据库也不是一个好主意。
如果您担心不想设置密码和其他东西,那很容易解决。改为使用信任或身份验证设置本地 Unix 套接字连接,以该用户身份运行您的 cronjob。
在其开箱即用的配置中,通常 postgres 设置系统用户
postgres
来运行 db 服务器,并且该系统用户通常已经预先配置,因此它可以在通过本地 unix 套接字连接时使用信任身份验证连接到本地服务器。您可以以 postgres 系统用户身份运行您的 cronjob,连接到本地套接字,然后如果您不希望您的存储过程以超级用户权限运行,则切换角色。在默认设置中,您可以这样做:
在编辑器中,像这样添加到 crontab 条目:
在您的 /path/to/run_stored_procedure.sh 文件中,您只需使用 psql 调用您的存储过程
TimescaleDB 是处理时间序列数据的 Postgres 的扩展——它有动作/作业——可能对某些人有用。
https://docs.timescale.com/timescaledb/latest/how-to-guides/user-defined-actions