【PGCCC】Postgres 故障排除:修复重复的主键行

如何从表中删除不需要的重复行。这些重复行之所以“不需要”,是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后,我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时,这可能会导致无效索引。
唯一索引损坏的主要影响之一是允许添加本应由主键捕获的行。换句话说,对于一个在名为“id”的列上有主键的表,您可能会观察到如下情况:

-- Can you spot the problem?
SELECT id FROM mytable ORDER BY id LIMIT 5;
 id
----
  1
  2
  3
  3
  4
(5 rows)

在对问题一无所知的情况下,解决问题的第一步是什么?如果你说备份,那你答对了!每当你认为数据库有问题时,或者在尝试修复此类问题之前,都应该进行一次全新备份。
补充一下:我们可以简单地重新索引吗?不行——只要有重复的行,就无法创建(或重新创建)唯一索引。Postgres 会拒绝这样做,因为这违反了我们试图强制执行的唯一性。所以,我们必须从表中删除这些行。
这里有一个修复 Postgres 表中重复主键条目问题的巧妙方法。当然,你需要根据具体情况进行调整,但请慢慢操作,确保理解每个步骤。尤其是在生产环境中发生这种情况时(剧透:这种情况几乎总是在生产环境中发生)。

1. 调试辅助工具

我们要做的第一件事可能看起来有点奇怪:

-- Encourage not using indexes:
set enable_indexscan = 0;
set enable_bitmapscan = 0;
set enable_indexonlyscan = 0;

由于不良索引是此类不良行进入数据库的主要途径,因此我们不能信任它们。这些低级调试辅助工具会告诉 Postgres 规划器优先考虑其他数据获取方式。在我们的例子中,这意味着直接访问表,而不是在索引中查找

2. 进行快速健全性检查

-- Sanity check. This should return a number greater than 1. If not, stop.
set search_path = public
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值