pgAgent 不会在数据库恢复后启动

pgAgent won't launch after a database restore

我已经在我们的 PostgreSQL 数据库中安装了 pgAgent 来安排我们的工作,这真的很有魅力!

但是,在我从测试服务器中的数据库恢复备份后,pgAgent 根本无法启动。有趣的是,pgAgent 似乎忽略了此日志表中数据的当前状态,并试图从零开始填充它们。

在日志文件中查看错误消息:

postgres@postgres ERROR:  duplicate key value violates unique constraint "pga_jobsteplog_pkey"
postgres@postgres DETAIL:  Key (jslid)=(1) already exists.
postgres@postgres STATEMENT: INSERT INTO pgagent.pga_jobsteplog(jslid, jsljlgid, jsljstid, jslstatus) SELECT 1, 25, 3, 'r'  FROM pgagent.pga_jobstep WHERE jstid=3

如果您想知道如何执行备份:

pg_dumpall --file "/media/jones/Daten/fulldump.sql" --host "address-to-my-server.de" --port "5432" --username "myuser" --no-password --database "mydb" --clean --if-exists --verbose

环境:

Ubuntu 16.04
PostgreSQL 9.5
pgAgent 3.4.1-2

有什么想法可以让 pgAgent 复活吗?

我对这个解决方案绝对不满意,但这是迄今为止我唯一能解决的问题。

截断日志 table 可以解决问题,但会删除您拥有的所有作业历史记录(对大多数用例来说没什么大不了的):

TRUNCATE TABLE pgagent.pga_jobsteplog;

或手动更新序列,例如:

SELECT SETVAL('pgagent.pga_exception_jexid_seq', max(jexid)) FROM pgagent.pga_exception;
SELECT SETVAL('pgagent.pga_job_jobid_seq', max(jobid)) FROM pgagent.pga_job;
SELECT SETVAL('pgagent.pga_jobclass_jclid_seq', max(jclid)) FROM pgagent.pga_jobclass;
SELECT SETVAL('pgagent.pga_joblog_jlgid_seq', max(jlgid)) FROM pgagent.pga_joblog;
SELECT SETVAL('pgagent.pga_jobstep_jstid_seq', max(jstid)) FROM pgagent.pga_jobstep;
SELECT SETVAL('pgagent.pga_jobsteplog_jslid_seq', max(jslid)) FROM pgagent.pga_jobsteplog;
SELECT SETVAL('pgagent.pga_schedule_jscid_seq', max(jscid)) FROM pgagent.pga_schedule;

如果谁有更优雅的解决方案,请在评论中告诉我。

如果有人还在寻找,我已经找到了在这种情况下有效的方法..

登录数据库,安装pgagent扩展 执行 pgagent 模式的 pg_restore 然后在架构的其余部分恢复后恢复 pgagent.pga_jobsteplog。 然后将每个 table 的序列值重置为比序列所基于的列的最大值高 1

这样做,意味着您的 pgagent 正在工作,并且您还有作业和作业步骤日志。