pg_dump 和错误:toast 值缺少块号 0

Bru*_*uno 11 postgresql

我正在使用 PostgreSQL 8.4.15。在运行pg_dump备份数据库时,出现以下错误:

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)
Run Code Online (Sandbox Code Playgroud)

在搜索此错误消息时,我发现了一些建议重新索引表的参考文献(此处此处)。(在这些讨论中,有提到查询pg_class表以找到正确的pg_toast_XXXXXX值,但似乎是因为它没有显示在他们的错误消息中。我跳过了这部分,因为我在错误消息中显示了一个值。我想这可能是由于 PostgreSQL 的更高版本而带来的便利。)

我运行了以下内容:

REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;
Run Code Online (Sandbox Code Playgroud)

我现在可以毫无错误地使用了pg_dump

pg_toast这些命令实际上做了什么以及做了什么?这些仅仅是简单的清理还是他们可以删除该表中的某些行?首先可能是什么导致了这个问题?

该表中大约有 300000 行,但我预计自上次成功备份以来只有大约 250 行新行(该表仅用于 INSERT/SELECT,没有 UPDATE)。

Chr*_*ers 6

鉴于您所做的是重新索引,可能发生的情况是它使用索引扫描来尝试定位表中的 toasted 值,但找不到。这听起来像是一个损坏的索引。真空分析确实改变了表格,但重新索引不会改变,而且变化非常小。

考虑这个的方法是,TOASTed 属性实际上被分成大约 4k 大小的块,这些块存储在行中。它们在查询时被查找并与主行排序/重新连接。听起来这里使用的索引已损坏,因此重新索引解决了问题。

我发现损坏的索引通常表明服务器出现问题。检查并确保内存、CPU 和硬盘驱动器都正常并且没有报告问题是很好的。我发现过热的服务器特别容易导致索引损坏,如果索引可能损坏,人们必须担心数据也会损坏。