我想定期调用存储过程。在Oracle上,我将为此创建工作。我发现Postgresql可以通过使用外部工具(cron等)和PgAgent很好地做到这一点。

您知道不涉及外部工具的“内部”替代方法吗? >

我想避免存储在pgAgent命令行上的密码带来的安全问题。 >
Postgresql 8.3Linux RedHat 64位

评论

您能补充为什么不能使用pgAgent或crontab吗?特别是缺少哪些功能。.

@Rohan我已经更新了我的问题

帖子似乎已被复制并粘贴到stackoverflow.com/q/16958625/398670

#1 楼

即使您正在运行即将发布的(在撰写本文时)PostgreSQL 10或当前的PostgreSQL 9.6,而不是像8.3这样的古老版本,仍然没有内置的任务计划程序。诸如PgAgent或外部cron作业之类的东西是必需的,没有方便的解决方法。

9.3中引入的后台工作程序功能有望允许将PgAgent之类的工具在以后的版本中移入PostgreSQL核心,但是还没有完成。甚至在9.3上,您仍然必须运行cron或pgagent。但是从PostgreSQL 10开始,质量仍然不高,调度程序被广泛采用,并且大多数人使用cron / ms任务调度程序/等。您正在运行一个过时且不受支持的版本。

评论


请查看版本政策,不可以升级Postgresql。

–史蒂芬(Stephan)
2013年6月6日9:53

@Alex您将不得不在某个时候进行升级,而且只会变得越来越难。顺便说一下,什么是8.3点释放?您缺少多少个重要的错误修复?还是您至少在8.3.23上?就是说,正如我所解释的,即使在即将发布的9.3版本中,您所需的功能也不存在,尽管已添加了一些允许添加该功能的基础。

–克雷格·林格(Craig Ringer)
2013年6月6日9:55



我要和老板谈谈:)

–史蒂芬(Stephan)
2013年6月6日上午9:58

@Alex好主意:-)。至少紧急更新至8.3.23,然后开始着手计划升级到较新的版本。它不会解决这个问题,但是,这是一个减轻未来痛苦的好主意。我支持的客户数量之多,即使他们保持最新状态,也从未有过。我们不只是为了踢球而发布新版本;-)。阅读每个.0版本的发行说明,以获取有关可能需要处理的事项的指导,并阅读升级手册。您唯一可能的痛点是standard_conforming_strings和bytea_output。

–克雷格·林格(Craig Ringer)
2013年6月6日10:01



克雷格,您如何看待pg_cron?

–mehmet
18 Mar 26 '18在22:43

#2 楼

从PostgreSQL 9.5开始,您可以使用pg_cron扩展名,该扩展名作为共享库加载到PostgreSQL中。

完成设置后,创建作业非常简单:

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


这将根据指定的cron计划运行delete命令。您还可以使用@reboot在服务器重新启动时安排作业,如果升级热备用服务器,pg_cron将自动启动正在运行的作业。 pg_hba.conf中的用户。

#3 楼

您真的非常不想这样做。 Postgres不是操作系统,而是数据库服务器。即使数据库支持运行计划的任务,也不是要这样滥用数据库。

如果您担心的是您不想设置密码和设置,那很容易解决。相反,使用信任或身份验证来建立本地Unix套接字连接,以该用户身份运行cronjob。 ,并且通常已经预先配置了该系统用户,因此在通过本地unix套接字连接时,它可以使用信任身份验证连接到本地服务器。如果您不希望存储过程以超级用户权限运行,则可以以postgres系统用户身份运行cronjob,连接到本地套接字,然后切换角色。

在默认设置中,您只需为此:

$ sudo -u postgres crontab -e


在编辑器中,如下所示添加到crontab条目中:在您的/path/to/run_stored_procedure.sh文件中,您只需使用psql来调用存储过程

0    0    *     *    * bash /path/to/run_stored_procedure.sh


评论


“像这样滥用数据库并不是一个好主意。”为什么您认为这是滥用?不同的主流RDBMS倾向于采用相似的方法,但我认为它并不那么糟糕。另外,如果您无权访问操作系统,那么使用crontab会很容易。

– dezso
19年1月10日在11:44