我有一个 9.0.1 数据库,其中有两个损坏的表(一个表有 20 行,另一个有 140 行)。这些表对于读取/选择操作似乎很好,但更新表中的某些行会产生错误消息:
update media set updated_at = now() at time zone 'UTC';
错误:无法读取文件“base/16384/16485”中的块 2:仅读取 8192 个字节中的 0 个
update media_status set updated_at = now() at time zone 'UTC';
2011-04-14 00:15:15 UTC 错误:无法读取文件“base/16384/16543”中的块 3:只读 8192 个字节中的 0 个
2011-04-14 00:15:15 UTC 声明:更新 media_status 集updated_at = now() 在时区“UTC”;
检查文件系统(linux)中损坏的文件,它们不是零字节:ll base/16384/16485 -rwx------ 1 postgres postgres 16384 2011-04-07 09:43 base/16384/16485
我运行了“vacuum(FULL, VERBOSE)”命令,损坏(或至少更新时的错误)消失了。是否期望“vacuum(FULL)”命令会/可以修复表损坏?这是否为可能发生的事情提供了任何线索?
有没有办法确定这种腐败是如何/何时发生的?
我怀疑它可能发生在文件系统级备份期间(即 pg_start_backup()、tar -czf...、pg_stop_backup()),因为我执行了备份并将数据库移动到不同的系统。恢复文件并启动 postgres 后,我开始收到这些错误。我曾尝试使用相同的 tar 存档多次还原,结果相同(在不同的系统上)。
谢谢,丹