客戶端連接數據庫報錯:ERROR: XX000: missing chunk number x for toast value x in pg_toast_x

1、問題描述

使用客戶端工具連接某數據庫的表時,出現如下所示報錯:

ERROR: XX000:missing chunk number 0 for toast value 30982 in pg_toast_2619

2、問題原因

某張表關聯的toast表的data發(fā)生損壞。

3、解決方案

toast是The OverSized Attribute Storage Technique(超尺寸字段存儲技術)的縮寫,是超長字段在HighgoDB的一種存儲方式。當某表中的超長字段的時候,那這個表會有與之相關聯的Toast表。根據toast表的命名規(guī)則,假設存在表test的oid為2867,那么如果存在與之相關聯的toast表,toast表名為pg_toast_2867。

(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 | 2619 | 2840
(1 row)

(2) 找到該表后做一下簡單的修復:

REINDEX table pg_toast.pg_toast_2619;
REINDEX table pg_statistic;
VACUUM ANALYZE pg_statistic;

(3) 定位該表中損壞的數據行。

執(zhí)行如下函數:

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) 重復執(zhí)行第3,4步,直到全部有問題的記錄被清除。

(6) 完成以上步驟后對該表進行一次完整的維護或者索引重建。