我们运行的是PostgreSQL 9.1.20,数据库大约为 50GB。
- 一切正常。
- 几天后,奇怪的意外值出现在数字列中,例如意外位置出现负值或更大的值。
- 奇怪的部分:如果我们运行一个
pg_dump
相同的“损坏”数据库,然后恢复它(在同一台服务器上),数据就会变得一切正常。现在相同的查询返回不同的值!
为什么当我们完全从“损坏的”数据库中获取转储时,数据库转储具有不同的值?(转储已经纠正了我们认为的值!)
这可能与某种交易中断或硬盘故障有关吗?请注意,重新启动数据库并不能解决问题。
这个问题背后的原因是什么?
根据评论中的要求,一些数据示例:
#psql
\c base
select * from salXXXX where sal_id=2323;
sal_id | sal_XXXX | XXXXXX | XXXXXX | XXXXX | XXXXX | XXXXX
--------+-----------+---------------+--------------------+------------+-----------------------+------------
2323 | -30.43 | 42586501 | 6 | 13 | f |
\quit
pg_dump -h 127.0.0.1 -p 5432 --user=postgres >backup.sql
psql
drop database base;
create database base;
\c base
\i backup.sql
(no errors found here)
select * from salXXXX where sal_id=2323;
sal_id | sal_XXXX | XXXXXX | XXXXXX | XXXXX | XXXXX | XXXXX
--------+-----------+---------------+--------------------+------------+-----------------------+------------
2323 | 245.43 | 42586501 | 6 | 13 | f |
很难模仿它,很少发生,但当它发生时我们只是做一个转储,这是一个荒谬的解决方案,但它有效。
这只是一个例子,更多的错误值开始出现,即使我们重新处理数据。但是如果数据库被转储和恢复,值又在预期的范围内。
可能是索引损坏- 假设您在
sal_id
.如果是这样,
REINDEX TABLE salXXXX;
(或者只是REINDEX INDEX index_name
会做与转储/恢复周期相同的技巧,它也会从头开始重新创建所有索引。手册建议:
通常,考虑升级到当前版本的 Postgres。9.1 版在 2016 年 9 月刚刚结束。此后有许多相关更新,可能会很好地解决这个问题。