如何从表中删除不需要的重复行。这些重复行之所以“不需要”,是因为同一个值在指定为主键的列中出现多次。自从 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

最低0.47元/天 解锁文章
3408

被折叠的 条评论
为什么被折叠?



