调试postgres 9.0.1表损坏

时间:2011-04-14 01:49:40

标签: linux postgresql vacuum

我有一个带有两个损坏表的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 ERROR:无法读取文件“base / 16384/16543”中的块3:只读8192字节中的0 2011-04-14 00:15:15 UTC声明:在时区'UTC'更新media_status set updated_at = now();

检查文件系统(linux)中的损坏文件,它们不是零字节: ll base / 16384/16485 -rwx ------ 1 postgres postgres 16384 2011-04-07 09:43 base / 16384/16485

我运行了“vacuum(FULL,VERBOSE)”命令,并且损坏(或至少更新时的错误)已经消失。预计“真空(全部)”命令会/可以修复表损坏吗?这是否提供了可能发生的任何线索?

有没有办法确定这种腐败可能发生的时间/时间?

我怀疑它可能是在文件系统级备份期间发生的(即pg_start_backup(),tar -czf ...,pg_stop_backup()),因为我执行了备份并将数据库移动到另一个系统。恢复文件并开始postgres后,我开始收到这些错误。我尝试使用相同的tar存档多次恢复相同的结果(在不同的系统上)。

谢谢, 丹

1 个答案:

答案 0 :(得分:1)

很难对这种情况做出明确的陈述,但我会调查存储层。像错误消息这样的简短读取通常表示“无法在本地,通常连接的存储上发生”。因此,如果您有SAN,NAS,NFS,一些非常重要的RAID配置或其他感兴趣的内容,请检查那里的日志或错误计数器。

如果文件存在,那么这意味着它不是PostgreSQL中的损坏。

尝试有趣的事情,但现在可能为时已晚,是尝试手动阅读文件,看看会发生什么。

VACUUM FULL修复它的事实可能只是因为它将表完全重写为新文件,所以无论是什么导致旧文件的hickup都消失了。