missing chunk number 0 for toast value 3225264 in pg_toast_1582256
参考:https://blog.csdn.net/qq_36439930/article/details/87257276/
问题原因:某张表关联的toast表的data发生损坏。
解决方案:
toast是The OverSized Attribute Storage Technique(超尺寸字段存储技术)的缩写,是超长字段在HighgoDB的一种存储方式。当某表中的超长字段的时候,那这个表会有与之相关联的Toast表。根据toast表的命名规则,假设存在表test的oid为2867,那么如果存在与之相关联的toast表,toast表名为pg_toast_2867。(这个要看你报错的表名是2619还是其他的 什么 我出的就是2619,在客户端连服务器时候报的)
再总结一下,有3种情况:
1、pg_statistic 损坏,这里面应该是柱状图或者mcv的结果太大了导致的。重建这个表应该能解决。
1)通过toast的表名pg_toast_2619查询出哪张表出现了问题:
select 2619::regclass;
REINDEX table pg_toast.pg_toast_2619;
REINDEX table pg_statistic;
VACUUM ANALYZE pg_statistic;
2、表数据的toast值有损坏,就需要通过一条一条遍历的方式找到有问题的行,进行删除或者修复。
我再删除完后 继续select * from club 仍然报上面的错误, 然后索引重建了也不行,但是select * from club limit xxx 没问题,于是先将所有的clubid 查询出来放在文档里面,用二分法select * from club limit xxx,找到有问题的那一条club数据,看club表里面的字段,看看哪个可能是会很长的,我找到后处理了下 然后问题解决了
DO $$
declare
v_rec record;
BEGIN
for v_rec in SELECT * FROM test loop
raise notice 'Parameter is: %', v_rec.ctid;
raise notice 'Parameter is: %', v_rec;
end loop;
END;
$$
LANGUAGE plpgsql;
NOTICE: 00000: Parameter is: (46,9)
ERROR: XX000: missing chunk number 0 for toast value 30982 in pg_toast_2619
CONTEXT: PL/pgSQL function inline_code_block line 7 at RAISE
delete from pg_statistic where ctid ='(46,9)';
3、业务表中大对象频繁删除、更新、插入,导致pg_toast中的表在查询的时候,其实已经被删除了,就报错,目前还在想办法解决: