Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql pgAgent赢得';在数据库还原后,无法启动_Postgresql_Pg Dump_Pgagent - Fatal编程技术网

Postgresql pgAgent赢得';在数据库还原后,无法启动

Postgresql pgAgent赢得';在数据库还原后,无法启动,postgresql,pg-dump,pgagent,Postgresql,Pg Dump,Pgagent,我已经在我们的PostgreSQL数据库中安装了pgAgent,用于安排我们的作业,这真是一种魅力 然而,在我从测试服务器中的数据库恢复了备份之后,pgAgent就不会启动了。有趣的是,pgAgent似乎忽略了此日志表中数据的当前状态,并尝试从零开始填充它们 请参阅日志文件中的错误消息: postgres@postgres ERROR: duplicate key value violates unique constraint "pga_jobsteplog_pkey" postgres@p

我已经在我们的
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复活

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

截断日志表可以做到这一点,但会删除您拥有的所有作业历史记录(对于大多数用例来说没什么大不了的):

或手动更新序列,例如:

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;

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

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

截断日志表可以做到这一点,但会删除您拥有的所有作业历史记录(对于大多数用例来说没什么大不了的):

或手动更新序列,例如:

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扩展 执行pg代理架构的pg_还原 然后在架构的其余部分恢复后恢复pgagent.pga_作业步骤日志。 然后将每个表的序列值重置为高于序列所基于的列的最大值1


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

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

登录数据库,安装pgagent扩展 执行pg代理架构的pg_还原 然后在架构的其余部分恢复后恢复pgagent.pga_作业步骤日志。 然后将每个表的序列值重置为高于序列所基于的列的最大值1


执行此操作意味着您的pgagent正在工作,并且您还有作业和作业步骤日志。

您可以从pgagent架构备份数据,截断表,启动pgagent,让它以任何方式填充它们,再次截断并恢复备份的数据。不知道为什么会这样。谢谢你的评论!截断表格最终会奏效,但就业历史对我们来说也很重要:-(我希望找到一个不那么激烈的解决方案。但你是对的……如果一切都不顺利,我就没有其他选择了。谢谢!@JimJones你能看到这个问题吗?我已经创建了pgagent作业。你能告诉我这有什么错吗?你可以从pgagent架构备份数据,截断表,启动pgagent,让它用它想要的任何东西填充它们吗ts,再次截断并还原备份的数据。不确定为什么会这样做。谢谢您的评论!截断表最终会奏效,但作业历史记录对我们也很重要:-(我希望找到一个不那么激烈的解决方案。但你是对的……如果一切都不顺利,我就没有其他选择了。谢谢!@JimJones你能看到这个问题吗?我已经创造了pgagent工作。你能告诉我这有什么错吗。