【发布时间】:2011-04-14 01:49:40
【问题描述】:
我有一个 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 声明:在时区“UTC”更新 media_status 设置 updated_at = now();
检查文件系统 (linux) 中损坏的文件,它们不是零字节: ll 基地/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 存档多次还原,但结果相同(在不同的系统上)。
谢谢, 丹
【问题讨论】:
标签: linux postgresql vacuum