其中蓝色字体是我自己加的 黑色字体是我参考的帖子内容(因为还需要注册比较麻烦 我就把帖子内容拿出来了)
项目反馈玩家不能登录游戏,然后查询了下是玩家登录获取公会信息时候select * from club xxxxxx的时候报的这个错误,在网上查到了一篇解决方案
问题原因:某张表关联的toast表的data发生损坏。
解决方案:
toast是The OverSized Attribute Storage Technique(超尺寸字段存储技术)的缩写,是超长字段在HighgoDB的一种存储方式。当某表中的超长字段的时候,那这个表会有与之相关联的Toast表。根据toast表的命名规则,假设存在表test的oid为2867,那么如果存在与之相关联的toast表,toast表名为pg_toast_2867。(这个要看你报错的表名是2619还是其他的 什么 我出的就是2619,在客户端连服务器时候报的)
1)通过toast的表名pg_toast_2619查询出哪张表出现了问题:
highgo=# select 2619::regclass; regclass -------------- pg_statistic (1 row)
highgo=# select relname,relfilenode,reltoastrelid from pg_class where relname='pg_statistic'; relname | relfilenode | reltoastrelid --------------+-------------+--------------- pg_statistic | 13241 | 2840 (1 row) |
2) 找到该表后做一下简单的修复:
REINDEX table pg_toast.pg_toast_2619; REINDEX table pg_statistic; VACUUM ANALYZE pg_statistic; |
3) 定位该表中损坏的数据行。
执行如下函数:
DO $$ declare v_rec record; BEGIN for v_rec in SELECT * FROM pg_statistic 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 |
4) 将第3步中定位的记录删除:
delete from pg_statistic where ctid ='(46,9)'; |
5) 重复执行第3,4步,直到全部有问题的记录被清除。
6) 完成以上步骤后对该表进行一次完整的维护或者索引重建。
我再删除完后 继续select * from club 仍然报上面的错误, 然后索引重建了也不行,但是select * from club limit xxx 没问题,于是先将所有的clubid 查询出来放在文档里面,用二分法select * from club limit xxx,找到有问题的那一条club数据,看club表里面的字段,看看哪个可能是会很长的,我找到后处理了下 然后问题解决了
参考 https://blog.csdn.net/pg_hgdb/article/details/85043756