postgresql-9.4.1索引文件丢失,应该是一个小BUG。具体模拟重现,看代码:
1、创建一个新的表空间:
postgres=# CREATE TABLESPACE mytbs LOCATION '/data/pg94/mytbs'; CREATE TABLESPACE
2、创建表和索引,都放在pg_default表空间内
postgres=# create table t(id int, msg text); CREATE TABLE postgres=# create index idx_t_id on t(id); CREATE INDEX postgres=# insert into t values(1, 'a'), (2, 'b'); INSERT 0 2 postgres=# select * from t; id | msg ----+----- 1 | a 2 | b (2 rows)
3、设置默认表空间为mytbs,并变更ID字段类型
postgres=# set default_tablespace = 'mytbs'; SET postgres=# alter table t alter COLUMN id set data type int; ALTER TABLE postgres=# select * from t; ERROR: could not open file "pg_tblspc/16550/PG_9.4_201409291/13003/16564": 没有那个文件或目录 postgres=# select pg_relation_filepath('idx_t_id'); pg_relation_filepath ---------------------------------------------- pg_tblspc/16550/PG_9.4_201409291/13003/16564 (1 row)
查询报错,索引文件丢失。
原因分析:因为ID字段上有索引,而变更ID字段类型需要重建索引。此时默认表空间不是原来的表空间,数据字典中记录的新索引文件的目录在新的表空间中,而新的表空间中并没有创建索引文件。
算是PG9.4.1的一个BUG,应用时注意这种情况发生。解决方法:
postgres=# reindex index idx_t_id; REINDEX postgres=# select * from t; id | msg ----+----- 1 | a 2 | b (2 rows)