1

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

但是,在我从测试服务器中的数据库恢复备份后,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 起死回生?

4

2 回答 2

0

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

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

这样做,意味着你 pgagent 工作,你也有你的工作和工作步骤日志。

于 2020-10-23T17:17:11.183 回答
0

我对这个解决方案绝对不满意,但到目前为止我只能解决这些问题。

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

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;

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

于 2017-04-25T12:45:34.100 回答