我在执行元数据导入时遇到内部系统错误。现在,即使我无法创建新集合或编辑现有项目。
请查看错误日志: 第一个错误
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)
答案 0 :(得分:1)
错误是因为您违反了对表格设置的限制。每个条目都需要一个唯一的密钥,似乎不再是这种情况了。密钥由序列生成,因此,如果您可以访问数据库,则可以重置序列并解决问题。
您可以采取一些步骤来解决此问题。我假设这是实际错误,你没有任何奇怪的修改打破这个。但是,你很快就会发现,如果这并没有解决你的问题,那么就会以糟糕的方式搞乱数据库。
这两个错误都有这个起源。下面我将介绍如何解决它们。 update-sequences.sql脚本应该通过一次运行来修复它们。手动方式将要求您执行两次。一次用于metadatavalue
表,一次用于webapp
表。 (metadatavalue_seq
和webapp_seq
)。
在示例中,我只使用了metadatavalue
表。
我可以通过两种方式思考,第一种方法是运行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;
; - )
首先,连接数据库。您可以使用 pgAdmin 或仅使用命令行 psql 进行连接。
metadatavalue_seq
这将返回表中的最高ID。让我们说它是475.只需在某处涂抹它。
下一个案例我们要查看metadatavalue
,这是负责生成select last_value from metadatavalue_seq
表中使用的ID的序列。
postgres
。
现在看一下这会返回什么。如果这与您之前找到的ID匹配(在此示例中为475),那么序列实际上一切正常,您的错误来自其他地方。假设返回的ID低于475,例如301.现在,序列给出的下一个ID可能已被medatavalue表中的另一个条目使用,从而导致抛出异常。
我们可以手动将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数据库和postgres数据库是一样的,但是所需的命令略有不同。当它抛出错误消息时,Oracle似乎更加神秘,因此您会收到类似user_constraints
之类的错误。这意味着还有一个步骤可以确定错误的来源。
要找出实际违反的约束,您可以在select * from user_constraints where constraint_name = "SYS_c00654"
中查找约束。
metdatavalue
。
让我们想象这个约束告诉我们违反的约束与OP有关(select metadatavalue_id from metadatavalue order by metadatavalue_id desc;
表中的主键)。
这与我们为postgres所做的相同,我们将检查表中的最高ID。该部分的查询实际上看起来是一样的。
select metadatavalue_seq.nextval from dual;
。
再次想象一下,这会返回475.
对于拥有postgres数据库的人来说,这部分略有不同。要检查序列中的最后一个值,我们可以运行。
drop sequence metadatavalue_seq;
。
同样,我们想象这会返回301.
目前,没有 easy 方法来更改Oracle dspace数据库中的序列。我找到的最简单的方法是删除序列并从正确的起点再次创建它。
首先我们放弃它:
create sequence metadatavalue_seq start with 475;
然后我们重新创建它:
{{1}}。
基本上就是这样。我添加了oracle部分以防万一有人遇到类似的错误,但是正在使用oracle数据库。