【问题标题】:duplicate key in a PostgreSQL indexPostgreSQL 索引中的重复键
【发布时间】:2021-01-21 05:22:53
【问题描述】:

我想将我的 OwnCloud 数据库移动到新服务器,但在恢复过程中操作失败。

pg_restore: [archive program (db)] COPY failed for table "oc_storages": ERROR: value of a duplicate key breaks unique constraint "storages_id_index"
DETAIL: The key "(id) = (local :: / var / www / owncloud_data /)" already exists.

确实,对 oc_sorages 数据库的简单查询表明存在重复。

ocl=# select  * from oc_storages where id ~* 'owncloud_data';
               id               | numeric_id | available | last_checked 
--------------------------------+------------+-----------+--------------
 local::/var/www/owncloud_data/ |        491 |         1 |             
 local::/var/www/owncloud_data/ |        838 |         1 |             
(2 rows)

但与此同时,postgresql 设法根据 id (storages_id_index) 为该表创建索引。 PostgreSQL 怎么可能接受这个表中的这个重复项?

ocl=# SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'oc_storages';
     indexname     |                                      indexdef                                       
-------------------+-------------------------------------------------------------------------------------
 oc_storages_pkey  | CREATE UNIQUE INDEX oc_storages_pkey ON public.oc_storages USING btree (numeric_id)
 storages_id_index | CREATE UNIQUE INDEX storages_id_index ON public.oc_storages USING btree (id)
(2 rows)

如何摆脱这种僵局:删除两个值之一?哪个?

提前致谢。

欧内斯特。

【问题讨论】:

  • 你在做什么?恢复到新分配的数据库? -> 检查编码/排序规则。
  • 你试过Reindex在表/indexes上吗?

标签: postgresql indexing unique


【解决方案1】:

对此通常有两种解释:

  • 导致数据损坏的硬件问题。然后手动删除冲突行,导出数据库并将其导入新创建的集群,以消除潜在的潜在数据损坏。

  • 您升级了操作系统上的 C 库,并且排序规则发生了变化,从而损坏了索引。然后手动删除冲突的行和REINDEX 带有字符串列的索引。

【讨论】:

  • 问题发生在我的 Owncloud 10.0.3 和 posgresql 9.4 实例上。我任意删除了其中一个副本,一切正常。谢谢!
  • PostgreSQL 9.4,可能在旧系统上......我并不感到惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2015-10-01
  • 2018-11-01
相关资源
最近更新 更多