dspace 5.2上的内部系统错误

时间:2016-07-29 06:14:25

标签: rdbms postgresql-9.3 dspace

我在执行元数据导入时遇到内部系统错误。现在,即使我无法创建新集合或编辑现有项目。

请查看错误日志: 第一个错误

2016-07-29 10:02:41,878 ERROR org.dspace.storage.rdbms.DatabaseManager @ SQL create Error -
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "webapp_pkey"
  Detail: Key (webapp_id)=(12) already exists.
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.dspace.storage.rdbms.DatabaseManager.doInsertPostgres(DatabaseManager.java:1743)
    at org.dspace.storage.rdbms.DatabaseManager.insert(DatabaseManager.java:711)
    at org.dspace.storage.rdbms.DatabaseManager.create(DatabaseManager.java:476)
    at org.dspace.app.util.AbstractDSpaceWebapp.register(AbstractDSpaceWebapp.java:80)
    at org.dspace.app.util.DSpaceContextListener.contextInitialized(DSpaceContextListener.java:128)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5027)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5525)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

第二次错误

2016-07-29 10:30:52,482 WARN  org.dspace.app.webui.servlet.DSpaceServlet @ dspace@localhost:session_id=C7C8E09E87658CA1D659C4C0C5255EB0:ip_addr=0:0:0:0:0:0:0:1:database_error:org.postgresql.util.PSQLException\colon; ERROR\colon; duplicate key value violates unique constraint "metadatavalue_pkey"
  Detail\colon; Key (metadata_value_id)=(125069) already exists.
org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "metadatavalue_pkey"
  Detail: Key (metadata_value_id)=(125069) already exists.
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at org.dspace.storage.rdbms.DatabaseManager.doInsertPostgres(DatabaseManager.java:1743)
    at org.dspace.storage.rdbms.DatabaseManager.insert(DatabaseManager.java:711)
    at org.dspace.content.MetadataValue.create(MetadataValue.java:293)
    at org.dspace.content.DSpaceObject.updateMetadata(DSpaceObject.java:256)
    at org.dspace.content.Bitstream.update(Bitstream.java:502)
    at org.dspace.app.webui.servlet.admin.EditItemServlet.processUpdateItem(EditItemServlet.java:752)
    at org.dspace.app.webui.servlet.admin.EditItemServlet.doDSPost(EditItemServlet.java:231)
    at org.dspace.app.webui.servlet.DSpaceServlet.processRequest(DSpaceServlet.java:115)
    at org.dspace.app.webui.servlet.DSpaceServlet.doPost(DSpaceServlet.java:73)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.dspace.app.webui.filter.RegisteredOnlyFilter.doFilter(RegisteredOnlyFilter.java:66)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.dspace.utils.servlet.DSpaceWebappServletFilter.doFilter(DSpaceWebappServletFilter.java:78)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

1 个答案:

答案 0 :(得分:1)

错误来自

错误是因为您违反了对表格设置的限制。每个条目都需要一个唯一的密钥,似乎不再是这种情况了。密钥由序列生成,因此,如果您可以访问数据库,则可以重置序列并解决问题。

您可以采取一些步骤来解决此问题。我假设这是实际错误,你没有任何奇怪的修改打破这个。但是,你很快就会发现,如果这并没有解决你的问题,那么就会以糟糕的方式搞乱数据库。

这两个错误都有这个起源。下面我将介绍如何解决它们。 update-sequences.sql脚本应该通过一次运行来修复它们。手动方式将要求您执行两次。一次用于metadatavalue表,一次用于webapp表。 (metadatavalue_seqwebapp_seq)。

在示例中,我只使用了metadatavalue表。

使用update-sequences.sql脚本

我可以通过两种方式思考,第一种方法是运行update-sequences下可以找到的org.postgresql.util.PSQLException: ERROR: duplicate key脚本。这个脚本将执行与我在下面描述的相同的事情(或多或少,相同的结果)。

请注意,OP正在使用POSTGRES数据库,因此如果您正在阅读此OP,只需运行postgres部分,如果您想手动执行,请不要运行ORACLE部分。您可以从堆栈跟踪中看到您在postgres数据库select metadata_value_id from metadatavalue order by metadata_value_id desc;; - )

手动(postgres)

首先,连接数据库。您可以使用 pgAdmin 或仅使用命令行 psql 进行连接。

1)检查元数据值表

中最后输入的键

metadatavalue_seq

这将返回表中的最高ID。让我们说它是475.只需在某处涂抹它。

2)检查序列

下一个案例我们要查看metadatavalue,这是负责生成select last_value from metadatavalue_seq表中使用的ID的序列。

postgres

现在看一下这会返回什么。如果这与您之前找到的ID匹配(在此示例中为475),那么序列实际上一切正常,您的错误来自其他地方。假设返回的ID低于475,例如301.现在,序列给出的下一个ID可能已被medatavalue表中的另一个条目使用,从而导致抛出异常。

3)修复序列

我们可以手动将last_value设置为其他值。幸运的是,你正在使用select setval('metadatavalue_seq',(newvalue),true);而不是oracle,它在oracle中更加麻烦。

select setval('metadatavalue_seq', 475, true);

这会将metadatavalue_seq的当前值设置为您指定的新值。请记住,在我们的例子中,最后一个值实际是475,而序列返回301.所以要解决这个问题,我们要将序列设置为475(因为当它调用nextval时,它将返回476)。

violation of constraint 'sys_c006541'

手动(oracle)

修复背后的想法对于oracle数据库和postgres数据库是一样的,但是所需的命令略有不同。当它抛出错误消息时,Oracle似乎更加神秘,因此您会收到类似user_constraints之类的错误。这意味着还有一个步骤可以确定错误的来源。

1)找到约束的原点

要找出实际违反的约束,您可以在select * from user_constraints where constraint_name = "SYS_c00654"中查找约束。

metdatavalue

让我们想象这个约束告诉我们违反的约束与OP有关(select metadatavalue_id from metadatavalue order by metadatavalue_id desc;表中的主键)。

2)检查metadatavalue_table

中最后输入的密钥

这与我们为postgres所做的相同,我们将检查表中的最高ID。该部分的查询实际上看起来是一样的。

select metadatavalue_seq.nextval from dual;

再次想象一下,这会返回475.

3)检查序列

对于拥有postgres数据库的人来说,这部分略有不同。要检查序列中的最后一个值,我们可以运行。

drop sequence metadatavalue_seq;

同样,我们想象这会返回301.

4)修复序列

目前,没有 easy 方法来更改Oracle dspace数据库中的序列。我找到的最简单的方法是删除序列并从正确的起点再次创建它。

首先我们放弃它:

create sequence metadatavalue_seq start with 475;

然后我们重新创建它:

{{1}}。

基本上就是这样。我添加了oracle部分以防万一有人遇到类似的错误,但是正在使用oracle数据库。