Unique constraint violation in Postgres due to OS upgrade

Platform Notice: Data Center Only - This article only applies to Atlassian products on the Data Center platform.

Note that this KB was created for the Data Center version of the product. Data Center KBs for non-Data-Center-specific features may also work for Server versions of the product, however they have not been tested. 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.

*Except Fisheye and Crucible

Summary

Upgrading glibc to >= 2.28 allows unique constraint violation in Postgres , as the sorting order changes for most of the collations. This may lead to database inconsistency.

Environment

  1. The Glibc library version 2.28 has been released on a majority of Linux systems:

    • Redhat 8 (released May 7th, 2019)

    • Debian 10 (July 6th, 2019)

    • Fedora 29 (October 30, 2018)

    • and others

  2. Postgres

Diagnosis

After an upgrade from Debian Stretch (PostgreSQL 9.6) to Debian Buster (PostgreSQL 11) there were duplicated data in the database table with unique constraint applied. The data looked like this:

bitbucket=# select * from repository where project_id=146;

Output

id

slug

name

state

project_id

scm_id

hierarchy_id

is_forkable

is_public

store_id

description

793

text-rnn

text-rnn

1

146

git

695abfc80b2e075ae7ad

t

t

812

ink_data

ink_data

1

146

git

2f40bb01986ce5bc3b63

t

f

829

ink_data

ink_data

1

146

git

cb51bbad5d4d26bb9ce9

t

f

ids 812 and 829 have exactly the same slug and project_id . But it shouldn’t be possible if the unique constraint (CONSTRAINT uk_slug_project_id UNIQUE (slug, project_id)) is applied to that table.

Cause

Glibc 2.28 breaks collation for PostgreSQL (and others?)

Solution

  1. If there is an upgrade of the OS, and a glibc upgrade is also involved, make sure the indexes are rebuilt before the application is started. The rebuilding of all the indexes will prevent the issue from happening.

  2. If the upgrade was performed by restoring the application database into an upgraded operating system, the indexes should be recalculated automatically if pg_restore was used.

  3. If the collation is set to ISO C and POSIX, the upgrade doesn’t break the ordering.

  4. In case duplication is observed, follow the steps in How to fix duplicate entries in Bitbucket PostgreSQL database to resolve the duplicates.

Updated on June 27, 2025

Still need help?

The Atlassian Community is here for you.