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 正在工作,并且您还有作业和作业步骤日志。
我已经在我们的 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 正在工作,并且您还有作业和作业步骤日志。