错误丢失postgresql中的块号0,我已经弄清楚哪个字段已损坏

时间:2014-06-26 03:50:14

标签: sql database postgresql

我在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(表格中的所有列名称)之间是否有任何区别?*

1 个答案:

答案 0 :(得分:0)

来自文档:

  

PostgreSQL使用固定页面大小(通常为8 kB),并且不允许元组跨越多个页面。因此,不可能直接存储非常大的字段值。为了克服这种限制,将大字段值压缩和/或分解成多个物理行。这对用户来说是透明的,对大多数后端代码只有很小的影响。该技术被亲切地称为TOAST(或“切片面包以来最好的东西”)。

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

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