gpt4 book ai didi

sql - postgresql 中缺少 block 号 0 的错误,我已经弄清楚哪个字段已损坏

转载 作者:行者123 更新时间:2023-11-29 13:59:20 26 4
gpt4 key购买 nike

我在 x86_64-unknown-linux-gnu 上使用 PostgreSQL 9.1.13,由 gcc (Ubuntu 4.8.2-16ubuntu6) 4.8.2,64 位编译

我已经遇到这个错误很多天了,我认为我找到了一个解决方案,方法是创建一个脚本来检查我的数据库表中的所有字段,然后将该字段中损坏的列更新为空。

在我找到这个之前它工作了一段时间。

我发现了一个损坏的字段,然后我的脚本将损坏的列更新为空,然后我得到了这个。

# select * from comment where id = 7228707;
>> ERROR: missing chunk number 0 for toast value 149171568 in pg_toast_8070962

但是,同时我可以按所有表列进行选择并且没有错误。

# select id,comment,and,all,column,in,my,table from comment where id = 7228707;

为了确保我选择了所有表格列,我也这样做了

# SELECT string_agg(column_name, ', ') FROM information_schema.columns WHERE table_name ='comment' and table_schema='a1';

我也选择了所有列名加上系统列,它仍然没有出现任何错误。仅当我从损坏字段的表中选择 * 时才出现错误。

那么,知道为什么会这样吗?

除了 ctid,cmax,xmax,cmin,xmin,tableoid,oid 之外,Postgresql 是否还有隐藏列?

*使用 SELECT * 和 SELECT all,columns,name,in,the,table(表中的所有列名)有什么区别吗?*

最佳答案

来自文档:

PostgreSQL uses a fixed page size (commonly 8 kB), and does not allow tuples to span multiple pages. Therefore, it is not possible to store very large field values directly. To overcome this limitation, large field values are compressed and/or broken up into multiple physical rows. This happens transparently to the user, with only small impact on most of the backend code. The technique is affectionately known as TOAST (or "the best thing since sliced bread").

这意味着您有一个大字段存储在记录页面之外,并且该字段的某些数据已损坏。

您在第二个查询中选择的字段子集不包含损坏的字段。

关于sql - postgresql 中缺少 block 号 0 的错误,我已经弄清楚哪个字段已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24422073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com