Error when starting or creating new content - ERROR: duplicate key value violates unique constraint "<tablename>_pkey"
プラットフォームについて: Server および Data Center のみ。この記事は、Server および Data Center プラットフォームのアトラシアン製品にのみ適用されます。
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Fisheye および Crucible は除く
症状
You cannot start Confluence or create content, or perform another function. This can occur after an upgrade or randomly while the system is in use.
Some variation on the following appears in the atlassian-confluence.log
:
2011-07-21 11:58:11,153 ERROR [http-8080-3] [atlassian.confluence.servlet.ConfluenceServletDispatcher] sendError Could not execute action
-- referer: http://instance | url: /json/addlabelactivity.action | userName: admin
org.springframework.dao.DataIntegrityViolationException: Hibernate operation: could not insert: [bucket.search.persistence.IndexQueueEntry#26083335]; SQL []; ERROR: duplicate key value violates unique constraint "indexqueueentries_pkey"; nested exception is org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "indexqueueentries_pkey"
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "indexqueueentries_pkey"
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
...
-- referer: https://confluence.mycompany.com.au/display/cspub/Page+Name | url: /pages/copypage.action | userName: userx | action: copypage
2015-09-02 21:47:44,468 ERROR [http-nio-443-exec-5] [sf.hibernate.util.JDBCExceptionReporter] logExceptions Violation of PRIMARY KEY constraint 'PK__CONTENT__1317CAA1114E8C1D'. Cannot insert duplicate key in object 'CONTENT'. The duplicate key value is (9469953).
Cause and Diagnosis
This is caused by a problem with the hibernate_unique_key
. This value is used to determine the next block of unique id numbers to create in the database. Most of Confluence's tables use an id
number as the primary key, and that number is determined by using the value in the hibernate_unique_key
and applying a formula to it, and then incrementing it. This error can therefore occur for one of two reasons:
- There are two entries for the
hibernate_unique_key
- The
hibernate_unique_key
is set to a value that is too low
To determine which is these is at fault, run this query against the database;
select * from hibernate_unique_key;
There should be only one entry in this table, and the number must be higher than the highest id used in the database.
Please note, we would see 51 rows with single value in the database and that is fine, please follow the resolution only if you are seeing multiple values or non unique values
If neither of those cases apply, and the hibernate_unique_key
value seems fine, there's a similar problem that may produce this same behavior as well, due to a different root cause:
ソリューション
The resolution depends on the cause.
ソリューション 1
If there are two entries in hibernate_unique_key
, delete the lower number by issuing this command:
delete from hibernate_unique_key where next_hi = <the lower number>;
ソリューション 2
If there is only one entry, we need to make Confluence calculate the correct value and reset it. There are two way to do this. Please test this in a testing environment first.
- Go to General Configuration > Backup & Restore and make an XML backup with attachments.
- Copy the XML backup zip from
atlassian_home/temp
toatlassian_home/restore
- Go to General Configuration > Backup & Restore again, and scroll to the bottom
- Choose the XML backup zip file and click Restore
The result will be that Confluence will regenerate a valid next_hi
value.
または
- On the production instance, go to General Configuration > Backup & Restore and make an XML backup (no attachments.)
- Copy the XML backup zip from
atlassian_home/temp
toatlassian_home/restore
on a test instance - On the test instance, go to General Configuration > Backup & Restore, and scroll to the bottom
- Choose the XML backup zip file and click Restore
- Run
select * from hibernate_unique_key;
on the test instance database, and save thenext_hi
value - Shut down your production Confluence instance
- In your production database server, run
update hibernate_unique_key set next_hi = <value>;
where <value> is the value from the test database server - Confluence を再起動します。