我在g86(Ubuntu 4.8.2-16ubuntu6)4.8.2,64位
我已经面临这个错误很多天了,我认为我通过创建一个脚本来检查数据库表中的所有字段,然后将字段中的损坏列更新为null来找到解决方案。
它工作正常一段时间,直到我找到了。
我发现一个损坏的字段然后我的脚本将损坏的列更新为null,然后我得到了这个。
# 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';
我还选择了所有列名加系统列,它仍然没有出现任何错误。只有当我从损坏字段的表中选择*时才会出现错误。
所以,任何想法为什么会这样?
Postgresql是否有任何隐藏列比ctid,cmax,xmax,cmin,xmin,tableoid,oid更多?
*使用SELECT *和SELECT all,columns,name,in,table(表格中的所有列名称)之间是否有任何区别?*
答案 0 :(得分:0)
来自文档:
PostgreSQL使用固定页面大小(通常为8 kB),并且不允许元组跨越多个页面。因此,不可能直接存储非常大的字段值。为了克服这种限制,将大字段值压缩和/或分解成多个物理行。这对用户来说是透明的,对大多数后端代码只有很小的影响。该技术被亲切地称为TOAST(或“切片面包以来最好的东西”)。
这意味着您有一个存储在记录页面之外的大字段,并且该字段的某些数据已损坏。
您在第二个查询中选择的字段子集不包含损坏的字段。