pg_dump和错误:吐司值缺少块编号0


10

我正在使用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 ...)

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

我执行以下操作:

REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;

我现在可以正确使用pg_dump

什么是pg_toast什么也这个命令的作用呢?这些仅仅是为了简单清理,还是可以摆脱该表中的某些行?首先是什么引起了该问题?

该表中大约有300000行,但是我希望自从上一次成功备份以来,大约只有250个新行(此表仅用于INSERT / SELECT,没有UPDATE)。


我发现了这个主意。您能检查您的情况是否相同吗?
dezso 2012年

Answers:


6

鉴于您所做的是重新索引,可能发生的事情是它使用索引扫描尝试在表中找到烘烤的值,但找不到一个。这听起来像是损坏的索引。真空分析确实会更改表,但重新索引不会更改,并且更改很小。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.